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. >