2011-01-25  Jeff Law  <law@redhat.com>

	PR rtl-optimization/37273
	* ira-costs.c (scan_one_insn): Detect constants living in memory and
	handle them like argument loads from stack slots.  Do not double
	count memory for memory constants and argument loads from stack slots.

From-SVN: r170199
This commit is contained in:
Jeff Law 2011-02-15 14:21:59 -07:00 committed by Jeff Law
parent 158559dec9
commit fc2fa4fb38
2 changed files with 14 additions and 17 deletions

View File

@ -1,3 +1,13 @@
2011-02-15 Jeff Law <law@redhat.com>
Revert
2011-01-25 Jeff Law <law@redhat.com>
PR rtl-optimization/37273
* ira-costs.c (scan_one_insn): Detect constants living in memory and
handle them like argument loads from stack slots. Do not double
count memory for memory constants and argument loads from stack slots.
2011-02-15 H.J. Lu <hongjiu.lu@intel.com>
PR middle-end/47725

View File

@ -1,5 +1,5 @@
/* IRA hard register and memory cost calculation for allocnos or pseudos.
Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011
Copyright (C) 2006, 2007, 2008, 2009, 2010
Free Software Foundation, Inc.
Contributed by Vladimir Makarov <vmakarov@redhat.com>.
@ -1009,7 +1009,6 @@ scan_one_insn (rtx insn)
enum rtx_code pat_code;
rtx set, note;
int i, k;
bool counted_mem;
if (!NONDEBUG_INSN_P (insn))
return insn;
@ -1019,23 +1018,15 @@ scan_one_insn (rtx insn)
|| pat_code == ADDR_VEC || pat_code == ADDR_DIFF_VEC)
return insn;
counted_mem = false;
set = single_set (insn);
extract_insn (insn);
/* If this insn loads a parameter from its stack slot, then it
represents a savings, rather than a cost, if the parameter is
stored in memory. Record this fact.
Similarly if we're loading other constants from memory (constant
pool, TOC references, small data areas, etc) and this is the only
assignment to the destination pseudo. */
stored in memory. Record this fact. */
if (set != 0 && REG_P (SET_DEST (set)) && MEM_P (SET_SRC (set))
&& (note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) != NULL_RTX
&& ((MEM_P (XEXP (note, 0)))
|| (CONSTANT_P (XEXP (note, 0))
&& LEGITIMATE_CONSTANT_P (XEXP (note, 0))
&& REG_N_SETS (REGNO (SET_DEST (set))) == 1)))
&& MEM_P (XEXP (note, 0)))
{
enum reg_class cl = GENERAL_REGS;
rtx reg = SET_DEST (set);
@ -1047,7 +1038,6 @@ scan_one_insn (rtx insn)
-= ira_memory_move_cost[GET_MODE (reg)][cl][1] * frequency;
record_address_regs (GET_MODE (SET_SRC (set)), XEXP (SET_SRC (set), 0),
0, MEM, SCRATCH, frequency * 2);
counted_mem = true;
}
record_operand_costs (insn, pref);
@ -1062,10 +1052,7 @@ scan_one_insn (rtx insn)
struct costs *p = COSTS (costs, COST_INDEX (regno));
struct costs *q = op_costs[i];
/* If the already accounted for the memory "cost" above, don't
do so again. */
if (!counted_mem)
p->mem_cost += q->mem_cost;
p->mem_cost += q->mem_cost;
for (k = 0; k < cost_classes_num; k++)
p->cost[k] += q->cost[k];
}