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.

Richard.

> 2016-01-07  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR tree-optimization/69167
>       * gimple-match-head.c (gimple_simplify) <case GIMPLE_TERNARY_RHS>:
>       Don't simplify condition if the condition simplification would
>       introduce use of SSA_NAME_OCCURS_IN_ABNORMAL_PHI SSA_NAME not
>       previously mentioned on the insn.
>       * gimple-fold.h (has_use_on_stmt): New prototype.
>       * gimple-fold.c (has_use_on_stmt): No longer static.
> 
>       * gcc.dg/pr69167.c: New test.
> 
> --- gcc/gimple-match-head.c.jj        2016-01-04 14:55:53.000000000 +0100
> +++ gcc/gimple-match-head.c   2016-01-07 12:54:42.237334530 +0100
> @@ -655,9 +655,23 @@ gimple_simplify (gimple *stmt,
>                         valueized = true;
>                         if (TREE_CODE_CLASS ((enum tree_code)rcode2)
>                             == tcc_comparison)
> -                         rhs1 = build2 (rcode2, TREE_TYPE (rhs1),
> -                                        ops2[0], ops2[1]);
> -                       else if (rcode2 == SSA_NAME
> +                         {
> +                           if (TREE_CODE (ops2[0]) == SSA_NAME
> +                               && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ops2[0])
> +                               && !has_use_on_stmt (ops2[0], stmt))
> +                             valueized = false;
> +                           if (TREE_CODE (ops2[1]) == SSA_NAME
> +                               && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ops2[1])
> +                               && !has_use_on_stmt (ops2[1], stmt))
> +                             valueized = false;
> +                           if (valueized)
> +                             rhs1 = build2 (rcode2, TREE_TYPE (rhs1),
> +                                            ops2[0], ops2[1]);
> +                         }
> +                       else if ((rcode2 == SSA_NAME
> +                                 && (!SSA_NAME_OCCURS_IN_ABNORMAL_PHI
> +                                                                   (ops2[0])
> +                                     || has_use_on_stmt (ops2[0], stmt)))
>                                  || rcode2 == INTEGER_CST
>                                  || rcode2 == VECTOR_CST)
>                           rhs1 = ops2[0];
> --- gcc/gimple-fold.h.jj      2016-01-04 14:55:53.000000000 +0100
> +++ gcc/gimple-fold.h 2016-01-07 13:01:52.938315972 +0100
> @@ -34,6 +34,7 @@ extern tree maybe_fold_or_comparisons (e
>                                      enum tree_code, tree, tree);
>  extern bool arith_overflowed_p (enum tree_code, const_tree, const_tree,
>                               const_tree);
> +extern bool has_use_on_stmt (tree, gimple *);
>  extern tree no_follow_ssa_edges (tree);
>  extern tree follow_single_use_edges (tree);
>  extern tree gimple_fold_stmt_to_constant_1 (gimple *, tree (*) (tree),
> --- gcc/gimple-fold.c.jj      2016-01-07 11:37:36.000000000 +0100
> +++ gcc/gimple-fold.c 2016-01-07 13:01:25.793695288 +0100
> @@ -3270,7 +3270,7 @@ gimple_fold_call (gimple_stmt_iterator *
>  
>  /* Return true whether NAME has a use on STMT.  */
>  
> -static bool
> +bool
>  has_use_on_stmt (tree name, gimple *stmt)
>  {
>    imm_use_iterator iter;
> --- gcc/testsuite/gcc.dg/pr69167.c.jj 2016-01-07 12:58:40.706002201 +0100
> +++ gcc/testsuite/gcc.dg/pr69167.c    2016-01-07 12:58:22.000000000 +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
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 
21284 (AG Nuernberg)

Reply via email to