PR63633: May middle-end come up width hard regs for insn expanders?
Jeff Law
law@redhat.com
Fri Oct 24 19:23:00 GMT 2014
On 10/24/14 12:19, Georg-Johann Lay wrote:
>
> 1) May it happen that a value lives in a hard-reg across the expander?
> The expander has no means to detect that situation and interfere, e.g.
>
> hard-reg = source_value // middle-end
> expand-code // back-end
> sink_value = hard-reg // middle-end
>
> where "expand-code" is one defind_expand / define_insn that clobbers /
> changes (parts of) hard-reg but does *not* get hard-reg as operand. This
> is wrong code obviously.
This shouldn't be happening, the compiler certainly isn't going to set
up something like this without the user doing something horribly wrong
(see Jakub's reply).
There's no need for you to try and detect this.
>
>
> 2) May later, non-strict-rtl passes also come up with such situations,
> e.g. as they are using the same middle-end functions to emit their code?
>
> One example is expmed.c:expand_divmod() which is called from RTL loop
> optimizers (and stumbles upon PR59559 btw.)
>
> What if no new pseudos are available at that time?
You can create new pseudos pretty much up until register allocation begins.
So, assume you can create a pseudo unless can_create_pseudo() returns
false. If you have a case where an input is a hard reg and there's an
overlapping clobber and !can_create_pseudo_p, then you could ICE or go
to heroic measures to generate code (creating stack slots, shoving
values into the stack slots, generate code, restore from stack slots,
deallocate stack). Choice really depends on the validity of the input
code...
As Jakub states, except for parameter passing it's best to avoid
explicitly mentioned hard registers until allocation. I've never looked
closely at your port, but you might even consider creating a register
class for the set of registers you need to clobber, then clobber a
pseudo of that class. That can often help register allocation.
jeff
More information about the Gcc
mailing list