Hi! On Mon, Feb 28, 2022 at 11:17:27AM +0800, HAO CHEN GUI wrote: > This patch corrects the match pattern in pr56605.c. The former pattern > is wrong and test case fails with GCC11. It should match following insn on > each subtarget after mode promotion is disabled. The patch need to be > backported to GCC11. > > //gimple > _17 = (unsigned int) _20; > prolog_loop_niters.4_23 = _17 & 3; > > //rtl > (insn 19 18 20 2 (parallel [ > (set (reg:CC 208) > (compare:CC (and:SI (subreg:SI (reg:DI 207) 0) > (const_int 3 [0x3])) > (const_int 0 [0]))) > (set (reg:SI 129 [ prolog_loop_niters.5 ]) > (and:SI (subreg:SI (reg:DI 207) 0) > (const_int 3 [0x3]))) > ]) 197 {*andsi3_imm_mask_dot2} > > > Bootstrapped and tested on powerpc64-linux BE/LE and AIX with no > regressions. > Is this okay for trunk and GCC11? Any recommendations? Thanks a lot. > > ChangeLog > 2022-02-28 Haochen Gui <guih...@linux.ibm.com> > > gcc/testsuite/ > PR target/102146 > * gcc.target/powerpc/pr56605.c: Correct match pattern in combine pass. > > > patch.diff > diff --git a/gcc/testsuite/gcc.target/powerpc/pr56605.c > b/gcc/testsuite/gcc.target/powerpc/pr56605.c > index fdedbfc573d..231d808aa99 100644 > --- a/gcc/testsuite/gcc.target/powerpc/pr56605.c > +++ b/gcc/testsuite/gcc.target/powerpc/pr56605.c > @@ -11,5 +11,5 @@ void foo (short* __restrict sb, int* __restrict ia) > ia[i] = (int) sb[i]; > } > > -/* { dg-final { scan-rtl-dump-times {\(compare:CC > \((?:and|zero_extend):(?:DI) \((?:sub)?reg:[SD]I} 1 "combine" } } */ > +/* { dg-final { scan-rtl-dump-times {\(compare:CC \(and:SI \(subreg:SI > \(reg:DI} 1 "combine" } } */
The old pattern uses non-capturing braces here, which are required for ...-times to work correctly. The zero_extend alternative is required as well, as is making the subreg optional (we have an actual reg in one of the cases currently). What do you consider wrong about the old pattern, what in the generated code is different from what you expect? It works correctly on p7 etc. btw; where do you see it fail? p10? Segher