The following reverts the fix for PR84178 again and instead prunes those bogus immediate uses from stmts we didn't yet insert. Micha has sth in the works to clean up the mess somewhat in GCC 9.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied. Richard. 2018-03-09 Richard Biener <rguent...@suse.de> PR tree-optimization/84775 * tree-if-conv.c (add_bb_predicate_gimplified_stmts): Delink immediate uses of predicate stmts and mark them modified. Revert PR tree-optimization/84178 * tree-if-conv.c (combine_blocks): Move insert_gimplified_predicates to caller. (version_loop_for_if_conversion): Delay update_ssa call. (tree_if_conversion): Delay update_ssa until after predicate insertion. * gcc.dg/torture/pr84775.c: New testcase. Index: gcc/testsuite/gcc.dg/torture/pr84775.c =================================================================== --- gcc/testsuite/gcc.dg/torture/pr84775.c (nonexistent) +++ gcc/testsuite/gcc.dg/torture/pr84775.c (working copy) @@ -0,0 +1,18 @@ +/* { dg-do compile } */ + +int a, b, c, d, e, f; + +void fn1 () +{ + while (e) + for (f = 0; f < 4; f++) + { + int h[1]; + for (; c; c++) + if (a) + break; + d = a - 4; + if (d) + b = h[0]; + } +} Index: gcc/tree-if-conv.c =================================================================== --- gcc/tree-if-conv.c (revision 258380) +++ gcc/tree-if-conv.c (working copy) @@ -257,6 +257,19 @@ set_bb_predicate_gimplified_stmts (basic static inline void add_bb_predicate_gimplified_stmts (basic_block bb, gimple_seq stmts) { + /* We might have updated some stmts in STMTS via force_gimple_operand + calling fold_stmt and that producing multiple stmts. Delink immediate + uses so update_ssa after loop versioning doesn't get confused for + the not yet inserted predicates. + ??? This should go away once we reliably avoid updating stmts + not in any BB. */ + for (gimple_stmt_iterator gsi = gsi_start (stmts); + !gsi_end_p (gsi); gsi_next (&gsi)) + { + gimple *stmt = gsi_stmt (gsi); + delink_stmt_imm_use (stmt); + gimple_set_modified (stmt, true); + } gimple_seq_add_seq_without_update (&(((struct bb_predicate *) bb->aux)->predicate_gimplified_stmts), stmts); } @@ -2371,6 +2384,7 @@ combine_blocks (struct loop *loop) edge_iterator ei; remove_conditions_and_labels (loop); + insert_gimplified_predicates (loop); predicate_all_scalar_phis (loop); if (any_pred_load_store) @@ -2592,6 +2606,7 @@ version_loop_for_if_conversion (struct l gsi = gsi_last_bb (cond_bb); gimple_call_set_arg (g, 1, build_int_cst (integer_type_node, new_loop->num)); gsi_insert_before (&gsi, g, GSI_SAME_STMT); + update_ssa (TODO_update_ssa); return new_loop; } @@ -2809,7 +2824,6 @@ tree_if_conversion (struct loop *loop) unsigned int todo = 0; bool aggressive_if_conv; struct loop *rloop; - bool need_update_ssa = false; again: rloop = NULL; @@ -2855,7 +2869,6 @@ tree_if_conversion (struct loop *loop) struct loop *nloop = version_loop_for_if_conversion (vloop); if (nloop == NULL) goto cleanup; - need_update_ssa = true; if (vloop != loop) { /* If versionable_outer_loop_p decided to version the @@ -2880,13 +2893,6 @@ tree_if_conversion (struct loop *loop) } } - /* Due to hard to fix issues we end up with immediate uses recorded - for not yet inserted predicates which will confuse SSA update so - we delayed this from after versioning to after predicate insertion. */ - insert_gimplified_predicates (loop); - if (need_update_ssa) - update_ssa (TODO_update_ssa); - /* Now all statements are if-convertible. Combine all the basic blocks into one huge basic block doing the if-conversion on-the-fly. */