lra-constraints.c (process_alt_operand): Calculate scratch_p and use it.
2013-10-02 Vladimir Makarov <vmakarov@redhat.com> * lra-constraints.c (process_alt_operand): Calculate scratch_p and use it. Use smaller increase for scratch. Don't increase reject for early clobber scratch. * lra-eliminations.c (eliminate_regs_in_insn): Remove all insns setting eliminated regs except setting fp from hfp. (lra_eliminate): Check lra_insn_recog_data on NULL. From-SVN: r203147
This commit is contained in:
parent
7cfbb5a278
commit
80f466c4a6
@ -1,3 +1,12 @@
|
|||||||
|
2013-10-02 Vladimir Makarov <vmakarov@redhat.com>
|
||||||
|
|
||||||
|
* lra-constraints.c (process_alt_operand): Calculate scratch_p and
|
||||||
|
use it. Use smaller increase for scratch. Don't increase reject
|
||||||
|
for early clobber scratch.
|
||||||
|
* lra-eliminations.c (eliminate_regs_in_insn): Remove all insns
|
||||||
|
setting eliminated regs except setting fp from hfp.
|
||||||
|
(lra_eliminate): Check lra_insn_recog_data on NULL.
|
||||||
|
|
||||||
2013-10-02 Michael Meissner <meissner@linux.vnet.ibm.com>
|
2013-10-02 Michael Meissner <meissner@linux.vnet.ibm.com>
|
||||||
|
|
||||||
PR target/58587
|
PR target/58587
|
||||||
|
@ -1453,6 +1453,7 @@ process_alt_operands (int only_alternative)
|
|||||||
HARD_REG_SET this_alternative_set, this_costly_alternative_set;
|
HARD_REG_SET this_alternative_set, this_costly_alternative_set;
|
||||||
bool this_alternative_match_win, this_alternative_win;
|
bool this_alternative_match_win, this_alternative_win;
|
||||||
bool this_alternative_offmemok;
|
bool this_alternative_offmemok;
|
||||||
|
bool scratch_p;
|
||||||
enum machine_mode mode;
|
enum machine_mode mode;
|
||||||
|
|
||||||
opalt_num = nalt * n_operands + nop;
|
opalt_num = nalt * n_operands + nop;
|
||||||
@ -1858,6 +1859,8 @@ process_alt_operands (int only_alternative)
|
|||||||
}
|
}
|
||||||
while ((p += len), c);
|
while ((p += len), c);
|
||||||
|
|
||||||
|
scratch_p = (operand_reg[nop] != NULL_RTX
|
||||||
|
&& lra_former_scratch_p (REGNO (operand_reg[nop])));
|
||||||
/* Record which operands fit this alternative. */
|
/* Record which operands fit this alternative. */
|
||||||
if (win)
|
if (win)
|
||||||
{
|
{
|
||||||
@ -1878,14 +1881,17 @@ process_alt_operands (int only_alternative)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Prefer won reg to spilled pseudo under other equal
|
/* Prefer won reg to spilled pseudo under other
|
||||||
conditions. */
|
equal conditions for possibe inheritance. */
|
||||||
if (lra_dump_file != NULL)
|
if (! scratch_p)
|
||||||
fprintf
|
{
|
||||||
(lra_dump_file,
|
if (lra_dump_file != NULL)
|
||||||
" %d Non pseudo reload: reject++\n",
|
fprintf
|
||||||
nop);
|
(lra_dump_file,
|
||||||
reject++;
|
" %d Non pseudo reload: reject++\n",
|
||||||
|
nop);
|
||||||
|
reject++;
|
||||||
|
}
|
||||||
if (in_class_p (operand_reg[nop],
|
if (in_class_p (operand_reg[nop],
|
||||||
this_costly_alternative, NULL))
|
this_costly_alternative, NULL))
|
||||||
{
|
{
|
||||||
@ -1904,13 +1910,13 @@ process_alt_operands (int only_alternative)
|
|||||||
insns are generated for the scratches. So it
|
insns are generated for the scratches. So it
|
||||||
might cost something but probably less than old
|
might cost something but probably less than old
|
||||||
reload pass believes. */
|
reload pass believes. */
|
||||||
if (lra_former_scratch_p (REGNO (operand_reg[nop])))
|
if (scratch_p)
|
||||||
{
|
{
|
||||||
if (lra_dump_file != NULL)
|
if (lra_dump_file != NULL)
|
||||||
fprintf (lra_dump_file,
|
fprintf (lra_dump_file,
|
||||||
" %d Scratch win: reject+=3\n",
|
" %d Scratch win: reject+=2\n",
|
||||||
nop);
|
nop);
|
||||||
reject += 3;
|
reject += 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2124,7 +2130,7 @@ process_alt_operands (int only_alternative)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (early_clobber_p)
|
if (early_clobber_p && ! scratch_p)
|
||||||
{
|
{
|
||||||
if (lra_dump_file != NULL)
|
if (lra_dump_file != NULL)
|
||||||
fprintf (lra_dump_file,
|
fprintf (lra_dump_file,
|
||||||
|
@ -809,69 +809,69 @@ eliminate_regs_in_insn (rtx insn, bool replace_p)
|
|||||||
if (old_set != 0 && REG_P (SET_DEST (old_set))
|
if (old_set != 0 && REG_P (SET_DEST (old_set))
|
||||||
&& (ep = get_elimination (SET_DEST (old_set))) != NULL)
|
&& (ep = get_elimination (SET_DEST (old_set))) != NULL)
|
||||||
{
|
{
|
||||||
bool delete_p = replace_p;
|
for (ep = reg_eliminate; ep < ®_eliminate[NUM_ELIMINABLE_REGS]; ep++)
|
||||||
|
if (ep->from_rtx == SET_DEST (old_set) && ep->can_eliminate)
|
||||||
|
{
|
||||||
|
bool delete_p = replace_p;
|
||||||
|
|
||||||
#ifdef HARD_FRAME_POINTER_REGNUM
|
#ifdef HARD_FRAME_POINTER_REGNUM
|
||||||
/* If this is setting the frame pointer register to the hardware
|
if (ep->from == FRAME_POINTER_REGNUM
|
||||||
frame pointer register and this is an elimination that will
|
&& ep->to == HARD_FRAME_POINTER_REGNUM)
|
||||||
be done (tested above), this insn is really adjusting the
|
/* If this is setting the frame pointer register to the
|
||||||
frame pointer downward to compensate for the adjustment done
|
hardware frame pointer register and this is an
|
||||||
before a nonlocal goto. */
|
elimination that will be done (tested above), this
|
||||||
if (ep->from == FRAME_POINTER_REGNUM
|
insn is really adjusting the frame pointer downward
|
||||||
&& ep->to == HARD_FRAME_POINTER_REGNUM)
|
to compensate for the adjustment done before a
|
||||||
{
|
nonlocal goto. */
|
||||||
rtx src = SET_SRC (old_set);
|
{
|
||||||
rtx off = remove_reg_equal_offset_note (insn, ep->to_rtx);
|
rtx src = SET_SRC (old_set);
|
||||||
|
rtx off = remove_reg_equal_offset_note (insn, ep->to_rtx);
|
||||||
if (replace_p)
|
|
||||||
{
|
if (off != NULL_RTX
|
||||||
SET_DEST (old_set) = ep->to_rtx;
|
|| src == ep->to_rtx
|
||||||
lra_update_insn_recog_data (insn);
|
|| (GET_CODE (src) == PLUS
|
||||||
return;
|
&& XEXP (src, 0) == ep->to_rtx
|
||||||
}
|
&& CONST_INT_P (XEXP (src, 1))))
|
||||||
else if (off != NULL_RTX
|
{
|
||||||
|| src == ep->to_rtx
|
HOST_WIDE_INT offset;
|
||||||
|| (GET_CODE (src) == PLUS
|
|
||||||
&& XEXP (src, 1) == ep->to_rtx
|
if (replace_p)
|
||||||
&& CONST_INT_P (XEXP (src, 1))))
|
{
|
||||||
{
|
SET_DEST (old_set) = ep->to_rtx;
|
||||||
HOST_WIDE_INT offset = (off != NULL_RTX
|
lra_update_insn_recog_data (insn);
|
||||||
? INTVAL (off)
|
return;
|
||||||
: src == ep->to_rtx
|
}
|
||||||
? 0 : INTVAL (XEXP (src, 1)));
|
offset = (off != NULL_RTX ? INTVAL (off)
|
||||||
|
: src == ep->to_rtx ? 0 : INTVAL (XEXP (src, 1)));
|
||||||
offset -= (ep->offset - ep->previous_offset);
|
offset -= (ep->offset - ep->previous_offset);
|
||||||
src = plus_constant (Pmode, ep->to_rtx, offset);
|
src = plus_constant (Pmode, ep->to_rtx, offset);
|
||||||
|
|
||||||
/* First see if this insn remains valid when we make
|
/* First see if this insn remains valid when we
|
||||||
the change. If not, keep the INSN_CODE the same
|
make the change. If not, keep the INSN_CODE
|
||||||
and let the constraint pass fit it up. */
|
the same and let the constraint pass fit it
|
||||||
validate_change (insn, &SET_SRC (old_set), src, 1);
|
up. */
|
||||||
validate_change (insn, &SET_DEST (old_set),
|
validate_change (insn, &SET_SRC (old_set), src, 1);
|
||||||
ep->from_rtx, 1);
|
validate_change (insn, &SET_DEST (old_set),
|
||||||
if (! apply_change_group ())
|
ep->from_rtx, 1);
|
||||||
{
|
if (! apply_change_group ())
|
||||||
SET_SRC (old_set) = src;
|
{
|
||||||
SET_DEST (old_set) = ep->from_rtx;
|
SET_SRC (old_set) = src;
|
||||||
}
|
SET_DEST (old_set) = ep->from_rtx;
|
||||||
lra_update_insn_recog_data (insn);
|
}
|
||||||
/* Add offset note for future updates. */
|
lra_update_insn_recog_data (insn);
|
||||||
add_reg_note (insn, REG_EQUAL, src);
|
/* Add offset note for future updates. */
|
||||||
return;
|
add_reg_note (insn, REG_EQUAL, src);
|
||||||
}
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
/* We can't delete this insn, but needn't process it
|
|
||||||
since it won't be used unless something changes. */
|
|
||||||
delete_p = false;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* This insn isn't serving a useful purpose. We delete it
|
/* This insn isn't serving a useful purpose. We delete it
|
||||||
when REPLACE is set. */
|
when REPLACE is set. */
|
||||||
if (delete_p)
|
if (delete_p)
|
||||||
lra_delete_dead_insn (insn);
|
lra_delete_dead_insn (insn);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We allow one special case which happens to work on all machines we
|
/* We allow one special case which happens to work on all machines we
|
||||||
@ -1318,7 +1318,9 @@ lra_eliminate (bool final_p)
|
|||||||
"Updating elimination of equiv for reg %d\n", i);
|
"Updating elimination of equiv for reg %d\n", i);
|
||||||
}
|
}
|
||||||
EXECUTE_IF_SET_IN_BITMAP (&insns_with_changed_offsets, 0, uid, bi)
|
EXECUTE_IF_SET_IN_BITMAP (&insns_with_changed_offsets, 0, uid, bi)
|
||||||
process_insn_for_elimination (lra_insn_recog_data[uid]->insn, final_p);
|
/* A dead insn can be deleted in process_insn_for_elimination. */
|
||||||
|
if (lra_insn_recog_data[uid] != NULL)
|
||||||
|
process_insn_for_elimination (lra_insn_recog_data[uid]->insn, final_p);
|
||||||
bitmap_clear (&insns_with_changed_offsets);
|
bitmap_clear (&insns_with_changed_offsets);
|
||||||
|
|
||||||
lra_eliminate_done:
|
lra_eliminate_done:
|
||||||
|
Loading…
Reference in New Issue
Block a user