On Oct 28, 2013, at 4:20 PM, Vladimir Makarov <vmaka...@redhat.com> wrote:
>        * lra-spills.c (lra_final_code_change): Remove useless move insns
>        originated from moves of pseudos.

So I was facing a problem of extraneous moves of multiple registers:

(set (reg:TI 1) (mem …))

===

(set (reg:DI 2) (subreg:DI 1 0))
(set (reg:DI 3) (subreg:DI 1 8)) (dead (reg 1))

(set (subreg:DI (reg:TI 4) 0) (reg:DI 2)) (dead (reg 2))
(set (subreg:DI (reg:TI 4) 8) (reg:DI 3)) (dead (reg 3))

===

(set (mem …) (reg:TI 4))

and I thought I would try out LRA to see if it would notice that the subregs 
completely cover the original data, and that the ordering of subregs was the 
same.  All the instructions between the === pair are extraneous and can be 
eliminated and the registers 1 and 4 can be assigned to the same physical 
register by LRA.  Any thoughts on how to structure the emitted code in the port 
to try and help LRA out so that it can eliminate the extra moves (when 
possible)?  In the general case, the data motions can be necessary and there 
can be arbitrary operations on the data in flight, so I have to generate the 
moves.  The above is the degenerate case where the data is merely moved from 
point a to point b.  The moves are generated as part of the expansion of the 
instructions outside the ===.

If you can enhance lra to notice the subregs completely cover the value and 
that the lifetimes of the two don't overlap (save to do the copy) and eliminate 
the extraneous moves in the middle and use the same register for 1 and 4, 
that's be wonderful.

I think I can recognize larger chunks of code (the memory to memory move 
directly in this case), and ensure I don't generate the extra moves in the 
first place, but, it just seems like a hack.

Reply via email to