From 20003c3cc31bf4ef40a0e03b4f237698e3e1b0ec Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Fri, 9 Mar 2018 13:29:39 +0000 Subject: [PATCH] re PR tree-optimization/84775 (ICE on valid code at -O3: in check_loop_closed_ssa_def, at tree-ssa-loop-manip.c:709) 2018-03-09 Richard Biener 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. From-SVN: r258387 --- gcc/ChangeLog | 14 ++++++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr84775.c | 18 ++++++++++++++++++ gcc/tree-if-conv.c | 24 +++++++++++++++--------- 4 files changed, 52 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr84775.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 69b7def90bf..5b2f59bfd78 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2018-03-09 Richard Biener + + 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. + 2018-03-09 Eric Botcazou PR target/84763 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index aadf9988952..de8b13f6598 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-03-09 Richard Biener + + PR tree-optimization/84775 + * gcc.dg/torture/pr84775.c: New testcase. + 2018-03-09 Jakub Jelinek PR debug/84404 diff --git a/gcc/testsuite/gcc.dg/torture/pr84775.c b/gcc/testsuite/gcc.dg/torture/pr84775.c new file mode 100644 index 00000000000..bb9466b3e2b --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr84775.c @@ -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]; + } +} diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c index 59a0f1c887d..c68a0c72d98 100644 --- a/gcc/tree-if-conv.c +++ b/gcc/tree-if-conv.c @@ -257,6 +257,19 @@ set_bb_predicate_gimplified_stmts (basic_block bb, gimple_seq stmts) 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 loop *loop) 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. */ -- 2.30.2