> -----Original Message-----
> From: Ulrich Weigand [mailto:uweig...@de.ibm.com]
> Sent: 17 December 2010 18:48
> To: Bingfeng Mei
> Cc: i...@google.com; gcc@gcc.gnu.org; gcc-patc...@gcc.gnu.org
> Subject: Re: Is eliminate_regs_in_insn allowed to generate invalid
> instruction?
> 
> Bingfeng Mei wrote:
> 
> > I think I found the cause. find_reloads_address returns 0 even
> > it reloads both parts of address (see the patch). Therefore,
> > corresponding address_reloaded[i] is not set and in
> > the following code of find_reloads,
> >
> >    if (EXTRA_CONSTRAINT_STR (operand, c, p))
> >     win = 1;
> > /* If the address was already reloaded,
> >    we win as well.  */
> >    else if (MEM_P (operand)
> >           && address_reloaded[i] == 1) <-- address_reloaded[i] still
> 0
> >      win = 1;
> >     ...
> >
> > Extra reload is thus generated even it is unnecessary
> > and causes ICE.
> 
> As Ian said, since the address wasn't *completely* reloaded (so that
> after reload we'll have just a plain base register), it is correct
> that address_reloaded must be 0.
> 
> However, if you're running into problems in this part of the code, you
> may probably hit another of the long-standing warts in reload: at this
> point, you have an address that reload has already decided to reload
> certain parts of, and the result has to match one of your port's
> extra memory constraints.  However, reload at this point has not
> actually made any modifications to the address in its RTL form, it
> has just recorded in its own tables that *later*, it *will* replace
> some subexpressions of that RTL with registers.
> 
> This means that the RTL that is passed to your EXTRA_CONSTRAINT_STR
> implementation will still be the *original* un-reloaded address.
> And most likely, your back-end will then reject this address as
> not valid for your machine.
> 

Thanks, that is exactly what I see. But is only EXTRA_CONSTRAINT_STR
that suffers this issue? It sounds that normal memory constraint should
have this problem too. 

> The way some ports take around this issue is to recognize, in your
> EXTRA_CONSTRAINT_STR implementation, certain forms of complex
> addresses as those which you *know* reload will already have marked
> for reloading, and therefore *accept* them (if they'd otherwise
> match the constraint).
> 
> Bye,
> Ulrich
> 
> --
>   Dr. Ulrich Weigand
>   GNU Toolchain for Linux on System z and Cell BE
>   ulrich.weig...@de.ibm.com

Bingfeng

Reply via email to