[PATCH] Small ccp optimization for x * x (PR tree-optimization/93156)

Richard Biener rguenther@suse.de
Tue Jan 7 09:29:00 GMT 2020


On Tue, 7 Jan 2020, Jakub Jelinek wrote:

> Hi!
> 
> In x * x = ((x & -2) + (x & 1))^2 = ((x^2) & -4) + 2 * (x & -2) * (x & 1) + (x & 1)^2
> the first two terms are divisible by 4 and the last one is 0 or 1, so
> (x * x) % 4U <= 1
> and thus bit ccp can assume he second least significant bit of any power of two is
> 0.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

Thanks,
Richard.

> 2020-01-07  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR tree-optimization/93156
> 	* tree-ssa-ccp.c (bit_value_binop): For x * x note that the second
> 	least significant bit is always clear.
> 
> 	* gcc.dg/tree-ssa/pr93156.c: New test.
> 
> --- gcc/tree-ssa-ccp.c.jj	2020-01-01 12:15:48.026609558 +0100
> +++ gcc/tree-ssa-ccp.c	2020-01-06 15:39:16.807109578 +0100
> @@ -1650,6 +1650,17 @@ bit_value_binop (enum tree_code code, tr
>  		   TYPE_SIGN (TREE_TYPE (rhs2)), TYPE_PRECISION (TREE_TYPE (rhs2)),
>  		   value_to_wide_int (r2val), r2val.mask);
>  
> +  /* (x * x) & 2 == 0.  */
> +  if (code == MULT_EXPR && rhs1 == rhs2 && TYPE_PRECISION (type) > 1)
> +    {
> +      widest_int m = 2;
> +      if (wi::sext (mask, TYPE_PRECISION (type)) != -1)
> +	value = wi::bit_and_not (value, m);
> +      else
> +	value = 0;
> +      mask = wi::bit_and_not (mask, m);
> +    }
> +
>    if (wi::sext (mask, TYPE_PRECISION (type)) != -1)
>      {
>        val.lattice_val = CONSTANT;
> --- gcc/testsuite/gcc.dg/tree-ssa/pr93156.c.jj	2020-01-06 15:26:57.750286597 +0100
> +++ gcc/testsuite/gcc.dg/tree-ssa/pr93156.c	2020-01-06 15:40:32.987957791 +0100
> @@ -0,0 +1,23 @@
> +/* PR tree-optimization/93156 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fdump-tree-optimized" } */
> +/* { dg-final { scan-tree-dump-times "return 0;" 3 "optimized" } } */
> +
> +int
> +foo (int x)
> +{
> +  return (x * x) & 2;
> +}
> +
> +unsigned long long
> +bar (unsigned long long x)
> +{
> +  return (x * x) & 2;
> +}
> +
> +int
> +baz (int x)
> +{
> +  x &= -2;
> +  return (x * x) & 3;
> +}
> 
> 	Jakub
> 
> 

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


More information about the Gcc-patches mailing list