[rfc] multi-word subreg lowering pass
Paul Schlie
schlie@comcast.net
Sat May 7 14:04:00 GMT 2005
> Richard Henderson writes:
> I hadn't posted this yet because I've yet to show real measurable
> improvements in long long arithmetic on x86. I suspect that I
> won't be able to show this until we have a new register allocator.
>
> I'd also planned to restructure this so that it uses recog_data to
> replace values in real operands, rather than replacing subregs
> wherever they may be found.
>
> However, it may be that it's good enough to help the problems that
> AVR is having. If so, I'll go ahead with the rewrite to recog_data.
>
> The Object is to replace (reg:LARGE X) with a set of (reg:WORD Yi).
> We do this when X is only used in decomposible contexts. Such
> contexts are (1) subregs smaller than or equal to word sized and
> (2) in a decomposible moves.
- For a byte word size target like AVR for which UNITS_PER_WORD == 1,
would all operations be decomposed to QI mode operations?
- What effect if any would it's presently necessary lie about it's
word size (i.e. lies within libgcc2 and claims UNITS_PER_WORD == 4
in order to trick it into selecting reasonably correct operand modes)
have on the generated code for functions defined within libgcc2?
> If the target leaves logical arithmetic to the middle end, this
> means that the posted example,
>
> long long foo(int x, long long y)
> {
> return x & y;
> }
>
> will decompose to
>
> (set (reg:SI 100) (reg:SI x))
> (set (reg:SI 101) (const_int 0))
> (set (reg:SI 102) (and:SI (reg:SI 100) (reg:SI ylow)))
> (set (reg:SI 103) (and:SI (reg:SI 101) (reg:SI yhigh)))
> (set (reg:SI eax) (reg:SI 102))
> (set (reg:SI edx) (reg:SI 103))
>
> which after cse and combine will be just perfect.
>
> Where it fails is when the target has patterns that take multi-word
> inputs. In this case we have to stop and leave the data in the
> multi-word pseudo. This approach does have the advantage of being
> able to work incrementally, though it's also true that incomplete
> conversion can hurt
- Out of curiosity, why not leave all decomposed operations in their
subreg form, thereby maintaining the logical integrity of their operand
modes? i.e. the above decomposes to something like:
(set (subreg:SI 100 0) (and:SI (reg:SI x) (subreg:SI y 0)))
(set (subreg:SI 100 1) (and:SI (const_int 0) (subreg:SI y 1)))
which seems both simpler, and does not require introduction of new
semantics which complicate multi-word/sub-reg input operand expressions.
More information about the Gcc-patches
mailing list