PR63633: May middle-end come up width hard regs for insn expanders?
Georg-Johann Lay
avr@gjlay.de
Fri Oct 24 18:21:00 GMT 2014
Jeff Law schrieb:
> On 10/24/14 10:29, Jakub Jelinek wrote:
>>
>> But I'd say, if you can't handle hard regs in the operands (either
>> general,
>> or some specific ones), you should
>> force the hard regs into pseudos (all hard regs, or just the problematic
>> ones) in the expander.
>> So in this case, check if they overlap with those 2 regs, and force the
>> input operands into pseudos if they do; the output will be harder, guess
>> you'd need to emit the pattern into a pseudo and emit_move_insn it
>> afterwards to the hard reg.
> I'm pretty sure that's what Georg is going to do, my comment was that
> the existence of the hard register operand _may_ point to something else
> that we would want to fix.
>
> jeff
Yes, that's the straight forward approach which works so far. Bit
tedious, but well...
In one case expmed generated different code, though: divmodhi instead of
mulhi_highpart for HI division by const_int. Cheating with costs did
not help. However for now I am mostly after correct, ICE-less code.
What I am concerned about is:
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.
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?
The point is that the middle-end could know that it is generating bad
code...
Johann
More information about the Gcc
mailing list