re PR rtl-optimization/52208 (Useless store)
authorJakub Jelinek <jakub@redhat.com>
Thu, 16 Feb 2012 15:34:28 +0000 (16:34 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 16 Feb 2012 15:34:28 +0000 (16:34 +0100)
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

gcc/ChangeLog
gcc/ira-costs.c

index e8b5efa..4ba6cbf 100644 (file)
@@ -1,5 +1,9 @@
 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
        * tree-vect-loop-manip.c (slpeel_tree_peel_loop_to_edge): If
        loop->header has virtual PHI, but exit_e->dest doesn't, add
index 8e1e846..34e6ef9 100644 (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, 2011, 2012
    Free Software Foundation, Inc.
    Contributed by Vladimir Makarov <vmakarov@redhat.com>.
 
@@ -1306,14 +1306,21 @@ scan_one_insn (rtx insn)
 
      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.  */
+     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))
       && (note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) != NULL_RTX
       && ((MEM_P (XEXP (note, 0)))
          || (CONSTANT_P (XEXP (note, 0))
              && targetm.legitimate_constant_p (GET_MODE (SET_DEST (set)),
                                                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;
       rtx reg = SET_DEST (set);