2010/1/27 fanqifei <fanqi...@gmail.com>:
> 2010/1/25 Ulrich Weigand <uweig...@de.ibm.com>:
>> Qifei Fan wrote:
>>
>>> > But insn#479 is not recognized by recog() in insn-recog.c and the
>>> > compilation failed. (recog only recognizes RTL defined in md, right?)
>>> > Here the backtrace is
>>> > reload--->cleanup_subreg_operands--->extract_insn_cached--->extract_insn-=
>>> -->recog_memoized--->recog.
>>> > There is no machine instruction(r3=3Dr1*4+r2) match the pattern of
>>> > insn#479. Though there is pattern r3=3Dmem(r1*4+r2).
>>> > I don=92t quite understand the generation of reload information.
>>
>> There's two issues here.  The first issue is that reload makes the
>> fundamental assumption that everything that is a valid address, can
>> be loaded into a register as well, if necessary.  On many platforms
>> this is true, either because there is some sort of "load address"
>> instruction, or because the form of valid addresses matches standard
>> arithmetic instruction patterns.  Reload will simply emit a naked
>> "set" of some register to the address -- if the back-end doesn't
>> support that, you'll get the failure you saw.
>>
>> If this doesn't work on your particular platform, you could either
>> try to set things up so that reload never thinks it needs to reload
>> an address (but this may be difficult to achieve).  The safe option
>> would be to tell reload how to achieve computing an address by
>> providing a "secondary reload" pattern.  See e.g. s390_secondary_reload
>> (in config/s390/s390.c) and the associated "reload<mode>_plus" pattern.
>>
>> The second issue is as you notice here:
>>
>>> Actually the second reload is not needed if there is already the first relo=
>>> ad.
>>> If (plus:SI (reg/f:SI 16 SP)  (const_int 96 [0x60]) is replaced by
>>> (reg:SI 12 a12), then (plus:SI (mult:SI (reg:SI 9 a9 [204])
>>> (const_int 4 [0x4])) (reg:SI 12 a12) ) is a valid memory address.
>>> But in function find_reloads, I can=92t find the related code that
>>> deciding whether the second reload should be generated by regarding
>>> the previous reload.  The function is too complex. :-(
>>
>> The first reload, loading sp + 96 into a register, is generated from
>> within find_reloads_address.  After this is done, it is assumed that
>> the address is now valid.
>>
>> However, something else later in find_reloads apparently assumes there
>> is still some problem with the operand, and decides to reload the
>> whole address.  It is hard to say exactly what the problem is, without
>> seeing the insn constraints, but the most likely cause seems to be that
>> this instruction pattern does not have a general "m" constraint, but
>> a more restricted memory constraint.
>>
>> If this is the case, the back-end procedure called to verify the
>> constraint probably rejects it.  This runs into another fundamental
>> assumption reload makes: it assumes such procedures take other
>> actions done by reload into account implicitly.  This means the
>> constraint checker ought to *accept* addresses of the form
>>   reg*const + (sp + const)
>> because it ought to know that reload will already load the (sp + const)
>> into a register anyway.
>>
>> If this is *not* the case, please send me the instruction pattern
>> and constraints for the insn pattern that matched insn 320 before
>> reload so I can investigate in more detail.
>>
>> (Please note that I'm currently travelling with restricted access
>> to email, so it might be a couple of days before I'm able to reply;
>> sorry ...)
>>
>> Bye,
>> Ulrich
>>
>> --
>>  Dr. Ulrich Weigand
>>  GNU Toolchain for Linux on System z and Cell BE
>>  ulrich.weig...@de.ibm.com
>>
>
> For the second issue, there is indeed a strict constraint(back-end
> procedure) that rejects the pattern.
> The back-end procedure is composed of macros like
> EXTRA_MEMORY_CONSTRAINT/EXTRA_CONSTRAINT. These macros are defined in
> config/cpu.c and used in around Line3376 of reload.c(gcc4.3.2).
> So it's the constraint checker's job to know whether reload will load
> the (sp+const) into a register and use such information to decide
> whether to accept the pattern or not, right?
> Is there any other architecture which checks address by using previous
> determined reload info?
> I think this may be the proper way to resolve this problem. It may be
> easy to implement too.
>
> I will dig into all the issues and possible options, and provide more
> information later.
> As I am not familiar with it, it may take some time.
>
> Thanks very much!!
> -Qifei Fan
>
I have modified the constraint checker in which previous generated
reloads are considered.
Now the error is gone, from the result of reload I can see that the
reload is correct.
However the instruction is not in the final assembly code. It may be
optimized away.
So I am not sure this change is really correct.

-Qifei Fan

Reply via email to