]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-ssa-math-opts: Fix up gsi_remove order in match_uaddc_usubc [PR112430]
authorJakub Jelinek <jakub@redhat.com>
Sat, 11 Nov 2023 19:15:53 +0000 (20:15 +0100)
committerJakub Jelinek <jakub@redhat.com>
Sat, 11 Nov 2023 19:15:53 +0000 (20:15 +0100)
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.

gcc/testsuite/gcc.dg/pr112430.c [new file with mode: 0644]
gcc/tree-ssa-math-opts.cc

diff --git a/gcc/testsuite/gcc.dg/pr112430.c b/gcc/testsuite/gcc.dg/pr112430.c
new file mode 100644 (file)
index 0000000..16c34fc
--- /dev/null
@@ -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);
+}
index 363f3164669108357008e0ccabdcdb4087bc7565..95eda438831b70bc0d907b3d6f6f46fbaa0b3be1 100644 (file)
@@ -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)