Commit d2c9e8ed by Nick Clifton Committed by Jeff Law

[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
parent 267c9702
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> 2015-11-23 Aditya Kumar <aditya.k7@samsung.com>
Sebastian Pop <s.pop@samsung.com> Sebastian Pop <s.pop@samsung.com>
...@@ -332,16 +332,6 @@ combine_set_extension (ext_cand *cand, rtx_insn *curr_insn, rtx *orig_set) ...@@ -332,16 +332,6 @@ combine_set_extension (ext_cand *cand, rtx_insn *curr_insn, rtx *orig_set)
else else
new_reg = gen_rtx_REG (cand->mode, REGNO (SET_DEST (*orig_set))); 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 /* Merge constants by directly moving the constant into the register under
some conditions. Recall that RTL constants are sign-extended. */ some conditions. Recall that RTL constants are sign-extended. */
if (GET_CODE (orig_src) == CONST_INT if (GET_CODE (orig_src) == CONST_INT
...@@ -1080,6 +1070,18 @@ add_removable_extension (const_rtx expr, rtx_insn *insn, ...@@ -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 /* Then add the candidate to the list and insert the reaching definitions
into the definition map. */ into the definition map. */
ext_cand e = {expr, code, mode, insn}; ext_cand e = {expr, code, mode, insn};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment