2014-10-06 Yvan Roux <yvan.roux@linaro.org>
authoryroux <yroux@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 6 Oct 2014 13:03:24 +0000 (13:03 +0000)
committeryroux <yroux@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 6 Oct 2014 13:03:24 +0000 (13:03 +0000)
Backport from trunk r215205.
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.

git-svn-id: svn://gcc.gnu.org/svn/gcc/branches/linaro/gcc-4_9-branch@215935 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog.linaro
gcc/ree.c

index 1204659..0f96c80 100644 (file)
@@ -1,5 +1,13 @@
 2014-10-06  Yvan Roux  <yvan.roux@linaro.org>
 
+       Backport from trunk r215205.
+       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-10-06  Yvan Roux  <yvan.roux@linaro.org>
+
        Backport from trunk r215136.
        2014-09-10  Xinliang David Li  <davidxl@google.com>
 
index 0d5090b..bdb47af 100644 (file)
--- a/gcc/ree.c
+++ b/gcc/ree.c
@@ -746,6 +746,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 def_insn = state->defs_list[0];
 
@@ -795,7 +803,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);