On Mon, Mar 23, 2020 at 07:46:17AM +0000, Yangfei (Felix) wrote: > I think the problem here is how to make sure we are doing a ***equality*** > comparison with zero. > We can only do the transformation under this condition. > Then I see combine tries the following pattern: > > 173 Failed to match this instruction: > 174 (set (reg:SI 101) > 175 (ne:SI (and:SI (lshiftrt:SI (reg:SI 102) > 176 (const_int 8 [0x8])) > 177 (const_int 6 [0x6])) > 178 (const_int 0 [0])))
Like I said, this should be simplified to (set (reg:SI 10) (ne:SI (and:SI (reg:SI 102) (const_int 1536)) (const_int 0))) > But this cannot match a 'tst' instruction as the above pattern does not > clobber the CC flag register. combine can (and will) add such clobbers itself, if the pattern matches otherwise, so that is not an issue. > > 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. > > But I don't think it's correct for logic in simplify-rtx.c to further > simplify this rtl: > > (compare:CC_NZ (and:SI (lshiftrt:SI (reg:SI 102) > (const_int 8 [0x8])) > (const_int 6 [0x6])) > (const_int 0 [0])) > The reason is that it knows nothing about CC_NZ. Yeah, maybe not in simplify-rtx.c, hrm. There is SELECT_CC_MODE for these things, and combine knows about that (not many passes do). Segher