[PATCH] Fix (ab) SSA_NAME issue in gimple folding (PR tree-optimization/69167, take 2)

Richard Biener rguenther@suse.de
Fri Jan 8 20:43:00 GMT 2016


On January 8, 2016 9:08:36 PM GMT+01:00, Jakub Jelinek <jakub@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  <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.
>
>	* 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




More information about the Gcc-patches mailing list