aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorWilco Dijkstra <wdijkstr@arm.com>2014-09-12 09:29:16 +0000
committerJiong Wang <jiwang@gcc.gnu.org>2014-09-12 09:29:16 +0000
commite533e26c0afe3a117418acc65ccaae536f59f105 (patch)
tree7d0f63c269288ae9656953b28230f8b047a3d065 /gcc
parent6ead0238de25faf67f38a61ac5cacde8125d9fa2 (diff)
downloadgcc-e533e26c0afe3a117418acc65ccaae536f59f105.zip
gcc-e533e26c0afe3a117418acc65ccaae536f59f105.tar.gz
gcc-e533e26c0afe3a117418acc65ccaae536f59f105.tar.bz2
[Ree] Ensure inserted copy don't change the number of hard registers
2014-09-12 Wilco Dijkstra <wilco.dijkstra@arm.com> gcc/ * ree.c (combine_reaching_defs): Ensure inserted copy don't change the number of hard registers. From-SVN: r215205
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/ree.c10
2 files changed, 14 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4b70dd5..4d43c39 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2014-09-12 Wilco Dijkstra <wilco.dijkstra@arm.com>
+
+ * gcc/ree.c (combine_reaching_defs): Ensure inserted copy don't change
+ the number of hard registers.
+
2014-09-12 Alexander Ivchenko <alexander.ivchenko@intel.com>
Maxim Kuznetsov <maxim.kuznetsov@intel.com>
Anna Tikhonova <anna.tikhonova@intel.com>
diff --git a/gcc/ree.c b/gcc/ree.c
index 1431b7a..a58f114 100644
--- a/gcc/ree.c
+++ b/gcc/ree.c
@@ -743,6 +743,14 @@ combine_reaching_defs (ext_cand *cand, const_rtx set_pat, ext_state *state)
if (!SCALAR_INT_MODE_P (GET_MODE (SET_DEST (PATTERN (cand->insn)))))
return false;
+ enum machine_mode dst_mode = GET_MODE (SET_DEST (PATTERN (cand->insn)));
+ rtx src_reg = get_extended_src_reg (SET_SRC (PATTERN (cand->insn)));
+
+ /* Ensure the number of hard registers of the copy match. */
+ if (HARD_REGNO_NREGS (REGNO (src_reg), dst_mode)
+ != HARD_REGNO_NREGS (REGNO (src_reg), GET_MODE (src_reg)))
+ return false;
+
/* There's only one reaching def. */
rtx_insn *def_insn = state->defs_list[0];
@@ -792,7 +800,7 @@ combine_reaching_defs (ext_cand *cand, const_rtx set_pat, ext_state *state)
start_sequence ();
rtx pat = PATTERN (cand->insn);
rtx new_dst = gen_rtx_REG (GET_MODE (SET_DEST (pat)),
- REGNO (XEXP (SET_SRC (pat), 0)));
+ REGNO (get_extended_src_reg (SET_SRC (pat))));
rtx new_src = gen_rtx_REG (GET_MODE (SET_DEST (pat)),
REGNO (SET_DEST (pat)));
emit_move_insn (new_dst, new_src);