From: Jakub Jelinek Date: Fri, 8 Jan 2016 20:50:24 +0000 (+0100) Subject: re PR tree-optimization/69167 (internal compiler error: SSA corruption) X-Git-Tag: basepoints/gcc-7~1761 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e0237993b6bce554cc36c00a258f99f486a46d63;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2cb0b0196bcf..194f3904aa4b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,13 @@ +2016-01-08 Jakub Jelinek + + 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 - Richard Biener + Richard Biener 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 2f379be4b28f..70871cfcf27a 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 a2400a3fbe4e..3e6d15f1b365 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 c7162e2b7eee..73ecf30bb0f8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-01-08 Jakub Jelinek + + PR tree-optimization/69167 + * gcc.dg/pr69167.c: New test. + 2016-01-08 Marek Polacek 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 +2016-01-05 Sergei Trofimovich - 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 000000000000..bda02263d4e7 --- /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 (); +}