A reload inheritance bug
Mark Shinwell
shinwell@codesourcery.com
Wed May 30 16:47:00 GMT 2007
Bernd Schmidt wrote:
>> insn 5301: (set (reg/f:SI 4082) (reg/f:SI 3275))
>>
>> insn 5291 (set (reg:DF 4078])
>> (mem/s:DF (plus:SI (reg/f:SI 3275) (reg:SI 3812))))
>> REG_DEAD 3275
>>
>> insn 5314 (set (reg:DF 4096)
>> (mem/s:DF (plus:SI (reg/f:SI 4082) (reg:SI 4084))))
>
>> After reload we end up with the following. I've added dividers to show
>> the correspondence with the insns above.
>>
>> insn 5301 (set (mem/f/c:SI (plus:SI (reg/f:SI 13 sp) (const_int 12)))
>> (reg/f:SI 9 r9 [3275]))
>> ---
>> insn 6675 (set (reg:SI 9 r9)
>> (plus:SI (reg/f:SI 9 r9 [3275]) (reg:SI 10 sl [3812])))
>>
>> insn 5291 (set (reg:DF 75 s12 [4078])
>> (mem/s:DF (reg:SI 9 r9)))
>> ---
>> insn 6680 (set (reg:SI 1 r1) (const_int 4928))
>>
>> insn 6681 (set (reg:SI 1 r1)
>> (plus:SI (reg/f:SI 9 r9 [3275]) (reg:SI 1 r1)))
>>
>> insn 5314 (set (reg:DF 75 s12 [4096])
>> (mem/s:DF (reg:SI 1 r1)))
>>
>> We see here how pseudo 3275 was allocated to r9 and pseudo 4082 was
>> spilled to the stack. At insn 5291, r9 has been allocated [*] as the
>> reload register since pseudo 3275 dies in that instruction; at insn
>> 5314 we see the then-incorrect use of r9 (in instruction 6681)
>> for the value of pseudo 4082. Note also how the dump shows that the
>> compiler thinks r9 still holds the value of pseudo 3275 at insn 6681.
>
> Presumably this is one thing that is mildly unusual - R9 being chosen in
> find_reloads already. This wouldn't happen later, since it's in
> reg_used_in_insn and therefore disallowed.
Sorry for the delay in replying -- hectic week!
As you say, one unusual thing about this situation must be the fact
that the reload register is getting chosen by the code in
push_reload heralded by "If this is an input reload and the operand
contains a register that dies in this insn and is used nowhere else,
see if it is the right class to be used for this reload. Use it if so."
etc. I suspect it is the conjunction of this code and the behaviour of
reload in choosing r9 for pseudo 4082 in insn 5314 above that causes the
problem.
I don't entirely follow your example below...
> Still, assume a similar sequence
>
> insn 5301: (set (reg/f:SI 4082) (reg/f:SI 3275))
>
> insn 5291 (set (reg:DF 4078])
> (unspec:DF (mem/s:DF (plus:SI (reg/f:SI 3275)
> (reg:SI 3812)))
> (reg:SI 3275)))
> REG_DEAD 3275
>
> <some other insn where R9 is used for an input reload>
>
> insn 5314 (set (reg:DF 4096)
> (mem/s:DF (plus:SI (reg/f:SI 4082) (reg:SI 4084))))
>
> Here, we wouldn't use R9 as reload register in 5291
...since here, as far as I understand it, the clause mentioned above
in push_reload wouldn't select r9 to use as a reload register for
5291. My gut feeling is that this example will work as a consequence.
(Perhaps you're getting at the fact that the decision procedure leading
us to choose r9 for pseudo 4082 in insn 5314 might be at fault instead?
Even if so, I still suspect it's the reuse of a hard reg in an insn with
a REG_DEAD note for the corresponding pseudo that is the real cause
because it upsets the later code -- that's what my patch was trying to
correct.)
Mark
More information about the Gcc
mailing list