This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] lra: A multiple_sets is not a simple_move_p (PR73650)
- From: Segher Boessenkool <segher at kernel dot crashing dot org>
- To: gcc-patches at gcc dot gnu dot org
- Cc: vmakarov at redhat dot com, Segher Boessenkool <segher at kernel dot crashing dot org>
- Date: Fri, 12 Aug 2016 18:38:35 +0000
- Subject: [PATCH] lra: A multiple_sets is not a simple_move_p (PR73650)
- Authentication-results: sourceware.org; auth=none
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.
---
gcc/lra-constraints.c | 7 +++++++
1 file changed, 7 insertions(+)
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
--
1.9.3