aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSegher Boessenkool <segher@kernel.crashing.org>2016-08-15 18:17:21 +0200
committerSegher Boessenkool <segher@gcc.gnu.org>2016-08-15 18:17:21 +0200
commit2008be405c16e8b7ca5399fb9e6fb25aa92f03a3 (patch)
tree52262637556ee25a677df422ac164d71edacb802 /gcc
parent5c578ae4348bddb97991348c2d0a05e3e7d7ad5a (diff)
downloadgcc-2008be405c16e8b7ca5399fb9e6fb25aa92f03a3.zip
gcc-2008be405c16e8b7ca5399fb9e6fb25aa92f03a3.tar.gz
gcc-2008be405c16e8b7ca5399fb9e6fb25aa92f03a3.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/lra-constraints.c7
2 files changed, 13 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index dc7e8cb..fa52700 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 213e408..053a65a 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