diff options
author | Richard Biener <rguenther@suse.de> | 2020-10-12 08:51:05 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2020-10-12 10:27:27 +0200 |
commit | 5b2cc633794f6e1f882d46bdefe267401d33285e (patch) | |
tree | 6e4a322df377a86084eede8ee32ba9e680ba62a2 /gcc | |
parent | 875c29a245150b6d023b8b0eb7f0ba224df082d0 (diff) | |
download | gcc-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.c | 39 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-split.c | 3 |
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); } |