This is the mail archive of the
mailing list for the GCC project.
Re: patch to fix a LRA crash on ppc
- From: Mike Stump <mikestump at comcast dot net>
- To: Vladimir Makarov <vmakarov at redhat dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Tue, 29 Oct 2013 14:45:53 -0700
- Subject: Re: patch to fix a LRA crash on ppc
- Authentication-results: sourceware.org; auth=none
- References: <526EF135 dot 9040303 at redhat dot com>
On Oct 28, 2013, at 4:20 PM, Vladimir Makarov <email@example.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.