diff options
author | segher <segher@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-08-15 16:17:21 +0000 |
---|---|---|
committer | segher <segher@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-08-15 16:17:21 +0000 |
commit | 532322d3883478c66425443314d5dbe764497a16 (patch) | |
tree | 52262637556ee25a677df422ac164d71edacb802 | |
parent | 4e2d3fab6dbb00bce42a2acfb1db50b6b9215f3b (diff) | |
download | gcc-532322d3883478c66425443314d5dbe764497a16.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@239483 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/lra-constraints.c | 7 |
2 files changed, 13 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dc7e8cbc451..fa52700c953 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +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> PR driver/72765 diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c index 213e408c08b..053a65aa404 100644 --- a/gcc/lra-constraints.c +++ b/gcc/lra-constraints.c @@ -3493,6 +3493,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 |