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 <seg...@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