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.
Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.
Richard.
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 | 15 +++++++++++++++
gcc/tree-inline.cc | 3 +++
2 files changed, 18 insertions(+)
create mode 100644 gcc/testsuite/g++.dg/torture/pr124130.C
diff --git a/gcc/testsuite/g++.dg/torture/pr124130.C
b/gcc/testsuite/g++.dg/torture/pr124130.C
new file mode 100644
index 00000000000..0eb08c6b63a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr124130.C
@@ -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;
+}
diff --git a/gcc/tree-inline.cc b/gcc/tree-inline.cc
index 80b66bf21bb..3ae342402fd 100644
--- a/gcc/tree-inline.cc
+++ b/gcc/tree-inline.cc
@@ -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);
}
}
--
2.51.0