On January 8, 2016 9:08:36 PM GMT+01:00, Jakub Jelinek <ja...@redhat.com> wrote: >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?
OK. Thanks, Richard. >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