Could not identify that register is clobbered already
Georg-Johann Lay
avr@gjlay.de
Fri Feb 22 15:18:00 GMT 2013
S, Pitchumani schrieb:
>
> From: Georg-Johann Lay
>> S, Pitchumani wrote:
>>
>>> I was analyzing an issue for avr target (gcc-4.7.2).
>>>
>>> Issue is that already clobbered register is used after the
>>> transformation in post reload pass.
>>>
>>> insns after reload pass:
>>>
>>> set (reg:HI r24
>>> (const:HI (plus:HI (symbol_ref:HI ("array"))
>>> (const_int 4))
>>> ))
>>> ...
>>> parallel set (reg:HI r14
>>> (and:HI (reg:HI r14)
>>> (const_int 3)))
>>> clobber:QI r25
>>> ...
>>> set (reg:HI r28
>>> (const:HI (plus:HI (symbol_ref:HI ("array"))
>>> (const_int 4))
>>> ))
>>>
>>> After post reload pass, insn-3 transformed as follows:
>>>
>>> set (reg:HI r28
>>> reg:HI r24)
>>>
>>> this transformation happened in reload_cse_move2add function.
>>>
>>> Since r25 is clobbered in insn-2, above transformation (r28/29 <=
>>> r24/25)
>>> become incorrect.
>> You have a test case so that this can be reproduced?
>>
>>> Function 'move2add_use_add3_insn' sets only r24 info for insn-1 instead
>>> of setting info for both r24/25. Function 'validate_change' checks only
>>> r24
>>> info for insn-3 transformation.
>>> is it possible to identify clobbered register and avoid transformation?
>> Some passes assume that the frame pointer only spans one register, which
>> does not hold for the avr target where FP lives in R28/R29.
>>
>> Trying to introduce hard_frame_pointer was dropped because the code
>> turned out to have unusable had efficiency. I don't find the patch,
>> AFAIR it is Denis' work, thus CCing him.
>>
>> But without a test case nobody can tell...
>
> This behavior is observed for dejagnu test case "gcc.dg/var-expand2.c" when
> gcc-4.7.2 is used.
>
> Options used: -O2 -funroll-loops -ffast-math -mmcu=atxmega128b1
The generated code is wrong. You can file a PR. Thanks.
More information about the Gcc
mailing list