@@ -1923,12 +1923,11 @@ optimize_stmt (basic_block bb, gimple_st
{
tree val = NULL;
- update_stmt_if_modified (stmt);
-
if (gimple_code (stmt) == GIMPLE_COND)
val = fold_binary_loc (gimple_location (stmt),
- gimple_cond_code (stmt), boolean_type_node,
- gimple_cond_lhs (stmt), gimple_cond_rhs (stmt));
+ gimple_cond_code (stmt), boolean_type_node,
+ gimple_cond_lhs (stmt),
+ gimple_cond_rhs (stmt));
else if (gswitch *swtch_stmt = dyn_cast <gswitch *> (stmt))
val = gimple_switch_index (swtch_stmt);
@@ -1946,6 +1945,8 @@ optimize_stmt (basic_block bb, gimple_st
gimple_cond_make_true (as_a <gcond *> (stmt));
else
gcc_unreachable ();
+
+ gimple_set_modified (stmt, true);
}
/* Further simplifications may be possible. */
@@ -1953,6 +1954,8 @@ optimize_stmt (basic_block bb, gimple_st
}
}
+ update_stmt_if_modified (stmt);
+
/* If we simplified a statement in such a way as to be shown that it
cannot trap, update the eh information and the cfg to match. */
if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt))
@@ -0,0 +1,28 @@
+/* PR tree-optimization/77454 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+void
+foo (unsigned char x, char y)
+{
+ while (x != 0)
+ {
+ unsigned char *a = &x;
+ int b;
+
+ if (y != 0)
+ a = (unsigned char *) &y;
+ else if (y + 1 != 0)
+ a = (unsigned char *) &y;
+ for (x = 0; x < 1; ++x)
+ b = 0;
+ for (y = 0; y < 3; ++y)
+ {
+ y = !!y;
+ if (y != 0)
+ x = y;
+ }
+ if ((b != 0 ? -1 : *a) < (y = b))
+ b = 1;
+ }
+}
On Tue, Sep 13, 2016 at 04:02:17PM +0200, Richard Biener wrote: > Yes please, this should be safe. All of the above do not look at immediate uses but at most use-def links. Ok, here is what I've committed after another bootstrap/regtest: 2016-09-13 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/77454 * tree-ssa-dom.c (optimize_stmt): Set modified flag on stmt after changing GIMPLE_COND. Move update_stmt_if_modified call after this. Formatting fix. * gcc.dg/pr77454.c: New test. Jakub