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 <ja...@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. --- gcc/tree-ssa-dom.c.jj 2016-04-28 17:26:05.428203966 +0200 +++ gcc/tree-ssa-dom.c 2016-09-13 16:25:34.194491591 +0200 @@ -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)) --- gcc/testsuite/gcc.dg/pr77454.c.jj 2016-09-13 16:24:53.662977245 +0200 +++ gcc/testsuite/gcc.dg/pr77454.c 2016-09-13 16:24:53.662977245 +0200 @@ -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; + } +} Jakub