]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
phiopt: Fix is_factor_profitable for debug stmts [PR125776]
authorAndrew Pinski <andrew.pinski@oss.qualcomm.com>
Sat, 13 Jun 2026 16:38:08 +0000 (09:38 -0700)
committerAndrew Pinski <andrew.pinski@oss.qualcomm.com>
Sat, 13 Jun 2026 21:09:36 +0000 (14:09 -0700)
This is a latent bug in is_factor_profitable where we would
consider a debug statement as an use for lifetime usage
afterwards. So you would get a compare debug failure in some
cases. pr125776-2.c fails since r15-4503-g8d6d6d537fdc75.

Pushed as obvious after a bootstrap/test.

PR tree-optimization/125776

gcc/ChangeLog:

* tree-ssa-phiopt.cc (is_factor_profitable): An
usage in a debug stmt should be ignored.

gcc/testsuite/ChangeLog:

* gcc.dg/torture/pr125776-1.c: New test.
* gcc.dg/torture/pr125776-2.c: New test.

Signed-off-by: Andrew Pinski <andrew.pinski@oss.qualcomm.com>
gcc/testsuite/gcc.dg/torture/pr125776-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/torture/pr125776-2.c [new file with mode: 0644]
gcc/tree-ssa-phiopt.cc

diff --git a/gcc/testsuite/gcc.dg/torture/pr125776-1.c b/gcc/testsuite/gcc.dg/torture/pr125776-1.c
new file mode 100644 (file)
index 0000000..58f143d
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-fcompare-debug" } */
+/* PR tree-optimization/125776 */
+
+int a, b, d, e, f;
+long c;
+void g();
+void h() {
+  unsigned i;
+  for (;;) {
+    unsigned j = a ? a : d;
+    i += j;
+    f = b & 40 | b > 4;
+    e = a ? a : b;
+    if (e)
+      break;
+    if (j)
+      g();
+  }
+  c = i;
+}
diff --git a/gcc/testsuite/gcc.dg/torture/pr125776-2.c b/gcc/testsuite/gcc.dg/torture/pr125776-2.c
new file mode 100644 (file)
index 0000000..6f89a52
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-fcompare-debug" } */
+/* PR tree-optimization/125776 */
+int a, b, d, e, f;
+long c;
+void g();
+void h(int i) {
+  for (;;) {
+    i++;
+    int j = a  ? a : d;
+    i = i > 0 ? i : -i;
+    f = b & 40 | b > 4;
+    e = a ? a : b;
+    if (e)
+      break;
+    if (j)
+      g();
+  }
+  c = i;
+}
+
index 82e67dc15d7652edf31264fa88b6ba6d46e951cc..edb3469e4f7cf8ab5e143ba2b47741e7539edfc9 100644 (file)
@@ -304,6 +304,8 @@ is_factor_profitable (gimple *def_stmt, basic_block merge, const gimple_match_op
       FOR_EACH_IMM_USE_FAST (use_p, iter, arg)
        {
          gimple *use_stmt = USE_STMT (use_p);
+         if (is_gimple_debug (use_stmt))
+           continue;
          basic_block use_bb = gimple_bb (use_stmt);
          if (dominated_by_p (CDI_DOMINATORS, merge, use_bb))
            {