]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[PATCH][REE]Backport "Fix register corruption bug in ree".
authorRenlin Li <renlin.li@arm.com>
Mon, 9 Nov 2015 17:01:00 +0000 (17:01 +0000)
committerRenlin Li <renlin@gcc.gnu.org>
Mon, 9 Nov 2015 17:01:00 +0000 (17:01 +0000)
Ensure inserted copy don't change the number of hard registers.

2015-11-09  Renlin Li  <renlin.li@arm.com>

Backport from mainline
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: r230032

gcc/ChangeLog
gcc/ree.c

index b00b1657e02c6fc9915cc99679bca06764f062d2..07fbdb9370c70d0afd62593937c33afcecd5be18 100644 (file)
@@ -1,3 +1,11 @@
+2015-11-09  Renlin Li  <renlin.li@arm.com>
+
+       Backport from mainline
+       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.
+
 2015-11-02  Martin Jambor  <mjambor@suse.cz>
 
        Backport from mainline
index 67fc9c3b0fb48b05708dde2f8d87ae14b69403d2..7d00d816d4001a7b26f0b15f6331fded98995804 100644 (file)
--- a/gcc/ree.c
+++ b/gcc/ree.c
@@ -793,6 +793,14 @@ combine_reaching_defs (ext_cand *cand, const_rtx set_pat, ext_state *state)
       if (state->modified[INSN_UID (cand->insn)].kind != EXT_MODIFIED_NONE)
        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];
 
@@ -842,7 +850,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);