aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2018-03-09 13:29:39 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2018-03-09 13:29:39 +0000
commit20003c3cc31bf4ef40a0e03b4f237698e3e1b0ec (patch)
tree4c0479fbf827cfa5555c085313420f1d53b9511d
parenta4c6bd0821099f6b8c0f64a96ffd9d01a025c413 (diff)
downloadgcc-20003c3cc31bf4ef40a0e03b4f237698e3e1b0ec.zip
gcc-20003c3cc31bf4ef40a0e03b4f237698e3e1b0ec.tar.gz
gcc-20003c3cc31bf4ef40a0e03b4f237698e3e1b0ec.tar.bz2
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 <rguenther@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. From-SVN: r258387
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr84775.c18
-rw-r--r--gcc/tree-if-conv.c24
4 files changed, 52 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 69b7def..5b2f59b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,17 @@
+2018-03-09 Richard Biener <rguenther@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.
+
2018-03-09 Eric Botcazou <ebotcazou@adacore.com>
PR target/84763
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index aadf998..de8b13f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-03-09 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/84775
+ * gcc.dg/torture/pr84775.c: New testcase.
+
2018-03-09 Jakub Jelinek <jakub@redhat.com>
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 0000000..bb9466b
--- /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 59a0f1c..c68a0c7 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. */