Michael Hope <[email protected]> writes:
> My last RTL dump was wrong due to it hitting a zero extend from memory
> optimisation. However, this time test.i.136r.subreg1 contains:
> (insn 7 4 8 2 loads.c:5 (set (reg:SI 32)
> (reg/v/f:SI 30 [ p ])) 6 {movsi} (nil))
>
> (insn 8 7 9 2 loads.c:5 (set (reg:QI 31)
> (mem:QI (post_inc:SI (reg:SI 32)) [0 S1 A8])) 0 {movqi_mem}
> (expr_list:REG_INC (reg:SI 32)
> (nil)))
> This is correct so far, but the next step in test.i.138r.cse1 contains:
> (insn 7 4 8 2 loads.c:5 (set (reg/f:SI 32 [ p ])
> (reg/v/f:SI 30 [ p ])) 6 {movsi} (nil))
>
> (insn 8 7 9 2 loads.c:5 (set (reg:QI 31)
> (mem:QI (post_inc:SI (reg/v/f:SI 30 [ p ])) [0 S1 A8])) 0
> {movqi_mem} (expr_list:REG_INC (reg/f:SI 32 [ p ])
> (nil)))
This substitution is clearly invalid. So there is a bug in CSE. Most
likely this bug has not been noticed before because POST_INC and friends
are normally inserted by the inc_dec pass which runs after CSE.
It may be that all that is needed is to change the cse_insn function to
look for REG_INC notes.
Ian