aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@gcc.gnu.org>2016-01-08 21:50:24 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2016-01-08 21:50:24 +0100
commite0237993b6bce554cc36c00a258f99f486a46d63 (patch)
tree8f6d20e0c56e248d7ed7ef5ea26783237812248f
parentbd8f5bb2978922bf0cf51eef3486f4da83df556d (diff)
downloadgcc-e0237993b6bce554cc36c00a258f99f486a46d63.zip
gcc-e0237993b6bce554cc36c00a258f99f486a46d63.tar.gz
gcc-e0237993b6bce554cc36c00a258f99f486a46d63.tar.bz2
re PR tree-optimization/69167 (internal compiler error: SSA corruption)
PR tree-optimization/69167 * gimple-fold.c (replace_stmt_with_simplification): Also punt if new SSA_NAME_OCCURS_IN_ABNORMAL_PHI SSA_NAMEs appear in operands of ops[0] comparison. * gimple-match-head.c (maybe_push_res_to_seq): Likewise. * gcc.dg/pr69167.c: New test. From-SVN: r232178
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/gimple-fold.c9
-rw-r--r--gcc/gimple-match-head.c9
-rw-r--r--gcc/testsuite/ChangeLog9
-rw-r--r--gcc/testsuite/gcc.dg/pr69167.c21
5 files changed, 53 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2cb0b01..194f390 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,13 @@
+2016-01-08 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/69167
+ * gimple-fold.c (replace_stmt_with_simplification): Also punt if
+ new SSA_NAME_OCCURS_IN_ABNORMAL_PHI SSA_NAMEs appear in operands of
+ ops[0] comparison.
+ * gimple-match-head.c (maybe_push_res_to_seq): Likewise.
+
2016-01-08 Alan Lawrence <alan.lawrence@arm.com>
- Richard Biener <rguenther@suse.de>
+ Richard Biener <rguenther@suse.de>
PR tree-optimization/68707
* tree-vect-slp.c (vect_analyze_slp_instance): Cancel permuted SLP
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index 2f379be..70871cf 100644
--- a/gcc/gimple-fold.c
+++ b/gcc/gimple-fold.c
@@ -3309,7 +3309,14 @@ replace_stmt_with_simplification (gimple_stmt_iterator *gsi,
|| (ops[2]
&& TREE_CODE (ops[2]) == SSA_NAME
&& SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ops[2])
- && !has_use_on_stmt (ops[2], stmt)))
+ && !has_use_on_stmt (ops[2], stmt))
+ || (COMPARISON_CLASS_P (ops[0])
+ && ((TREE_CODE (TREE_OPERAND (ops[0], 0)) == SSA_NAME
+ && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (TREE_OPERAND (ops[0], 0))
+ && !has_use_on_stmt (TREE_OPERAND (ops[0], 0), stmt))
+ || (TREE_CODE (TREE_OPERAND (ops[0], 1)) == SSA_NAME
+ && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (TREE_OPERAND (ops[0], 1))
+ && !has_use_on_stmt (TREE_OPERAND (ops[0], 1), stmt)))))
return false;
/* Don't insert new statements when INPLACE is true, even if we could
diff --git a/gcc/gimple-match-head.c b/gcc/gimple-match-head.c
index a2400a3..3e6d15f 100644
--- a/gcc/gimple-match-head.c
+++ b/gcc/gimple-match-head.c
@@ -299,7 +299,14 @@ maybe_push_res_to_seq (code_helper rcode, tree type, tree *ops,
&& SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ops[1]))
|| (ops[2]
&& TREE_CODE (ops[2]) == SSA_NAME
- && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ops[2])))
+ && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ops[2]))
+ || (COMPARISON_CLASS_P (ops[0])
+ && ((TREE_CODE (TREE_OPERAND (ops[0], 0)) == SSA_NAME
+ && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (TREE_OPERAND (ops[0],
+ 0)))
+ || (TREE_CODE (TREE_OPERAND (ops[0], 1)) == SSA_NAME
+ && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (TREE_OPERAND (ops[0],
+ 1))))))
return NULL_TREE;
if (!res)
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c7162e2b..73ecf30 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-01-08 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/69167
+ * gcc.dg/pr69167.c: New test.
+
2016-01-08 Marek Polacek <polacek@redhat.com>
PR c++/68449
@@ -137,9 +142,9 @@
* g++.dg/pr68991-1.C: New test.
* g++.dg/pr68991-2.C: Likewise.
-2016-01-05 Sergei Trofimovich <siarheit@google.com>
+2016-01-05 Sergei Trofimovich <siarheit@google.com>
- PR other/60465
+ PR other/60465
* gcc.target/ia64/pr60465-gprel64.c: New test.
* gcc.target/ia64/pr60465-gprel64-c37.c: New test.
diff --git a/gcc/testsuite/gcc.dg/pr69167.c b/gcc/testsuite/gcc.dg/pr69167.c
new file mode 100644
index 0000000..bda0226
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr69167.c
@@ -0,0 +1,21 @@
+/* PR tree-optimization/69167 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+int sigsetjmp (char *);
+void foo ();
+void bar (void (*) (int *));
+extern char t[];
+
+void
+baz (int *x)
+{
+ int *a = x;
+ foo ();
+ x = 0;
+ if (sigsetjmp (t))
+ while (1)
+ bar (a ? baz : 0);
+ if (x)
+ foo ();
+}