Hi Segher, Yes, the old committed patch caused it matches two insns. So I submitted the new patch which fixes the problem. Here is the new patch. https://gcc.gnu.org/pipermail/gcc-patches/2022-February/590958.html
The new pattern is: /* { dg-final { scan-rtl-dump-times {\(compare:CC \(and:SI \(subreg:SI \(reg:DI} 1 "combine" } } */ I tested it and it is fine on all sub-targets. Thanks. On 20/4/2022 上午 5:06, Segher Boessenkool wrote: > On Tue, Apr 19, 2022 at 04:05:06PM +0800, HAO CHEN GUI wrote: >> I tested the test case on Linux and AIX with both big and little endian. >> The test case requires lp64 target, so it won't be tested on 32-bit targets. >> >> On big endian (both AIX and Linux), it should match >> (compare:CC (and:SI (subreg:SI (reg:DI 207) 4) >> >> On little endian (both AIX and Linux), it should match >> (compare:CC (and:SI (subreg:SI (reg:DI 207) 0) >> >> So, the pattern in my patch should work fine. >> >> /* { dg-final { scan-rtl-dump-times {\(compare:CC \(and:SI \(subreg:SI >> \(reg:DI} 1 "combine" } } */ > > On powerpc64-linux: > > FAIL: gcc.target/powerpc/pr56605.c scan-rtl-dump-times combine "\\(compare:CC > \\((?:and|zero_extend):(?:[SD]I) \\((?:sub)?reg:[SD]I" 1 > > It matches twice instead of once, namely: > > (insn 19 18 20 2 (parallel [ > (set (reg:CC 208) > (compare:CC (and:SI (subreg:SI (reg:DI 207) 4) > (const_int 3 [0x3])) > (const_int 0 [0]))) > (set (reg:SI 129 [ prolog_loop_niters.5 ]) > (and:SI (subreg:SI (reg:DI 207) 4) > (const_int 3 [0x3]))) > ]) 208 {*andsi3_imm_mask_dot2} > (nil)) > > (insn 81 80 82 11 (parallel [ > (set (reg:CC 232) > (compare:CC (and:DI (subreg:DI (reg:SI 136 [ niters.6 ]) 0) > (const_int 7 [0x7])) > (const_int 0 [0]))) > (clobber (scratch:DI)) > ]) 207 {*anddi3_imm_mask_dot} > (expr_list:REG_DEAD (reg:SI 136 [ niters.6 ]) > (nil))) > > The paradoxical subreg in the latter wasn't expected :-) > > > Segher