This is the mail archive of the
mailing list for the GCC project.
Re: input address reload issue
- From: Segher Boessenkool <segher at kernel dot crashing dot org>
- To: Aurelien Buhrig <aurelien dot buhrig dot gcc at gmail dot com>
- Cc: gcc at gcc dot gnu dot org
- Date: Fri, 6 Jan 2017 02:50:52 -0600
- Subject: Re: input address reload issue
- Authentication-results: sourceware.org; auth=none
- References: <firstname.lastname@example.org>
On Thu, Jan 05, 2017 at 05:18:46PM +0100, Aurelien Buhrig wrote:
> The issue happens when reloading:
> (set (reg:QI 47 [ _9 ])
> (mem:QI (plus:SI (reg/v/f:SI 68 [orig:51 in ] )
> (const_int 1 [0x1])
> My understanding is that IRA allocates hardregs to allocno which are
> replaced by the reload pass which generates new reloads or spills regs
> when needed, right?
Yes. IRA chooses what hard registers to us where, or memory (i.e. no
register) if that seems best (for example if it ran out of registers).
Then afterwards reload / LRA fixes up everything that isn't valid.
> Here the IRA chooses a reg (named r2)which makes the mem address not
> legitimate. Is it valid to allocate a reg which makes non legitimate
reload will (or should ;-) ) fix it, but it would of course be better if
IRA could make valid code immediately.
> Assuming it is, my understanding is that the reload chooses a legitimate
> reg (named a0 here) and shall emit insns (in emit_reload_insns) to set
> a0 correctly (RELOAD_FOR_INPUT_ADDRESS). Right?
> So the insn:
> (set (reg:QI 0 r0) (mem:QI (plus:SI (reg:SI 2 r2)(const_int 1))
> is transformed into:
> (set (reg:SI 8 a0) (reg:SI 2 r2))
> (set (reg:SI 8 a0) (const_int 1))
> (set (reg:SI 8 a0) (plus:SI (reg:SI 8 a0) (reg:SI 8 a0)))
> (set (reg:QI 0 r0) (mem:QI (reg:SI 8 a0))
That second instruction kills the result of the first, that is bad. It
doesn't do anything useful in the first place. Maybe the first and the
third instructions could be combined as well, or the third and the fourth,
but I don't know your target.
> This "basic" transformation requires two reload regs, but only one is
> given/used/possible from the rl structure (in emit_reload_insns).
> So where does the issue comes from? The need for 2 reload regs, the
> transformation which is too "basic" and could be optimized to use only
> one reload reg, or any wrong/missing reload target hook?
Look at the dump file for reload to see where things come from. Also
everything Jeff said; you really want LRA.