/* Support routines for Value Range Propagation (VRP).
- Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
Contributed by Diego Novillo <dnovillo@redhat.com>.
This file is part of GCC.
static bool
vrp_expr_computes_nonnegative (tree expr, bool *strict_overflow_p)
{
- return tree_expr_nonnegative_warnv_p (expr, strict_overflow_p);
+ return (tree_expr_nonnegative_warnv_p (expr, strict_overflow_p)
+ || (TREE_CODE (expr) == SSA_NAME
+ && ssa_name_nonnegative_p (expr)));
}
/* Like tree_expr_nonzero_warnv_p, but this function uses value ranges
static bool
vrp_expr_computes_nonzero (tree expr, bool *strict_overflow_p)
{
- if (tree_expr_nonzero_warnv_p (expr, strict_overflow_p))
+ if (tree_expr_nonzero_warnv_p (expr, strict_overflow_p)
+ || (TREE_CODE (expr) == SSA_NAME
+ && ssa_name_nonzero_p (expr)))
return true;
/* If we have an expression of the form &X->a, then the expression
3a. If the high limit of the VR_ANTI_RANGE resides
within the VR_RANGE, then the result is a new
VR_RANGE starting at the high limit of the
- the VR_ANTI_RANGE + 1 and extending to the
+ VR_ANTI_RANGE + 1 and extending to the
high limit of the original VR_RANGE.
3b. If the low limit of the VR_ANTI_RANGE resides
if (vr->type == VR_ANTI_RANGE)
return;
- /* Ensure that there are not values in the scev cache based on assumptions
- on ranges of ssa names that were changed
- (in set_value_range/set_value_range_to_varying). Preserve cached numbers
- of iterations, that were computed before the start of VRP (we do not
- recompute these each time to save the compile time). */
- scev_reset_except_niters ();
-
chrec = instantiate_parameters (loop, analyze_scalar_evolution (loop, var));
/* Like in PR19590, scev can return a constant function. */
if (update_edges_p)
bsi_commit_edge_inserts ();
- if (dump_file && (dump_flags & TDF_STATS))
- fprintf (dump_file, "\nNumber of ASSERT_EXPR expressions inserted: %d\n\n",
- num_asserts);
+ statistics_counter_event (cfun, "Number of ASSERT_EXPR expressions inserted",
+ num_asserts);
}
}
/* Blocks which have more than one predecessor and more than
- one successor present jump threading opportunities. ie,
+ one successor present jump threading opportunities, i.e.,
when the block is reached from a specific predecessor, we
may be able to determine which of the outgoing edges will
be traversed. When this optimization applies, we are able
vr_phi_edge_counts = NULL;
}
-/* Calculates number of iterations for all loops, to ensure that they are
- cached. */
-
-static void
-record_numbers_of_iterations (void)
-{
- loop_iterator li;
- struct loop *loop;
-
- FOR_EACH_LOOP (li, loop, 0)
- {
- number_of_latch_executions (loop);
- }
-}
/* Main entry point to VRP (Value Range Propagation). This pass is
loosely based on J. R. C. Patterson, ``Accurate Static Branch
insert_range_assertions ();
- /* Compute the # of iterations for each loop before we start the VRP
- analysis. The value ranges determined by VRP are used in expression
- simplification, that is also used by the # of iterations analysis.
- However, in the middle of the VRP analysis, the value ranges do not take
- all the possible paths in CFG into account, so they do not have to be
- correct, and the # of iterations analysis can obtain wrong results.
- This is a problem, since the results of the # of iterations analysis
- are cached, so these mistakes would not be corrected when the value
- ranges are corrected. */
- record_numbers_of_iterations ();
-
to_remove_edges = VEC_alloc (edge, heap, 10);
to_update_switch_stmts = VEC_alloc (switch_update, heap, 5);