https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118973

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED
           Assignee|unassigned at gcc dot gnu.org      |rguenth at gcc dot 
gnu.org

--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
The issue is we have a broken CFG with an empty BB with an outgoing abnormal
edge.  Somebody failed to prune this edge.  DCE it is:

> diff -u t.c.045t.dse1 t.c.046t.cddce1 
--- t.c.045t.dse1       2025-02-24 09:30:15.013311568 +0100
+++ t.c.046t.cddce1     2025-02-24 09:30:15.017311568 +0100
@@ -31,10 +31,8 @@

 ;;   basic block 5, loop depth 0
 ;;    pred:       4
-  operator new (4);
-;;    succ:       7
+;;    succ:       3
 ;;                6
-;;                3

 ;;   basic block 6, loop depth 0
 ;;    pred:       4
@@ -44,7 +42,6 @@

 ;;   basic block 7, loop depth 0
 ;;    pred:       2
-;;                5
 <L3>:
   resx 1
 ;;    succ:      


it doesn't look like DCE handles EH or abnormal edges in any special way ...
the intent was we preserve those, but removable call handling ignores this.

diff --git a/gcc/tree-ssa-dce.cc b/gcc/tree-ssa-dce.cc
index 461283ba858..3519694980e 100644
--- a/gcc/tree-ssa-dce.cc
+++ b/gcc/tree-ssa-dce.cc
@@ -392,8 +392,8 @@ mark_stmt_if_obviously_necessary (gimple *stmt, bool
aggressive)
        gcall *call = as_a <gcall *> (stmt);

        /* Never elide a noreturn call we pruned control-flow for.  */
-       if ((gimple_call_flags (call) & ECF_NORETURN)
-           && gimple_call_ctrl_altering_p (call))
+       if (/*(gimple_call_flags (call) & ECF_NORETURN)
+           &&*/ gimple_call_ctrl_altering_p (call))
          {
            mark_stmt_necessary (call, true);
            return;

fixes this.

Reply via email to