diff options
author | Richard Biener <rguenther@suse.de> | 2018-03-08 12:56:40 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2018-03-08 12:56:40 +0000 |
commit | 7fea20f6b8dc2cd598502145ce7ec93091b1bb44 (patch) | |
tree | fb0e9a872b6d71ff4e1c71dab8d6110ee999d392 /gcc/tree-if-conv.c | |
parent | 8b9a03d644fb55566180aeec291b64ca23f3c77b (diff) | |
download | gcc-7fea20f6b8dc2cd598502145ce7ec93091b1bb44.zip gcc-7fea20f6b8dc2cd598502145ce7ec93091b1bb44.tar.gz gcc-7fea20f6b8dc2cd598502145ce7ec93091b1bb44.tar.bz2 |
re PR tree-optimization/84178 (ICE in release_bb_predicate)
2018-03-08 Richard Biener <rguenther@suse.de>
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
Diffstat (limited to 'gcc/tree-if-conv.c')
-rw-r--r-- | gcc/tree-if-conv.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c index 5467f3f..59a0f1c 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. */ |