[PATCH] combine: Do not combine moves from hard registers
Jeff Law
law@redhat.com
Mon Oct 22 22:07:00 GMT 2018
On 10/22/18 2:17 PM, Segher Boessenkool wrote:
> On most targets every function starts with moves from the parameter
> passing (hard) registers into pseudos. Similarly, after every call
> there is a move from the return register into a pseudo. These moves
> usually combine with later instructions (leaving pretty much the same
> instruction, just with a hard reg instead of a pseudo).
>
> This isn't a good idea. Register allocation can get rid of unnecessary
> moves just fine, and moving the parameter passing registers into many
> later instructions tends to prevent good register allocation. This
> patch disallows combining moves from a hard (non-fixed) register.
>
> This also avoid the problem mentioned in PR87600 #c3 (combining hard
> registers into inline assembler is problematic).
>
> Because the register move can often be combined with other instructions
> *itself*, for example for setting some condition code, this patch adds
> extra copies via new pseudos after every copy-from-hard-reg.
>
> On some targets this reduces average code size. On others it increases
> it a bit, 0.1% or 0.2% or so. (I tested this on all *-linux targets).
>
> I'll commit this to trunk now. If there are problems, please don't
> hesitate to let me know! Thanks.
>
>
> Segher
>
>
> 2018-10-22 Segher Boessenkool <segher@kernel.crashing.org>
>
> PR rtl-optimization/87600
> * combine.c: Add include of expr.h.
> (cant_combine_insn_p): Do not combine moves from any hard non-fixed
> register to a pseudo.
> (make_more_copies): New function, add a copy to a new pseudo after
> the moves from hard registers into pseudos.
> (rest_of_handle_combine): Declare rebuild_jump_labels_after_combine
> later. Call make_more_copies.
I know we've gone back and forth on this stuff through the years,
particularly for targets with likely-to-spilled classes that are used
for register passing/return values.
I'm certainly willing to go with this as general guidance. I wouldn't
be surprised if we find that things like CSE, fwprop and other passes
need twiddling over time to mimick what you're doing in combine.
jeff
More information about the Gcc-patches
mailing list