https://gcc.gnu.org/g:1d91a0b0ec53863c8754e04142b1ee6f37b20751

commit r16-9274-g1d91a0b0ec53863c8754e04142b1ee6f37b20751
Author: Richard Biener <[email protected]>
Date:   Wed Jul 8 13:57:17 2026 +0200

    tree-optimization/126150 - ICE with replace_uses_by
    
    replace_uses_by triggers eventual BB removal from inside a
    FOR_EACH_IMM_USE_STMT iteration.  That's a no-go since we might
    eliminate uses in the list we are currently processing.  The
    fix is to defer EH edge purging.
    
            PR tree-optimization/126150
            * tree-cfg.cc (replace_uses_by): Delay purging of EH edges
            until after FOR_EACH_IMM_USE_STMT finished.
    
            * g++.dg/pr126150.C: New testcase.
    
    (cherry picked from commit 210b4eca880c88e7f7ec970b68a93a2a28bad1be)

Diff:
---
 gcc/testsuite/g++.dg/pr126150.C | 8 ++++++++
 gcc/tree-cfg.cc                 | 6 +++++-
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/gcc/testsuite/g++.dg/pr126150.C b/gcc/testsuite/g++.dg/pr126150.C
new file mode 100644
index 000000000000..0ca536058b51
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr126150.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+// { dg-options "-fnon-call-exceptions -O2 
--param=max-completely-peel-loop-nest-depth=0" }
+
+struct B {
+  B() { t = 0; }
+  ~B();
+  int t;
+} w3[1][2];
diff --git a/gcc/tree-cfg.cc b/gcc/tree-cfg.cc
index 2e61e68c988e..e42e22cf769f 100644
--- a/gcc/tree-cfg.cc
+++ b/gcc/tree-cfg.cc
@@ -1940,6 +1940,7 @@ replace_uses_by (tree name, tree val)
   use_operand_p use;
   gimple *stmt;
   edge e;
+  auto_bitmap eh_cleanup_bbs;
 
   FOR_EACH_IMM_USE_STMT (stmt, imm_iter, name)
     {
@@ -1997,10 +1998,13 @@ replace_uses_by (tree name, tree val)
            }
 
          if (maybe_clean_or_replace_eh_stmt (orig_stmt, stmt))
-           gimple_purge_dead_eh_edges (gimple_bb (stmt));
+           bitmap_set_bit (eh_cleanup_bbs, gimple_bb (stmt)->index);
        }
     }
 
+  if (!bitmap_empty_p (eh_cleanup_bbs))
+    gimple_purge_all_dead_eh_edges (eh_cleanup_bbs);
+
   gcc_checking_assert (has_zero_uses (name));
 
   /* Also update the trees stored in loop structures.  */

Reply via email to