===================================================================
@@ -7092,15 +7092,15 @@ vrp_valueize_1 (tree name)
{
if (TREE_CODE (name) == SSA_NAME)
{
- value_range_t *vr = get_value_range (name);
- if (range_int_cst_singleton_p (vr))
- return vr->min;
/* If the definition may be simulated again we cannot follow
this SSA edge as the SSA propagator does not necessarily
re-visit the use. */
gimple def_stmt = SSA_NAME_DEF_STMT (name);
if (prop_simulate_again_p (def_stmt))
return NULL_TREE;
+ value_range_t *vr = get_value_range (name);
+ if (range_int_cst_singleton_p (vr))
+ return vr->min;
}
return name;
}
===================================================================
@@ -1141,15 +1141,15 @@ valueize_op_1 (tree op)
{
if (TREE_CODE (op) == SSA_NAME)
{
- tree tem = get_constant_value (op);
- if (tem)
- return tem;
/* If the definition may be simulated again we cannot follow
this SSA edge as the SSA propagator does not necessarily
re-visit the use. */
gimple def_stmt = SSA_NAME_DEF_STMT (op);
if (prop_simulate_again_p (def_stmt))
return NULL_TREE;
+ tree tem = get_constant_value (op);
+ if (tem)
+ return tem;
}
return op;
}
===================================================================
@@ -0,0 +1,44 @@
+/* { dg-do run } */
+
+struct S
+{
+ int f1;
+};
+
+static struct S a = { 1 };
+char b;
+static unsigned char *c = &b;
+int d, e, f;
+
+int
+fn1 (int p)
+{
+ return 0 ? 0 : p - 1;
+}
+
+static int
+fn2 (struct S p)
+{
+ int g = 200;
+ for (e = 4; e; e = fn1 (e))
+ {
+ for (; d; d++)
+ ;
+ *c &= p.f1 & g;
+ g = --*c;
+ if (f)
+ return 0;
+ }
+ return 0;
+}
+
+int
+main ()
+{
+ fn2 (a);
+
+ if (b != 0)
+ __builtin_abort ();
+
+ return 0;
+}