aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2023-11-11 20:15:53 +0100
committerJakub Jelinek <jakub@redhat.com>2023-11-11 20:15:53 +0100
commit7610e5cc82bd6316cfe0bfee6d9f12d8c2cfa9c3 (patch)
tree7e67c3df9d1da88574de1fd486e4625a40dcfcb6
parentfc8458e20a524d053f576d64a606e21f8bd03b84 (diff)
downloadgcc-7610e5cc82bd6316cfe0bfee6d9f12d8c2cfa9c3.zip
gcc-7610e5cc82bd6316cfe0bfee6d9f12d8c2cfa9c3.tar.gz
gcc-7610e5cc82bd6316cfe0bfee6d9f12d8c2cfa9c3.tar.bz2
tree-ssa-math-opts: Fix up gsi_remove order in match_uaddc_usubc [PR112430]
The following testcase ICEs, because the temp_stmts were removed in wrong order, from the ones appearing earlier in the IL to the later ones, so insert_debug_temps_for_defs can reintroduce dead SSA_NAMEs back into the IL. The following patch fixes that by removing them in the order they were pushed into the vector, which is from later ones to earlier ones. Additionally, I've noticed I forgot to call release_defs on the removed stmts. 2023-11-11 Jakub Jelinek <jakub@redhat.com> PR middle-end/112430 * tree-ssa-math-opts.cc (match_uaddc_usubc): Remove temp_stmts in the order they were pushed rather than in reverse order. Call release_defs after gsi_remove. * gcc.dg/pr112430.c: New test.
-rw-r--r--gcc/testsuite/gcc.dg/pr112430.c30
-rw-r--r--gcc/tree-ssa-math-opts.cc8
2 files changed, 35 insertions, 3 deletions
diff --git a/gcc/testsuite/gcc.dg/pr112430.c b/gcc/testsuite/gcc.dg/pr112430.c
new file mode 100644
index 0000000..16c34fc
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr112430.c
@@ -0,0 +1,30 @@
+/* PR middle-end/112430 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -g" } */
+
+int a, b, c, d, e;
+unsigned int f;
+
+static void
+foo (unsigned int x)
+{
+ unsigned int g = x < c;
+ int h = f < b;
+ x += h;
+ g += x < h;
+ f = x;
+ x = g;
+ g = f += a;
+ h = f < a;
+ x += h;
+ c += f < d;
+ x += c;
+ g += x < c;
+ e = g;
+}
+
+void
+bar (unsigned int x)
+{
+ foo (x);
+}
diff --git a/gcc/tree-ssa-math-opts.cc b/gcc/tree-ssa-math-opts.cc
index 363f316..95eda43 100644
--- a/gcc/tree-ssa-math-opts.cc
+++ b/gcc/tree-ssa-math-opts.cc
@@ -5047,11 +5047,11 @@ match_uaddc_usubc (gimple_stmt_iterator *gsi, gimple *stmt, tree_code code)
gsi_insert_before (gsi, g, GSI_SAME_STMT);
/* Remove some further statements which can't be kept in the IL because
they can use SSA_NAMEs whose setter is going to be removed too. */
- while (temp_stmts.length ())
+ for (gimple *g2 : temp_stmts)
{
- g = temp_stmts.pop ();
- gsi2 = gsi_for_stmt (g);
+ gsi2 = gsi_for_stmt (g2);
gsi_remove (&gsi2, true);
+ release_defs (g2);
}
}
else
@@ -5068,10 +5068,12 @@ match_uaddc_usubc (gimple_stmt_iterator *gsi, gimple *stmt, tree_code code)
rhs1 = gimple_assign_rhs1 (g);
gsi2 = gsi_for_stmt (g);
gsi_remove (&gsi2, true);
+ release_defs (g);
}
gcc_checking_assert (rhs1 == gimple_assign_lhs (im2));
gsi2 = gsi_for_stmt (im2);
gsi_remove (&gsi2, true);
+ release_defs (im2);
/* Replace the re2 statement with __real__ of the newly added
.UADDC/.USUBC call. */
if (re2)