]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/124130 - fixup noreturn calls during inlining
authorRichard Biener <rguenther@suse.de>
Tue, 17 Feb 2026 10:42:44 +0000 (11:42 +0100)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 17 Feb 2026 13:56:13 +0000 (14:56 +0100)
When we are altering the ctrl state of a stmt due to adding abnormal
edges from it we also have to make sure to cleanup its noreturn state.

PR tree-optimization/124130
* tree-inline.cc (copy_edges_for_bb): Fixup noreturn calls
with abnormal edge source.

* g++.dg/torture/pr124130.C: New testcase.

gcc/testsuite/g++.dg/torture/pr124130.C [new file with mode: 0644]
gcc/tree-inline.cc

diff --git a/gcc/testsuite/g++.dg/torture/pr124130.C b/gcc/testsuite/g++.dg/torture/pr124130.C
new file mode 100644 (file)
index 0000000..0eb08c6
--- /dev/null
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+void __sigsetjmp_cancel() __attribute__((__returns_twice__));
+struct basic_ostream {
+  basic_ostream &operator<<(basic_ostream &__pf(basic_ostream &)) {
+    return __pf(*this);
+  }
+} cerr;
+extern "C" void _exit(int);
+enum { Exit_Internal_Error };
+basic_ostream &report_error(basic_ostream &) { _exit(Exit_Internal_Error); }
+void thread_pool_thread_main() {
+  __sigsetjmp_cancel();
+  cerr << report_error;
+}
index 80b66bf21bb29ef76c5013defe065a81e15651d8..3ae342402fd6a34ff455c379c27dfde729876adc 100644 (file)
@@ -2749,6 +2749,9 @@ copy_edges_for_bb (basic_block bb, profile_count num, profile_count den,
              make_single_succ_edge (copy_stmt_bb, abnormal_goto_dest,
                                     EDGE_ABNORMAL);
              gimple_call_set_ctrl_altering (copy_stmt, true);
+             if (is_a <gcall *> (copy_stmt)
+                 && (gimple_call_flags (copy_stmt) & ECF_NORETURN))
+               fixup_noreturn_call (copy_stmt);
            }
        }