https://gcc.gnu.org/g:aef04968cfba0feb4420d96c61f766ee6c73f957

commit r15-7874-gaef04968cfba0feb4420d96c61f766ee6c73f957
Author: Alexey Merzlyakov <alexey.merzlya...@samsung.com>
Date:   Thu Mar 6 14:42:59 2025 -0700

    [PR rtl-optimization/119099] Avoid infinite loop in ext-dce.
    
    This fixes the ping-ponging of live sets in ext-dce which is left
    unresolved can lead to infinite loops in the ext-dce pass as seen by the
    P1 regression 119099.
    
    At its core instead of replacing the livein set with the just recomputed
    data, we IOR in the just recomputed data to the existing livein set.
    That ensures the  existing livein set never shrinks.
    
    Bootstrapped and regression tested on x86.  I've also thrown this into
    my tester to verify it across multiple targets and that we aren't
    regressing the (limited) tests we have in place for ext-dce's
    optimization behavior.
    
    While it's a generic patch, I'll wait for the RISC-V tester to run is
    course before committing.
    
            PR rtl-optimization/119099
    gcc/
            * ext-dce.cc (ext_dce_rd_transfer_n): Do not allow the livein
            set to shrink.
    
    gcc/testsuite/
            * gcc.dg/torture/pr119099.c: New test.
    
                Co-authored-by: Jeff Law  <j...@ventanamicro.com>

Diff:
---
 gcc/ext-dce.cc                          | 13 +++----------
 gcc/testsuite/gcc.dg/torture/pr119099.c | 19 +++++++++++++++++++
 2 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/gcc/ext-dce.cc b/gcc/ext-dce.cc
index e257e3bc873a..626c431f601e 100644
--- a/gcc/ext-dce.cc
+++ b/gcc/ext-dce.cc
@@ -1089,16 +1089,9 @@ ext_dce_rd_transfer_n (int bb_index)
 
   ext_dce_process_bb (bb);
 
-  /* We may have narrowed the set of live objects at the start
-     of this block.  If so, update the bitmaps and indicate to
-     the generic dataflow code that something changed.  */
-  if (!bitmap_equal_p (&livein[bb_index], livenow))
-    {
-      bitmap_copy (&livein[bb_index], livenow);
-      return true;
-    }
-
-  return false;
+  /* We only allow widening the set of objects live at the start
+     of a block.  Otherwise we run the risk of not converging.  */
+  return bitmap_ior_into (&livein[bb_index], livenow);
 }
 
 /* Dummy function for the df_simple_dataflow API.  */
diff --git a/gcc/testsuite/gcc.dg/torture/pr119099.c 
b/gcc/testsuite/gcc.dg/torture/pr119099.c
new file mode 100644
index 000000000000..21898593373b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr119099.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+
+int a, b;
+
+void func2(short);
+
+void func1() {
+  while (1) {
+    int loc = 8;
+    while (1) {
+      func2(loc);
+      if (a)
+        loc = 3;
+      else if (b)
+        break;
+      loc |= a;
+    }
+  }
+}

Reply via email to