aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2020-10-12 08:51:05 +0200
committerRichard Biener <rguenther@suse.de>2020-10-12 10:27:27 +0200
commit5b2cc633794f6e1f882d46bdefe267401d33285e (patch)
tree6e4a322df377a86084eede8ee32ba9e680ba62a2 /gcc
parent875c29a245150b6d023b8b0eb7f0ba224df082d0 (diff)
downloadgcc-5b2cc633794f6e1f882d46bdefe267401d33285e.zip
gcc-5b2cc633794f6e1f882d46bdefe267401d33285e.tar.gz
gcc-5b2cc633794f6e1f882d46bdefe267401d33285e.tar.bz2
tree-optimization/97357 - avoid abnormals in loop splitting conditions
This avoids abnormals in another place. 2020-10-12 Richard Biener <rguenther@suse.de> PR tree-optimization/97357 * tree-ssa-loop-split.c (ssa_semi_invariant_p): Abnormal SSA names are not semi invariant. * gcc.dg/pr97357.c: New testcase.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/pr97357.c39
-rw-r--r--gcc/tree-ssa-loop-split.c3
2 files changed, 42 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/pr97357.c b/gcc/testsuite/gcc.dg/pr97357.c
new file mode 100644
index 0000000..2b32d13
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr97357.c
@@ -0,0 +1,39 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+/* { dg-require-effective-target indirect_jumps } */
+
+#include <setjmp.h>
+#include <stdlib.h>
+
+void * my_malloc (size_t size);
+
+typedef struct glk {
+ struct glk *nxt;
+} glk;
+
+typedef struct Lock
+{
+ glk ByteLock;
+} Lock;
+
+static Lock *l, *lk;
+
+void bytelocks(glk *rethead, jmp_buf jb)
+{
+ glk *cur, *cur_lk;
+
+ if (( _setjmp (jb)) == 0)
+ for (cur = &l->ByteLock; cur != ((glk *)0) ; cur = (cur)->nxt)
+ for (cur_lk = &lk->ByteLock; cur_lk != ((glk *)0); cur_lk = cur_lk->nxt)
+ {
+ glk *retrng;
+
+ if(!rethead)
+ rethead = (glk *) my_malloc (sizeof(glk));
+ retrng = (glk *) my_malloc (sizeof(glk));
+
+ retrng->nxt = rethead;
+ }
+
+ return;
+}
diff --git a/gcc/tree-ssa-loop-split.c b/gcc/tree-ssa-loop-split.c
index 1eb6be5..46ee7c0 100644
--- a/gcc/tree-ssa-loop-split.c
+++ b/gcc/tree-ssa-loop-split.c
@@ -977,6 +977,9 @@ ssa_semi_invariant_p (struct loop *loop, tree name,
if (!def_bb || !flow_bb_inside_loop_p (loop, def_bb))
return true;
+ if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
+ return false;
+
return stmt_semi_invariant_p_1 (loop, def, skip_head, stmt_stat);
}