This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH][4.9]Backport "Fix register corruption bug in ree"
- From: Renlin Li <renlin dot li at arm dot com>
- To: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Cc: marcus Shawcroft <Marcus dot Shawcroft at arm dot com>, Jeff Law <law at redhat dot com>, ramana Radhakrishnan <ramana dot radhakrishnan at arm dot com>
- Date: Fri, 06 Feb 2015 17:48:30 +0000
- Subject: [PATCH][4.9]Backport "Fix register corruption bug in ree"
- Authentication-results: sourceware.org; auth=none
Hi all,
This is a backport patch for branch 4.9. You can find the original patch
here: https://gcc.gnu.org/ml/gcc-patches/2014-09/msg00356.html
And it has been commit on the trunk as r215205.
This fixes a few libstdc++-v3 test suite failures.
x86_64 bootstraps Okay, aarch64_be-none-elf libstdc++-v3 tested Okay.
Okay to commit on branch 4.9?
Regards,
Renlin Li
2015-02-06 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.
diff --git a/gcc/ree.c b/gcc/ree.c
index 67fc9c3..e9ff904 100644
--- 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);