On Thu, 29 Dec 2016, Jakub Jelinek wrote:

> Hi!
> 
> On Tue, Dec 20, 2016 at 09:45:03PM +0100, Jakub Jelinek wrote:
> > > Note that you can write (shift @0 SSA_NAME@1) in the pattern instead of a
> > > separate test.
> > 
> > That is what I tried first, but there is some bug in genmatch.c that
> > prevents it.  The:
> >  (for vec (VECTOR_CST CONSTRUCTOR)
> >   (simplify
> >    (shiftrotate @0 vec@1)
> > results in case SSA_NAME: being added to a switch:
> >     case SSA_NAME:
> >       if (do_valueize (valueize, op1) != NULL_TREE)
> >         {
> >           gimple *def_stmt = SSA_NAME_DEF_STMT (op1);
> >           if (gassign *def = dyn_cast <gassign *> (def_stmt))
> >             switch (gimple_assign_rhs_code (def))
> >               {
> >               case CONSTRUCTOR:
> > and the SSA_NAME@1 in another simplification resulted in another
> >     case SSA_NAME:
> > into the same switch (rather than appending to the case SSA_NAME).
> 
> And here is the corresponding updated version of the patch:

Ok.

Thanks,
Richard.

> 2016-12-29  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR tree-optimization/71563
>       * match.pd: Simplify X << Y into X if Y is known to be 0 or
>       out of range value - has low bits known to be zero.
> 
>       * gcc.dg/tree-ssa/pr71563.c: New test.
> 
> --- gcc/match.pd.jj   2016-12-21 10:00:10.809244456 +0100
> +++ gcc/match.pd      2016-12-29 21:56:56.891858831 +0100
> @@ -1515,6 +1515,21 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>      (if (tem)
>       (shiftrotate @0 { tem; }))))))
>  
> +/* Simplify X << Y where Y's low width bits are 0 to X, as only valid
> +   Y is 0.  Similarly for X >> Y.  */
> +#if GIMPLE
> +(for shift (lshift rshift)
> + (simplify
> +  (shift @0 SSA_NAME@1)
> +   (if (INTEGRAL_TYPE_P (TREE_TYPE (@1)))
> +    (with {
> +      int width = ceil_log2 (element_precision (TREE_TYPE (@0)));
> +      int prec = TYPE_PRECISION (TREE_TYPE (@1));
> +     }
> +     (if ((get_nonzero_bits (@1) & wi::mask (width, false, prec)) == 0)
> +      @0)))))
> +#endif
> +
>  /* Rewrite an LROTATE_EXPR by a constant into an
>     RROTATE_EXPR by a new constant.  */
>  (simplify
> --- gcc/testsuite/gcc.dg/tree-ssa/pr71563.c.jj        2016-12-29 
> 21:56:12.668414342 +0100
> +++ gcc/testsuite/gcc.dg/tree-ssa/pr71563.c   2016-12-29 21:56:12.668414342 
> +0100
> @@ -0,0 +1,23 @@
> +/* PR tree-optimization/71563 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fdump-tree-optimized" } */
> +
> +void link_error (void);
> +
> +void
> +foo (int k)
> +{
> +  int t = 1 << ((1 / k) << 8);
> +  if (t != 1)
> +    link_error ();
> +}
> +
> +void
> +bar (int k, int l)
> +{
> +  int t = l << (k << 8);
> +  if (t != l)
> +    link_error ();
> +}
> +
> +/* { dg-final { scan-tree-dump-not "link_error" "optimized" } } */
> 
> 
>       Jakub
> 
> 

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

Reply via email to