On Thu, 14 Jan 2021, Jakub Jelinek wrote:

> Hi!
> 
> This patch optimizes two GIMPLE operations into just one.
> As mentioned in the PR, there is some risk this might create more expensive
> constants, but sometimes it will make them on the other side less expensive,
> it really depends on the exact value.
> And if it is an important issue, we should do it in md or during expansion.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

Thanks,
Richard.

> 2021-01-13  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR tree-optimization/96688
>       * match.pd (~(X >> Y) -> ~X >> Y): New simplification if
>       ~X can be simplified.
> 
>       * gcc.dg/tree-ssa/pr96688.c: New test.
>       * gcc.dg/tree-ssa/reassoc-37.c: Adjust scan-tree-dump regex.
>       * gcc.target/i386/pr66821.c: Likewise.
> 
> --- gcc/match.pd.jj   2021-01-13 15:27:13.843788907 +0100
> +++ gcc/match.pd      2021-01-13 18:01:09.706568135 +0100
> @@ -1109,6 +1109,18 @@ (define_operator_list COND_TERNARY
>       && wi::to_wide (@1) != wi::min_value (TYPE_PRECISION (type),
>                                             SIGNED))
>      (minus (plus @1 { build_minus_one_cst (type); }) @0))))
> +
> +/* ~(X >> Y) -> ~X >> Y if ~X can be simplified.  */
> +(simplify
> + (bit_not (rshift:s @0 @1))
> +  (if (!TYPE_UNSIGNED (TREE_TYPE (@0)))
> +   (rshift (bit_not! @0) @1)
> +   /* For logical right shifts, this is possible only if @0 doesn't
> +      have MSB set and the logical right shift is changed into
> +      arithmetic shift.  */
> +   (if (!wi::neg_p (tree_nonzero_bits (@0)))
> +    (with { tree stype = signed_type_for (TREE_TYPE (@0)); }
> +     (convert (rshift (bit_not! (convert:stype @0)) @1))))))
>  #endif
>  
>  /* x + (x & 1) -> (x + 1) & ~1 */
> --- gcc/testsuite/gcc.dg/tree-ssa/pr96688.c.jj        2021-01-13 
> 19:12:26.396363212 +0100
> +++ gcc/testsuite/gcc.dg/tree-ssa/pr96688.c   2021-01-13 19:13:32.146628538 
> +0100
> @@ -0,0 +1,24 @@
> +/* PR tree-optimization/96688 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fdump-tree-optimized" } */
> +/* { dg-final { scan-tree-dump-times " = -124 >> " 2 "optimized" } } */
> +/* { dg-final { scan-tree-dump-times " >> " 3 "optimized" } } */
> +/* { dg-final { scan-tree-dump-times " = ~" 1 "optimized" } } */
> +
> +int
> +foo (int x)
> +{
> +  return ~(123 >> x);
> +}
> +
> +unsigned
> +bar (int x)
> +{
> +  return ~(123U >> x);
> +}
> +
> +unsigned
> +baz (int x)
> +{
> +  return ~(~123U >> x);
> +}
> --- gcc/testsuite/gcc.dg/tree-ssa/reassoc-37.c.jj     2020-01-12 
> 11:54:37.609395365 +0100
> +++ gcc/testsuite/gcc.dg/tree-ssa/reassoc-37.c        2021-01-14 
> 10:04:03.100243196 +0100
> @@ -12,5 +12,5 @@ foo (int x)
>  }
>  
>  /* Check if the tests have been folded into a bit test.  */
> -/* { dg-final { scan-tree-dump "(8784908|0x0*860c0c)" "optimized" { target 
> i?86-*-* x86_64-*-* } } } */
> +/* { dg-final { scan-tree-dump "(8784908|-8784909|0x0*860c0c)" "optimized" { 
> target i?86-*-* x86_64-*-* } } } */
>  /* { dg-final { scan-tree-dump "(<<|>>)" "optimized" { target i?86-*-* 
> x86_64-*-* } } } */
> --- gcc/testsuite/gcc.target/i386/pr66821.c.jj        2020-01-12 
> 11:54:37.969389933 +0100
> +++ gcc/testsuite/gcc.target/i386/pr66821.c   2021-01-14 10:04:41.210807013 
> +0100
> @@ -11,5 +11,5 @@ foo (int x)
>  }
>  
>  /* Check if the tests have been folded into a bit test.  */
> -/* { dg-final { scan-tree-dump "(8784908|0x0*860c0c)" "optimized" } } */
> +/* { dg-final { scan-tree-dump "(8784908|-8784909|0x0*860c0c)" "optimized" } 
> } */
>  /* { dg-final { scan-tree-dump "(<<|>>)" "optimized" } } */
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)

Reply via email to