aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-if-conv.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2018-03-08 12:56:40 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2018-03-08 12:56:40 +0000
commit7fea20f6b8dc2cd598502145ce7ec93091b1bb44 (patch)
treefb0e9a872b6d71ff4e1c71dab8d6110ee999d392 /gcc/tree-if-conv.c
parent8b9a03d644fb55566180aeec291b64ca23f3c77b (diff)
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.c11
1 files changed, 9 insertions, 2 deletions
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. */