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 <[email protected]>
>
> 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 <[email protected]>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB
21284 (AG Nuernberg)