Commit 3db93c89 by Jakub Jelinek Committed by Jakub Jelinek

re PR rtl-optimization/52208 (Useless store)

	PR rtl-optimization/52208
	* ira-costs.c (scan_one_insn): Don't decrease mem_cost
	for MEMs with REG_EQUIV, if the MEM isn't general_operand.

From-SVN: r184310
parent e20f6b4b
2012-02-16 Jakub Jelinek <jakub@redhat.com> 2012-02-16 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/52208
* ira-costs.c (scan_one_insn): Don't decrease mem_cost
for MEMs with REG_EQUIV, if the MEM isn't general_operand.
PR tree-optimization/52255 PR tree-optimization/52255
* tree-vect-loop-manip.c (slpeel_tree_peel_loop_to_edge): If * tree-vect-loop-manip.c (slpeel_tree_peel_loop_to_edge): If
loop->header has virtual PHI, but exit_e->dest doesn't, add loop->header has virtual PHI, but exit_e->dest doesn't, add
......
/* IRA hard register and memory cost calculation for allocnos or pseudos. /* 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, 2011, 2012
Free Software Foundation, Inc. Free Software Foundation, Inc.
Contributed by Vladimir Makarov <vmakarov@redhat.com>. Contributed by Vladimir Makarov <vmakarov@redhat.com>.
...@@ -1306,14 +1306,21 @@ scan_one_insn (rtx insn) ...@@ -1306,14 +1306,21 @@ scan_one_insn (rtx insn)
Similarly if we're loading other constants from memory (constant Similarly if we're loading other constants from memory (constant
pool, TOC references, small data areas, etc) and this is the only pool, TOC references, small data areas, etc) and this is the only
assignment to the destination pseudo. */ assignment to the destination pseudo.
Don't do this if SET_SRC (set) isn't a general operand, if it is
a memory requiring special instructions to load it, decreasing
mem_cost might result in it being loaded using the specialized
instruction into a register, then stored into stack and loaded
again from the stack. See PR52208. */
if (set != 0 && REG_P (SET_DEST (set)) && MEM_P (SET_SRC (set)) if (set != 0 && REG_P (SET_DEST (set)) && MEM_P (SET_SRC (set))
&& (note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) != NULL_RTX && (note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) != NULL_RTX
&& ((MEM_P (XEXP (note, 0))) && ((MEM_P (XEXP (note, 0)))
|| (CONSTANT_P (XEXP (note, 0)) || (CONSTANT_P (XEXP (note, 0))
&& targetm.legitimate_constant_p (GET_MODE (SET_DEST (set)), && targetm.legitimate_constant_p (GET_MODE (SET_DEST (set)),
XEXP (note, 0)) XEXP (note, 0))
&& REG_N_SETS (REGNO (SET_DEST (set))) == 1))) && REG_N_SETS (REGNO (SET_DEST (set))) == 1))
&& general_operand (SET_SRC (set), GET_MODE (SET_SRC (set))))
{ {
enum reg_class cl = GENERAL_REGS; enum reg_class cl = GENERAL_REGS;
rtx reg = SET_DEST (set); rtx reg = SET_DEST (set);
......
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