Commit 6d3f673c by Kirill Yukhin Committed by Kirill Yukhin

ia64.c (ia64_split_tmode_move): Mark load with `dead' flag if it kills address,…

ia64.c (ia64_split_tmode_move): Mark load with `dead' flag if it kills address, not its post-increment.

        * gcc/config/ia64/ia64.c (ia64_split_tmode_move): Mark
        load with `dead' flag if it kills address, not its
        post-increment.

From-SVN: r204948
parent 01156003
2013-11-18 Kirill Yukhin <kirill.yukhin@intel.com>
* gcc/config/ia64/ia64.c (ia64_split_tmode_move): Mark
load with `dead' flag if it kills address, not its
post-increment.
2013-11-18 Ilya Enkovich <ilya.enkovich@intel.com>
* builtin-types.def (BT_FN_PTR_CONST_PTR_VAR): New.
......@@ -1525,23 +1525,22 @@ ia64_split_tmode_move (rtx operands[])
the value it points to. In that case we have to do the loads in
the appropriate order so that the pointer is not destroyed too
early. Also we must not generate a postmodify for that second
load, or rws_access_regno will die. */
load, or rws_access_regno will die. And we must not generate a
postmodify for the second load if the destination register
overlaps with the base register. */
if (GET_CODE (operands[1]) == MEM
&& reg_overlap_mentioned_p (operands[0], operands[1]))
{
rtx base = XEXP (operands[1], 0);
rtx first_write = gen_rtx_REG (DImode, REGNO (operands[0]));
while (GET_CODE (base) != REG)
base = XEXP (base, 0);
if (REGNO (base) == REGNO (operands[0]))
{
reversed = true;
first_write = gen_rtx_REG (DImode, REGNO (operands[0]) + 1);
}
reversed = true;
if (GET_CODE (operands[0]) == REG
&& reg_overlap_mentioned_p (first_write, operands[1]))
if (refers_to_regno_p (REGNO (operands[0]),
REGNO (operands[0])+2,
base, 0))
dead = true;
}
/* Another reason to do the moves in reversed order is if the first
......
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