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:
Vladimir Makarov 2013-10-03 00:35:43 +00:00 committed by Vladimir Makarov
parent 7cfbb5a278
commit 80f466c4a6
3 changed files with 91 additions and 74 deletions

View File

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

View File

@ -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,

View 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 < &reg_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: