From 7fea20f6b8dc2cd598502145ce7ec93091b1bb44 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Thu, 8 Mar 2018 12:56:40 +0000 Subject: [PATCH] re PR tree-optimization/84178 (ICE in release_bb_predicate) 2018-03-08 Richard Biener 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/pr84178-2.c: New testcase. From-SVN: r258364 --- gcc/ChangeLog | 9 +++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr84178-2.c | 20 ++++++++++++++++++++ gcc/tree-if-conv.c | 11 +++++++++-- 4 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr84178-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e1c40c310a0..bfff935905f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2018-03-08 Richard Biener + + 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-08 David Malcolm PR tree-optimization/84178 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index eb8ade6cb68..3abed3cdbeb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-03-08 Richard Biener + + PR tree-optimization/84178 + * gcc.dg/torture/pr84178-2.c: New testcase. + 2018-03-08 David Malcolm PR tree-optimization/84178 diff --git a/gcc/testsuite/gcc.dg/torture/pr84178-2.c b/gcc/testsuite/gcc.dg/torture/pr84178-2.c new file mode 100644 index 00000000000..75f5b0ac702 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr84178-2.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-fno-tree-forwprop" } */ + +int zy, h4; + +void +r8 (long int mu, int *jr, int *fi, short int dv) +{ + do + { + int tx; + + tx = !!h4 ? (zy + h4) : 1; + mu = tx; + *jr = (((unsigned char) mu > (254 >> dv)) ? 0 : (unsigned char) tx) + *fi; + } while (*jr == 0); + + r8 (mu, jr, fi, 1); +} + diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c index 5467f3fa4e0..59a0f1c887d 100644 --- a/gcc/tree-if-conv.c +++ b/gcc/tree-if-conv.c @@ -2371,7 +2371,6 @@ 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) @@ -2593,7 +2592,6 @@ 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; } @@ -2811,6 +2809,7 @@ 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; @@ -2856,6 +2855,7 @@ 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,6 +2880,13 @@ 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