Hi! On Fri, Jan 08, 2016 at 10:12:09AM +0100, Richard Biener wrote: > On Thu, 7 Jan 2016, Jakub Jelinek wrote: > > > Hi! > > > > Various places check that (ab) SSA_NAMEs that weren't referenced on a stmt > > before don't appear on it, but all the checking is done on the gimple tuple > > operands, while in this case it is added to operands of a comparison of > > COND_EXPR/VEC_COND_EXPR. The following patch fixes it, > > bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? > > Hmm, I think this needs to go to the stmt replacement part, > replace_stmt_with_simplification.
Ok, here is another version that does that. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2016-01-08 Jakub Jelinek <ja...@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. * gcc.dg/pr69167.c: New test. --- gcc/gimple-fold.c.jj 2016-01-08 11:12:34.000000000 +0100 +++ gcc/gimple-fold.c 2016-01-08 11:20:25.324204191 +0100 @@ -3309,7 +3309,14 @@ replace_stmt_with_simplification (gimple || (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 --- gcc/gimple-match-head.c.jj 2016-01-08 09:36:14.000000000 +0100 +++ gcc/gimple-match-head.c 2016-01-08 12:26:21.555528562 +0100 @@ -299,7 +299,14 @@ maybe_push_res_to_seq (code_helper rcode && 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) { --- gcc/testsuite/gcc.dg/pr69167.c.jj 2016-01-08 11:15:22.498485105 +0100 +++ gcc/testsuite/gcc.dg/pr69167.c 2016-01-08 11:15:22.498485105 +0100 @@ -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 (); +} Jakub