On 11/09/14 21:10, Jeff Law wrote:
On 09/08/14 11:21, Wilco Dijkstra wrote:
Anyway here is the modified check:
Thanks. Just needs an updated ChangeLog and it's good for the trunk.
committed to trunk on behalf of Wilco as r215205 after pass bootstrapping.
2014-09-12 Wilco Dijkstra <wilco.dijks...@arm.com>
* gcc/ree.c (combine_reaching_defs): Ensure inserted copy don't change
the number of hard registers.
Index: gcc/ree.c
===================================================================
--- gcc/ree.c (revision 215204)
+++ gcc/ree.c (working copy)
@@ -743,6 +743,14 @@
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 @@
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);