https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93738
--- Comment #13 from Kishan Parmar <kishan at gcc dot gnu.org> ---
Big Endian Target
==================
(insn 10 9 11 2 (set (reg:SI 124)
(and:SI (lshiftrt:SI (subreg:SI (reg:DI 129 [ x+-4 ]) 4) (const_int 12
[0xc]))
(const_int 3840 [0xf00]))) 246 {*rotlsi3_mask}
(insn 13 11 14 2 (set (reg:SI 127)
(and:SI (reg:SI 125 [+-2 ])
(const_int -3841 [0xfffffffffffff0ff]))) 211 {andsi3_mask}
(insn 14 13 15 2 (set (reg:SI 128)
(ior:SI (reg:SI 127)
(reg:SI 124))) "../testcase/testcase.c":10:7 226 {*boolsi3}
Operand of 10 gets converted to below insn
(and:SI (subreg:SI (lshiftrt:DI (reg:DI 129 [ x+-4 ])
(const_int 12 [0xc])) 4)
(const_int 3840 [0xf00]))
And at end we are creating below final pattern which failed to match
(set (reg:SI 128)
(ior:SI (and:SI (reg:SI 125 [+-2 ])
(const_int -3841 [0xfffffffffffff0ff]))
(and:SI (subreg:SI (zero_extract:DI (reg:DI 129 [ x+-4 ])
(const_int 32 [0x20])
(const_int 20 [0x14])) 4)
(const_int 3840 [0xf00]))))
Failed to match this instruction:
(set (reg:SI 128)
(ior:SI (and:SI (reg:SI 125 [+-2 ])
(const_int -3841 [0xfffffffffffff0ff]))
(and:SI (subreg:SI (and:DI (lshiftrt:DI (reg:DI 129 [ x+-4 ])
(const_int 12 [0xc]))
(const_int 4294967295 [0xffffffff])) 4)
(const_int 3840 [0xf00]))))
Failed to match this instruction:
(set (reg:DI 127 [+-4 ])
(zero_extract:DI (reg:DI 129 [ x+-4 ])
(const_int 32 [0x20])
(const_int 20 [0x14])))
Successfully matched this instruction:
(set (reg:DI 127 [+-4 ])
(and:DI (lshiftrt:DI (reg:DI 129 [ x+-4 ])
(const_int 12 [0xc]))
(const_int 4294967295 [0xffffffff])))
Successfully matched this instruction:
(set (reg:SI 128)
(ior:SI (and:SI (reg:SI 125 [+-2 ])
(const_int -3841 [0xfffffffffffff0ff]))
(and:SI (subreg:SI (reg:DI 127 [+-4 ]) 4)
(const_int 3840 [0xf00]))))
allowing combination of insns 10, 13 and 14
original costs 4 + 4 + 4 = 12
replacement costs 4 + 4 = 8
deferring deletion of insn with uid = 10.
modifying insn i2 13: r127:DI=r129:DI 0>>0xc&0xffffffff
REG_DEAD r129:DI
deferring rescan insn with uid = 13.
modifying insn i3 14: r128:SI=r125:SI&0xfffffffffffff0ff|r127:DI#4&0xf00
Before r9-3594 scenario (gcc-8)
==============================
subreg:SI (reg:DI %r3) get converted to (reg:SI 3 %r3), since it is hard
register,
which can be simplified.
Later On,
(insn 10 9 11 2 (set (reg:SI 128)
(and:SI (lshiftrt:SI (reg:SI 3 %r3 [ x ])
(const_int 12 [0xc]))
(const_int 3840 [0xf00]))) 240 {*rotlsi3_mask}
(insn 13 11 14 2 (set (reg:SI 131)
(and:SI (reg:SI 129 [+-2 ])
(const_int -3841 [0xfffffffffffff0ff]))) 206 {andsi3_mask}
(insn 14 13 15 2 (set (reg:SI 132)
(ior:SI (reg:SI 131)
(reg:SI 128))) 220 {*boolsi3}
Trying 13, 10 -> 14:
13: r131:SI=r129:SI&0xfffffffffffff0ff
REG_DEAD r129:SI
10: r128:SI=%r3:SI 0>>0xc&0xf00
REG_DEAD %r3:DI
14: r132:SI=r131:SI|r128:SI
REG_DEAD r131:SI
REG_DEAD r128:SI
Successfully matched this instruction:
(set (reg:SI 132)
(ior:SI (and:SI (reg:SI 129 [+-2 ])
(const_int -3841 [0xfffffffffffff0ff]))
(and:SI (lshiftrt:SI (reg:SI 3 %r3 [ x ])
(const_int 12 [0xc]))
(const_int 3840 [0xf00]))))