This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Could not identify that register is clobbered already


[Removing avr-gcc-list from CC because there is no need to cross-post]

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...


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]