diff options
author | Jakub Jelinek <jakub@redhat.com> | 2017-02-15 07:21:42 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2017-02-15 07:21:42 +0000 |
commit | e4f2849a9b7fc24e9d79d5e759c5b98d60004414 (patch) | |
tree | 34e57cd6dbdac6b00fe73279e5bc480f1ea5d0bb | |
parent | 0885438abb88d45004d270272cec890b06e194c5 (diff) |
Backported from mainline
2017-02-10 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/79411
* tree-ssa-reassoc.c (is_reassociable_op): Return false if
stmt operands are SSA_NAMEs used in abnormal phis.
(can_reassociate_p): Return false if op is SSA_NAME used in abnormal
phis.
* gcc.c-torture/compile/pr79411.c: New test.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/gcc-6-branch@245473 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr79411.c | 22 | ||||
-rw-r--r-- | gcc/tree-ssa-reassoc.c | 15 |
4 files changed, 49 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ede331b3800..22144b22179 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,14 @@ 2017-02-15 Jakub Jelinek <jakub@redhat.com> Backported from mainline + 2017-02-10 Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/79411 + * tree-ssa-reassoc.c (is_reassociable_op): Return false if + stmt operands are SSA_NAMEs used in abnormal phis. + (can_reassociate_p): Return false if op is SSA_NAME used in abnormal + phis. + 2017-02-09 Jakub Jelinek <jakub@redhat.com> PR c/79431 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a402b70942f..a7ed75f2603 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2017-02-15 Jakub Jelinek <jakub@redhat.com> Backported from mainline + 2017-02-10 Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/79411 + * gcc.c-torture/compile/pr79411.c: New test. + 2017-02-09 Jakub Jelinek <jakub@redhat.com> PR c++/79429 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr79411.c b/gcc/testsuite/gcc.c-torture/compile/pr79411.c new file mode 100644 index 00000000000..7bd545bc4c5 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr79411.c @@ -0,0 +1,22 @@ +/* PR tree-optimization/79411 */ + +typedef struct __jmp_buf_tag { char buf[1024]; } jmp_buf[1]; +extern int setjmp (jmp_buf); +extern int bar (unsigned int *); +extern jmp_buf *baz (void); +struct C { int c1; unsigned int c2, c3, c4; }; + +void +foo (struct C *x, const int *y, unsigned int *z, unsigned int e, unsigned int g) +{ + unsigned int d = 0; + unsigned long f; + setjmp (*baz ()); + f = 1 + d; + if ((x->c1 || x->c2) && g && (!e || d >= 8)) + d = 16; + else + d = 8; + if ((!x->c3 && !x->c4 || *y == 0) && !e && bar (z)) + *z = 1 + f; +} diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c index d23dabde7b6..db4718b24da 100644 --- a/gcc/tree-ssa-reassoc.c +++ b/gcc/tree-ssa-reassoc.c @@ -599,7 +599,18 @@ is_reassociable_op (gimple *stmt, enum tree_code code, struct loop *loop) if (is_gimple_assign (stmt) && gimple_assign_rhs_code (stmt) == code && has_single_use (gimple_assign_lhs (stmt))) - return true; + { + tree rhs1 = gimple_assign_rhs1 (stmt); + tree rhs2 = gimple_assign_rhs1 (stmt); + if (TREE_CODE (rhs1) == SSA_NAME + && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs1)) + return false; + if (rhs2 + && TREE_CODE (rhs2) == SSA_NAME + && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs2)) + return false; + return true; + } return false; } @@ -4466,6 +4477,8 @@ static bool can_reassociate_p (tree op) { tree type = TREE_TYPE (op); + if (TREE_CODE (op) == SSA_NAME && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op)) + return false; if ((ANY_INTEGRAL_TYPE_P (type) && TYPE_OVERFLOW_WRAPS (type)) || NON_SAT_FIXED_POINT_TYPE_P (type) || (flag_associative_math && FLOAT_TYPE_P (type))) |