diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-02-01 12:39:04 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-02-01 12:39:04 +0000 |
commit | 2eaaa4e74d32e3a34ec97508afaf4849a3fce9ba (patch) | |
tree | c9c3c57827a978f3f5e7edf3ccfadd8da7eecd59 | |
parent | 65821ae78d9b50efd5ca949924cf36754fdefa64 (diff) |
2016-02-01 Richard Biener <rguenther@suse.de>
PR tree-optimization/69579
* tree-ssa-loop-ivcanon.c (propagate_constants_for_unrolling):
Do not propagate through abnormal PHI results.
* gcc.dg/setjmp-6.c: New testcase.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233036 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/setjmp-6.c | 25 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-ivcanon.c | 4 |
4 files changed, 39 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d793391f238..c40db1e4194 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-02-01 Richard Biener <rguenther@suse.de> + + PR tree-optimization/69579 + * tree-ssa-loop-ivcanon.c (propagate_constants_for_unrolling): + Do not propagate through abnormal PHI results. + 2016-02-01 Eric Botcazou <ebotcazou@adacore.com> * postreload.c (reload_cse_simplify): Remove dead code. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6462028e62e..0c1df5e3aa6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-02-01 Richard Biener <rguenther@suse.de> + + PR tree-optimization/69579 + * gcc.dg/setjmp-6.c: New testcase. + 2016-02-01 Jakub Jelinek <jakub@redhat.com> PR rtl-optimization/69570 diff --git a/gcc/testsuite/gcc.dg/setjmp-6.c b/gcc/testsuite/gcc.dg/setjmp-6.c new file mode 100644 index 00000000000..0781f055952 --- /dev/null +++ b/gcc/testsuite/gcc.dg/setjmp-6.c @@ -0,0 +1,25 @@ +/* PR69569 */ +/* { dg-do compile } */ +/* { dg-options "-O3" } */ + +#include <setjmp.h> + +jmp_buf buf; + +struct str { + int Count; +}; +int fun2(struct str *p1) +{ + int i = 1; + while (1) { + setjmp(buf); + break; + } + for (; i;) { + i = 0; + for (; i < (p1 ? p1->Count : 1); i++) + fun2(p1); + } + return 1; +} diff --git a/gcc/tree-ssa-loop-ivcanon.c b/gcc/tree-ssa-loop-ivcanon.c index 628d5b1ce47..ab1f7e6d7a9 100644 --- a/gcc/tree-ssa-loop-ivcanon.c +++ b/gcc/tree-ssa-loop-ivcanon.c @@ -1208,7 +1208,9 @@ propagate_constants_for_unrolling (basic_block bb) tree result = gimple_phi_result (phi); tree arg = gimple_phi_arg_def (phi, 0); - if (gimple_phi_num_args (phi) == 1 && TREE_CODE (arg) == INTEGER_CST) + if (! SSA_NAME_OCCURS_IN_ABNORMAL_PHI (result) + && gimple_phi_num_args (phi) == 1 + && TREE_CODE (arg) == INTEGER_CST) { propagate_into_all_uses (result, arg); gsi_remove (&gsi, true); |