On Thu, Mar 19, 2020 at 01:43:40AM +0000, Yangfei (Felix) wrote: > 2. Given that the patterns for ubfx and ubfiz are already not simple, I am > afraid the pattern we got by combining the three would be much complex. > And even more complex when further merged with insn 14 here in order to > make sure that we are doing a equality comparison with zero.
It will be just as simple as with the other approach: > > Another approach: > > > > Trying 7 -> 9: > > 7: r99:SI=r103:SI>>0x8 > > REG_DEAD r103:SI > > 9: cc:CC_NZ=cmp(r99:SI&0x6,0) > > REG_DEAD r99:SI > > Failed to match this instruction: > > (set (reg:CC_NZ 66 cc) > > (compare:CC_NZ (and:SI (lshiftrt:SI (reg:SI 103) > > (const_int 8 [0x8])) > > (const_int 6 [0x6])) > > (const_int 0 [0]))) > > > > This can be recognised as just that "tst" insn, no? But combine (or > > simplify-rtx) should get rid of the shift here, just the "and" is simpler > > after all (it > > just needs to change the constant for that). > > No, this does not mean an equality comparison with zero. I have mentioned > this in my previous mail. This should be simplified to (set (reg:CC_NZ 66 cc) (compare:CC_NZ (and:SI (reg:SI 103) (const_int 1536)) (const_int 0))) (but it isn't), and that is just *and<mode>3nr_compare0, which is a "tst" instruction. If this is fixed (in simplify-rtx.c), it will work as you want. Segher