On Mon, 17 Feb 2020, Li Jia He wrote: > Hi, > > This patch wants to fix PR66552 on gimple and optimizes (x shift (n mod C)) > to (x shift (n bit_and (C - 1))) when C is a constant and power of two as > discussed in PR66552. > > The regression testing for the patch was done on GCC mainline on > > powerpc64le-unknown-linux-gnu (Power 9 LE) > > with no regressions. Is it OK for GCC11 ?
I fail to see the connection with a shift operation, can you explain? Thanks, Richard. > Thanks, > Lijia He > > gcc/ChangeLog > 2020-02-17 Li Jia He <heli...@linux.ibm.com> > > PR tree-optimization/66552 > * match.pd (x shift (n mod pow2(c))): Optimizes to > (x shift (n bit_and (pow2(c) - 1)). > > testsuite/ChangeLog > 2019-02-17 Li Jia He <heli...@linux.ibm.com> > > PR tree-optimization/66552 > * testsuite/gcc.dg/pr66552.c: New testcase. > --- > gcc/match.pd | 6 ++++++ > gcc/testsuite/gcc.dg/pr66552.c | 14 ++++++++++++++ > 2 files changed, 20 insertions(+) > create mode 100644 gcc/testsuite/gcc.dg/pr66552.c > > diff --git a/gcc/match.pd b/gcc/match.pd > index 73834c25593..1d74f7dba7f 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -546,6 +546,12 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (simplify > (mod (mod@2 @0 @1) @1) > @2) > + /* Optimize (x shift (n mod C)) to (x shift (n bit_and (C - 1))) when C is a > + constant and power of two. */ > + (for shift (lshift rshift) > + (simplify > + (shift @0 (mod @1 integer_pow2p@2)) > + (shift @0 (bit_and @1 (minus @2 { build_int_cst (TREE_TYPE (@2), 1); > }))))) > /* From extract_muldiv_1: (X * C1) % C2 is zero if C1 is a multiple of C2. > */ > (simplify > (mod (mult @0 INTEGER_CST@1) INTEGER_CST@2) > diff --git a/gcc/testsuite/gcc.dg/pr66552.c b/gcc/testsuite/gcc.dg/pr66552.c > new file mode 100644 > index 00000000000..7583c9ad25a > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/pr66552.c > @@ -0,0 +1,14 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fdump-tree-lower" } */ > + > +unsigned a(unsigned x, int n) > +{ > + return x >> (n % 32); > +} > + > +unsigned b(unsigned x, int n) > +{ > + return x << (n % 32); > +} > + > +/* { dg-final { scan-tree-dump-not " % " "lower" } } */ > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)