aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2023-02-21 13:02:31 +0100
committerRichard Biener <rguenther@suse.de>2023-02-21 14:02:58 +0100
commit1dd033b8bcb0c50ad80084a3a13a391808b2deb6 (patch)
treea7b090e8ed05b281bef3b5fb00ec434f2c689daa
parenta7e706df2280de4a42f68b6c44401e4348d3593c (diff)
downloadgcc-1dd033b8bcb0c50ad80084a3a13a391808b2deb6.zip
gcc-1dd033b8bcb0c50ad80084a3a13a391808b2deb6.tar.gz
gcc-1dd033b8bcb0c50ad80084a3a13a391808b2deb6.tar.bz2
tree-optimization/108691 - remove trigger-happy assert
The following gets rid of the idea that we should prevent setjmp like calls from popping up in uncontrolled way in the IL for now. The solution is probably to handle it similar as noreturn has the ctrl-altering flag on stmts, but use another flag, for example ctrl-receiving which would also make sure the stmt is first. PR tree-optimization/108691 * tree-ssa-dce.cc (eliminate_unnecessary_stmts): Remove assert about calls_setjmp not becoming true when it was false. * gcc.dg/pr108691.c: New testcase.
-rw-r--r--gcc/testsuite/gcc.dg/pr108691.c9
-rw-r--r--gcc/tree-ssa-dce.cc8
2 files changed, 14 insertions, 3 deletions
diff --git a/gcc/testsuite/gcc.dg/pr108691.c b/gcc/testsuite/gcc.dg/pr108691.c
new file mode 100644
index 0000000..e412df1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr108691.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+extern int __attribute__((returns_twice)) setjmp(void*);
+
+void bbb(void) {
+ int (*fnptr)(void*) = setjmp;
+ fnptr(0);
+}
diff --git a/gcc/tree-ssa-dce.cc b/gcc/tree-ssa-dce.cc
index ceeb0ad..0ae998f 100644
--- a/gcc/tree-ssa-dce.cc
+++ b/gcc/tree-ssa-dce.cc
@@ -1512,10 +1512,12 @@ eliminate_unnecessary_stmts (bool aggressive)
remove_edge (to_remove_edges[i]);
cfg_altered = true;
}
- /* When we cleared calls_setjmp we can purge all abnormal edges. Do so. */
- if (cfun->calls_setjmp != had_setjmp)
+ /* When we cleared calls_setjmp we can purge all abnormal edges. Do so.
+ ??? We'd like to assert that setjmp calls do not pop out of nothing
+ but we currently lack a per-stmt way of noting whether a call was
+ recognized as returns-twice (or rather receives-control). */
+ if (!cfun->calls_setjmp && had_setjmp)
{
- gcc_assert (!cfun->calls_setjmp);
/* Make sure we only remove the edges, not dominated blocks. Using
gimple_purge_dead_abnormal_call_edges would do that and we
cannot free dominators yet. */