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.