Hi Richard,
On Fri, Dec 13, 2019 at 10:31:54PM +0000, Richard Sandiford wrote:
> >> I didn't say it was combine's fault that RA was bad. I said it was
> >> combine's fault that we have two pseudos rather than one.
See below.
> My point was the extra pseudo<-pseudo2 move is created by combine for
> its own internal purposes
And my point is that it is *not* internal purposes :-) This is done
because we no longer combine with the hard register, but combining with
just a register move is quite beneficial for many targets.
We could (and probably should) do a 1->1 combine first, i.e. just
simplification for every single insn, but that causes other problems
right now. GCC 11, I hope.
What happens is we have this:
insn_cost 4 for 14: r44:SF=r22:SF
REG_DEAD r22:SF
insn_cost 4 for 2: r43:SF=r44:SF
REG_DEAD r44:SF
insn_cost 4 for 6: r22:SF=r43:SF
REG_DEAD r43:SF
insn_cost 0 for 7: r22:SF=call [`g'] argc:0
REG_CALL_DECL `g'
(where insn 14 and r44 are created by make_more_copies).
Now, insn 14 would normally be combined into insn 2. But this doesn't
happen because the target prohibits it, with the
targetm.class_likely_spilled_p in cant_combine_insn_p.
I wonder if we still need that at all?
Segher