[PATCH] lra: A multiple_sets is not a simple_move_p (PR73650)
Segher Boessenkool
segher@kernel.crashing.org
Mon Aug 15 16:12:00 GMT 2016
On Mon, Aug 15, 2016 at 09:37:34AM -0600, Jeff Law wrote:
> On 08/12/2016 12:38 PM, Segher Boessenkool wrote:
> >In the PR we have a PARALLEL of a move and a compare (a "mr." instruction).
> >The compare is dead, so single_set on it returns just the move. Then,
> >simple_move_p returns true; but the instruction does need reloads in this
> >case. This patch solves this by making simple_move_p return false for
> >every multiple_sets instruction.
> >
> >Bootstrapped and regression checked on powerpc64-linux (-m64,-m32).
> >Is this okay for trunk?
> >
> >
> >Segher
> >
> >
> >2016-08-12 Segher Boessenkool <segher@kernel.crashing.org>
> >
> > PR rtl-optimization/73650
> > * lra-constraints.c (simple_move_p): If the insn is multiple_sets
> > it is not a simple move.
> OK.
>
> Though I do wonder if it would be advantageous to try and rewrite such
> insns.
Ah, I didn't mention that. I tried that, using code similar to
eliminate_regs_in_insn (lra-eliminations.c, around line 1080, after the
comment starting with "/* First see if this insn remains valid when").
This works, but the REG_UNUSED still remains, and it seems something later
then deletes the remaining insn.
Cleaning up the notes requires some nasty code.
The multiple_sets fits nicely in simple_move_p, which says
/* Return true if the current move insn does not need processing as we
already know that it satisfies its constraints. */
(we could of course move all this to the caller).
Segher
More information about the Gcc-patches
mailing list