]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/98845 - ICE with tail-merging and DCE/DSE disabled
authorRichard Biener <rguenther@suse.de>
Mon, 17 Feb 2025 14:53:11 +0000 (15:53 +0100)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 2 Apr 2025 07:23:07 +0000 (09:23 +0200)
The following shows that tail-merging will make dead SSA defs live
in paths where it wasn't before, possibly introducing UB or as
in this case, uses of abnormals that eventually fail coalescing
later.  The fix is to register such defs for stmt comparison.

PR tree-optimization/98845
* tree-ssa-tail-merge.cc (stmt_local_def): Consider a
def with no uses not local.

* gcc.dg/pr98845.c: New testcase.
* gcc.dg/pr81192.c: Adjust.

(cherry picked from commit 6b8a8c9fd68c5dabaec5ddbc25efeade44f37a14)

gcc/testsuite/gcc.dg/pr81192.c
gcc/testsuite/gcc.dg/pr98845.c [new file with mode: 0644]
gcc/tree-ssa-tail-merge.cc

index c46ac18fd9af1927bd46afa5b8646b0b58e8c30a..87a7a7a19c80ca4c180cc5e9f501fd5b73ac6516 100644 (file)
@@ -25,12 +25,16 @@ void __GIMPLE(ssa, startwith("pre")) fn2   ()
   if (j_6(D) != _Literal (int)2147483647)
     goto __BB4;
   else
-    goto __BB5;
+    goto __BB9;
 
   __BB(4):
   iftmp2_8 = j_6(D) + _Literal (int)1;
   goto __BB5;
 
+  __BB(9):
+  iftmp2_8 = j_6(D) + _Literal (int)1;
+  goto __BB5;
+
   __BB(5):
   b_lsm6_10 = _Literal (int)2147483647;
   goto __BB6;
diff --git a/gcc/testsuite/gcc.dg/pr98845.c b/gcc/testsuite/gcc.dg/pr98845.c
new file mode 100644 (file)
index 0000000..074c979
--- /dev/null
@@ -0,0 +1,33 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-tree-dce -fno-tree-dse" } */
+
+int n;
+
+__attribute__ ((returns_twice)) void
+foo (void);
+
+void
+bar (void);
+
+void
+quux (int x)
+{
+  if (x)
+    ++x;
+  else
+    {
+      if (n)
+        {
+          x = 1;
+          foo ();
+        }
+      else
+        bar ();
+
+      if (n)
+        {
+          ++x;
+          ++n;
+        }
+    }
+}
index c8b4a79294d7aee6c3ca4328991c43360a8c8f7a..c87b2f4dd152415e35036f3cde9b81bea178860c 100644 (file)
@@ -336,10 +336,13 @@ stmt_local_def (gimple *stmt)
 
   def_bb = gimple_bb (stmt);
 
+  bool any_use = false;
   FOR_EACH_IMM_USE_FAST (use_p, iter, val)
     {
       if (is_gimple_debug (USE_STMT (use_p)))
        continue;
+
+      any_use = true;
       bb = gimple_bb (USE_STMT (use_p));
       if (bb == def_bb)
        continue;
@@ -351,6 +354,11 @@ stmt_local_def (gimple *stmt)
       return false;
     }
 
+  /* When there is no use avoid making the stmt live on other paths.
+     This can happen with DCE disabled or not done as seen in PR98845.  */
+  if (!any_use)
+    return false;
+
   return true;
 }