[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