diff mbox

[COMMITTED] Fix register corruption bug in ree

Message ID 5412BE3B.9090601@arm.com
State New
Headers show

Commit Message

Jiong Wang Sept. 12, 2014, 9:34 a.m. UTC
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.dijkstra@arm.com>

        * gcc/ree.c (combine_reaching_defs): Ensure inserted copy don't change
        the number of hard registers.


>
diff mbox

Patch

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);