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

Reply via email to