aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2017-02-10 09:47:32 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2017-02-10 09:47:32 +0100
commit6139a3b76c3f149f17d7415d84633cbe617ed72b (patch)
tree5ed54be4c26c2dbbc0f9cd78abd2cb3424f83e90 /gcc
parente8f45b6c351690c258365525904d7dd0c0e9104f (diff)
downloadgcc-6139a3b76c3f149f17d7415d84633cbe617ed72b.zip
gcc-6139a3b76c3f149f17d7415d84633cbe617ed72b.tar.gz
gcc-6139a3b76c3f149f17d7415d84633cbe617ed72b.tar.bz2
re PR tree-optimization/79411 (ICE: SSA corruption (fail_abnormal_edge_coalesce))
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. From-SVN: r245324
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr79411.c22
-rw-r--r--gcc/tree-ssa-reassoc.c15
4 files changed, 49 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4826bcb..7a06399 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+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 Jan Hubicka <hubicka@ucw.cz>
PR ipa/70795
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1030f17..d6cd771 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+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>
Jason Merrill <jason@redhat.com>
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 0000000..7bd545b
--- /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 4a796f4..36ef86c 100644
--- a/gcc/tree-ssa-reassoc.c
+++ b/gcc/tree-ssa-reassoc.c
@@ -605,7 +605,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;
}
@@ -4989,6 +5000,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)))