This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Using secondary reload to reload CONST_INT?
- From: Richard Sandiford <richard dot sandiford at linaro dot org>
- To: Georg-Johann Lay <avr at gjlay dot de>
- Cc: gcc at gcc dot gnu dot org
- Date: Wed, 23 Mar 2011 09:23:14 +0000
- Subject: Re: Using secondary reload to reload CONST_INT?
- References: <4D863276.10309@gjlay.de>
Georg-Johann Lay <avr@gjlay.de> writes:
> 1) The internals just mention TARGET_SECONDARY_RELOAD for REG-MEM and
> for REG-REG moves, no word about REG-CONST moves. So is using
> secondary reloads for CONST_INT (or other consts) like outlined
> above a defined use case I can rely on?
Yeah, it should be. Other targets rely on this too. E.g. MIPS allows
integers to be stored in FPRs as well as GPRs, but you can't load a
symbolic constant directly into an FPR; it has to go through a GPR.
> 2) The secondary reload hook is always called with
> regclass = GENERAL_REGS, even in cases where the class
> is known to be NO_LD_REGS like, e.g. when preparing arguments
> for a function call. Why this? I would expect to get the smallest
> available regclass. If a reg lies in LD_REGS, a secondary reload
> is not needed, but how can I know if class is always GENERAL_REGS?
> Is it ensured that secondary reload hook gets never called when
> a constraint alternative matches, like "d,i"?
As far as the last bit goes: once reload has decided that it needs to
reload A into B, it's uses the secondary reload hook (and only that hook)
to decide whether a secondary reload is needed. The movsi constraints
only matter when reloading a pre-reload movsi instruction.
I think the reason you only ever see GENERAL_REGS being passed in is
because (from a quick look at avr.md) very few non-move patterns use
the "d" and "l" constraints. They all seem to use the "r" constraint.
Thus reloads from those instructions will use GENERAL_REGS rather than
NO_LD_REGS.
If you want to make reload use NO_LD_REGS for these GENERAL_REGS reloads,
at least when the reloaded value is a constant, then it might be worth
defining TARGET_PREFERRED_RELOAD_CLASS.
> 3) What is the "unit" of sri->extra_cost? Compared to COST_N_INSNS?
> Or compared to "?" constraint cost?
I think it's measured in the same units as REGISTER_MOVE_COST.
(2 == a simple register move).
Richard