Commit 2008be40 by Segher Boessenkool Committed by Segher Boessenkool

lra: A multiple_sets is not a simple_move_p (PR73650)

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.


	PR rtl-optimization/73650
	* lra-constraints.c (simple_move_p): If the insn is multiple_sets
	it is not a simple move.

From-SVN: r239483
parent 5c578ae4
2016-08-15 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.
2016-08-15 Martin Liska <mliska@suse.cz> 2016-08-15 Martin Liska <mliska@suse.cz>
PR driver/72765 PR driver/72765
......
...@@ -3493,6 +3493,13 @@ simple_move_p (void) ...@@ -3493,6 +3493,13 @@ simple_move_p (void)
lra_assert (curr_insn_set != NULL_RTX); lra_assert (curr_insn_set != NULL_RTX);
dest = SET_DEST (curr_insn_set); dest = SET_DEST (curr_insn_set);
src = SET_SRC (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 return ((dclass = get_op_class (dest)) != NO_REGS
&& (sclass = get_op_class (src)) != NO_REGS && (sclass = get_op_class (src)) != NO_REGS
/* The backend guarantees that register moves of cost 2 /* The backend guarantees that register moves of cost 2
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment