[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 <law@redhat.com>

From-SVN: r230785
This commit is contained in:
Nick Clifton 2015-11-24 05:11:15 +00:00 committed by Jeff Law
parent 267c9702f6
commit d2c9e8ed7a
2 changed files with 20 additions and 10 deletions

View File

@ -1,3 +1,11 @@
2015-11-23 Nick Clifton <nickc@redhat.com>
Jeff Law <law@redhat.com>
* 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 <aditya.k7@samsung.com>
Sebastian Pop <s.pop@samsung.com>

View File

@ -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};