+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>
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
}
}
+ /* 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};