aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vrp.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r--gcc/tree-vrp.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 79bf09a9df8..4033c9c7e0e 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -717,6 +717,23 @@ get_value_range (const_tree var)
return vr;
}
+/* Set value-ranges of all SSA names defined by STMT to varying. */
+
+static void
+set_defs_to_varying (gimple *stmt)
+{
+ ssa_op_iter i;
+ tree def;
+ FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_DEF)
+ {
+ value_range *vr = get_value_range (def);
+ /* Avoid writing to vr_const_varying get_value_range may return. */
+ if (vr->type != VR_VARYING)
+ set_value_range_to_varying (vr);
+ }
+}
+
+
/* Return true, if VAL1 and VAL2 are equal values for VRP purposes. */
static inline bool
@@ -7007,10 +7024,7 @@ vrp_initialize (void)
prop_set_simulate_again (stmt, true);
else if (!stmt_interesting_for_vrp (stmt))
{
- ssa_op_iter i;
- tree def;
- FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_DEF)
- set_value_range_to_varying (get_value_range (def));
+ set_defs_to_varying (stmt);
prop_set_simulate_again (stmt, false);
}
else
@@ -7957,9 +7971,6 @@ vrp_visit_switch_stmt (gswitch *stmt, edge *taken_edge_p)
static enum ssa_prop_result
vrp_visit_stmt (gimple *stmt, edge *taken_edge_p, tree *output_p)
{
- tree def;
- ssa_op_iter iter;
-
if (dump_file && (dump_flags & TDF_DETAILS))
{
fprintf (dump_file, "\nVisiting statement:\n");
@@ -7977,8 +7988,7 @@ vrp_visit_stmt (gimple *stmt, edge *taken_edge_p, tree *output_p)
/* All other statements produce nothing of interest for VRP, so mark
their outputs varying and prevent further simulation. */
- FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
- set_value_range_to_varying (get_value_range (def));
+ set_defs_to_varying (stmt);
return SSA_PROP_VARYING;
}
@@ -8582,7 +8592,10 @@ vrp_intersect_ranges_1 (value_range *vr0, value_range *vr1)
if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
bitmap_ior_into (vr0->equiv, vr1->equiv);
else if (vr1->equiv && !vr0->equiv)
- bitmap_copy (vr0->equiv, vr1->equiv);
+ {
+ vr0->equiv = BITMAP_ALLOC (NULL);
+ bitmap_copy (vr0->equiv, vr1->equiv);
+ }
}
static void