From d2c9e8ed7ae8cde8e64405eb130c9d7d99c68856 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Tue, 24 Nov 2015 05:11:15 +0000 Subject: [PATCH] [PATCH] Fix invalid redundant extension elimination for rl78 port * ree.c (add_removable_extension): Avoid mis-optimizing cases where the source/dest of the target extension require a different number of hard registers. (combine_set_extension): Remove #if 0 code. Co-Authored-By: Jeff Law From-SVN: r230785 --- gcc/ChangeLog | 8 ++++++++ gcc/ree.c | 22 ++++++++++++---------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0338c753ef4..e770638354d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2015-11-23 Nick Clifton + Jeff Law + + * ree.c (add_removable_extension): Avoid mis-optimizing cases where + the source/dest of the target extension require a different number of + hard registers. + (combine_set_extension): Remove #if 0 code. + 2015-11-23 Aditya Kumar Sebastian Pop diff --git a/gcc/ree.c b/gcc/ree.c index b8436f25995..f3b79e0886d 100644 --- a/gcc/ree.c +++ b/gcc/ree.c @@ -332,16 +332,6 @@ combine_set_extension (ext_cand *cand, rtx_insn *curr_insn, rtx *orig_set) else new_reg = gen_rtx_REG (cand->mode, REGNO (SET_DEST (*orig_set))); -#if 0 - /* Rethinking test. Temporarily disabled. */ - /* We're going to be widening the result of DEF_INSN, ensure that doing so - doesn't change the number of hard registers needed for the result. */ - if (HARD_REGNO_NREGS (REGNO (new_reg), cand->mode) - != HARD_REGNO_NREGS (REGNO (SET_DEST (*orig_set)), - GET_MODE (SET_DEST (*orig_set)))) - return false; -#endif - /* Merge constants by directly moving the constant into the register under some conditions. Recall that RTL constants are sign-extended. */ if (GET_CODE (orig_src) == CONST_INT @@ -1080,6 +1070,18 @@ add_removable_extension (const_rtx expr, rtx_insn *insn, } } + /* Fourth, if the extended version occupies more registers than the + original and the source of the extension is the same hard register + as the destination of the extension, then we can not eliminate + the extension without deep analysis, so just punt. + + We allow this when the registers are different because the + code in combine_reaching_defs will handle that case correctly. */ + if ((HARD_REGNO_NREGS (REGNO (dest), mode) + != HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg))) + && REGNO (dest) == REGNO (reg)) + return; + /* Then add the candidate to the list and insert the reaching definitions into the definition map. */ ext_cand e = {expr, code, mode, insn}; -- 2.30.2