On Tue, Apr 19, 2016 at 7:00 PM, Bin Cheng <bin.ch...@arm.com> wrote:
> Hi,
> Type conversion from integer to smaller unsigned type could be transformed 
> into BIT_AND_EXPR in compilation.  For example,
>   int i;
>   for (i = 0; i < n; i++)
>     {
>       unsigned char uc = (unsigned char) i;  // transformed into X = i && 
> 255, in which both X and i are of int type.
>       b[uc] = 0;
>     }
> X here could a valid SCEV if we can prove that loop doesn't iterate more than 
> 255 times.  In other words, if 'i' is SCEV and its value is in the range of 
> representable set of type "unsigned char".  This information could be 
> available with -faggressive-loop-optimizations.
> This patch adds support for BIT_AND_EXPR in scalar evolution to handle such 
> cases, as well as two new tests.
>
> Bootstrap and test on x86_64 & AArch64.  Is it OK?

Don't use cst_and_fits_in_hwi/int_cst_value - those are odd beasts.
Use tree_fits_uhwi_p / tree_to_uhwi.
Or just use wi::popcount and verify it against wi::clz.

Richard.

> Thanks,
> bin
>
> 2016-03-24  Bin Cheng  <bin.ch...@arm.com>
>
>         * tree-scalar-evolution.c (interpret_rhs_expr): Handle BIT_AND_EXPR.
>
> gcc/testsuite/ChangeLog
> 2016-03-24  Bin Cheng  <bin.ch...@arm.com>
>
>         * gcc.dg/tree-ssa/scev-11.c: New test.
>         * gcc.dg/tree-ssa/scev-12.c: New test.
>

Reply via email to