On Tue, Feb 26, 2019 at 10:07:54AM -0700, Jeff Law wrote:
> As we enter regcprop we have the following horrific RTL:
> >> (insn 35 7 36 2 (set (reg:DI 2 $2 [orig:200 x ] [200])
> >> (const_int 0 [0])) "j.c":8:49 313 {*movdi_64bit}
> >> (nil))
> >> (insn 36 35 10 2 (set (reg:DI 3 $3 [ x+8 ])
> >> (const_int 0 [0])) "j.c":8:49 313 {*movdi_64bit}
> >> (nil))
> >> (insn 10 36 11 2 (set (reg:DI 2 $2 [orig:200 x ] [200])
> >> (reg:DI 4 $4 [206])) "j.c":8:49 313 {*movdi_64bit}
> >> (nil))
> >> (insn 11 10 37 2 (set (reg:DI 3 $3 [ x+8 ])
> >> (const_int 0 [0])) "j.c":8:49 313 {*movdi_64bit}
> >> (nil))
where 35+36 used to be a single set in TImode:
insn_cost 4 for 29: r200:TI=0
insn_cost 4 for 10: r200:TI#0=r197:DI
REG_DEAD r197:DI
insn_cost 4 for 11: r200:TI#8=0
I would hope combine could clean this up, and it tried, but
Trying 29, 10 -> 11:
29: r200:TI=0
10: r200:TI#0=r206:DI
REG_DEAD r206:DI
11: r200:TI#8=0
Can't combine i2 into i3
This is because i2 (that's insn 10) has a subreg on the LHS.
> You'll note there's a fair amount of obviously dead code. The dead code
> really hampers regcprop's ability to propagate values.
And prevents all of the RTL optimisers before it from doing any useful
work. Ideally this should be fixed much earlier. Not that your patch
isn't pretty obviously correct :-)
[ I don't see any problems with -O2 btw, only with -O1, so should we care
at all anyway? ]
Segher