Message ID | ec89f5d3188b7d2548e562cf027e0361813317a5.1471026414.git.segher@kernel.crashing.org |
---|---|
State | New |
Headers | show |
On 08/12/2016 12:38 PM, Segher Boessenkool wrote: > Hi! > > 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. jeff
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
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c index 880eee0..a5dca86 100644 --- a/gcc/lra-constraints.c +++ b/gcc/lra-constraints.c @@ -3452,6 +3452,13 @@ simple_move_p (void) lra_assert (curr_insn_set != NULL_RTX); dest = SET_DEST (curr_insn_set); src = SET_SRC (curr_insn_set); + + /* If the instruction has multiple sets we need to process it even if it + is single_set. This can happen if one or more of the SETs are dead. + See PR73650. */ + if (multiple_sets (curr_insn)) + return false; + return ((dclass = get_op_class (dest)) != NO_REGS && (sclass = get_op_class (src)) != NO_REGS /* The backend guarantees that register moves of cost 2