From: Renlin Li Date: Mon, 9 Nov 2015 17:01:00 +0000 (+0000) Subject: [PATCH][REE]Backport "Fix register corruption bug in ree". X-Git-Tag: releases/gcc-4.9.4~519 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b6b6a3bcdcb554a8cf6173afc522bf2950aa31e9;p=thirdparty%2Fgcc.git [PATCH][REE]Backport "Fix register corruption bug in ree". Ensure inserted copy don't change the number of hard registers. 2015-11-09 Renlin Li Backport from mainline 2014-09-12 Wilco Dijkstra * gcc/ree.c (combine_reaching_defs): Ensure inserted copy don't change the number of hard registers. From-SVN: r230032 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b00b1657e02c..07fbdb9370c7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2015-11-09 Renlin Li + + Backport from mainline + 2014-09-12 Wilco Dijkstra + + * gcc/ree.c (combine_reaching_defs): Ensure inserted copy don't change + the number of hard registers. + 2015-11-02 Martin Jambor Backport from mainline diff --git a/gcc/ree.c b/gcc/ree.c index 67fc9c3b0fb4..7d00d816d400 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);