Reloading failes

Anders Ådland aaadland@atmel.no
Tue Jul 15 11:15:00 GMT 2003


On Mon, 07 Jul 2003 19:18:57 -0700, Jim Wilson <wilson@tuliptree.org> 
wrote:
> andersa@tiscali.no wrote:
>> (set (reg:SI 2 r3)
>> (mem/s:SI (plus:SI (mem:SI (plus:SI (reg/f:SI 6 r7)
>> (const_int -16)))
>> (const_int 4))))
>
> This looks like a REG_OK_STRICT bug in your port.
>
> Normally, pseudo registers can be treated just like a hard register. 
> However, during reload, any pseudo register remaining will be converted 
> to a stack slot, so they must be treated like a MEM instead of like a 
> REG.  This is handled via REG_OK_STRICT.  When REG_OK_STRICT is true, we 
> don't accept pseudo registers.  When REG_OK_STRICT is false, we do accept 
> pseudo registers.
>
> This is handled for you if you things like GO_IF_LEGITIMATE_ADDRESS are 
> macros in the tm.h file.  However, if this calls a function in the target 
> .c file, then you need to manually pass the value of REG_OK_STRICT to the 
> function in the target .c file, and then check the value in that 
> function.  There are many ports that do this already.  I suggest you look 
> at one of them to see how this is done.

Thank you for your help! As you said, I implemented 
GO_IF_LEGITIMATE_ADDRESS to only allow index addressing if REG_OK_STRICT 
wasn't defined. This solved the problem that I was working on at the 
moment. Now it's back. When compiling gcc.c-torture/compile/920611-2.c with 
-Os the same is happening; A pseudo register is replaced by a memory 
reference in reload() in reload1.c. Am I missing something?

(Should I post these kind of messages on gcc or gcc-help?)

Anders



More information about the Gcc mailing list