OSDN Git Service

PR rtl-optimization/47166
authorbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 23 Jan 2011 21:11:24 +0000 (21:11 +0000)
committerbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 23 Jan 2011 21:11:24 +0000 (21:11 +0000)
* reload1.c (emit_reload_insns): Disable the spill_reg_store
mechanism for PRE_MODIFY and POST_MODIFY.
(inc_for_reload): For PRE_MODIFY, return the insn that sets the
reloadreg.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@169144 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/reload1.c

index 87ae1d4..e6d8bcb 100644 (file)
@@ -1,3 +1,12 @@
+2011-01-23  Bernd Schmidt  <bernds@codesourcery.com>
+           Richard Sandiford  <rdsandiford@googlemail.com>
+
+       PR rtl-optimization/47166
+       * reload1.c (emit_reload_insns): Disable the spill_reg_store
+       mechanism for PRE_MODIFY and POST_MODIFY.
+       (inc_for_reload): For PRE_MODIFY, return the insn that sets the
+       reloadreg.
+
 2011-01-23  Andreas Schwab  <schwab@linux-m68k.org>
 
        * compare-elim.c (maybe_select_cc_mode): Add ATTRIBUTE_UNUSED
index 2f02ae3..3d58e58 100644 (file)
@@ -1,7 +1,7 @@
 /* Reload pseudo regs into hard regs for insns that require hard regs.
    Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-   Free Software Foundation, Inc.
+   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+   2011 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -8086,10 +8086,22 @@ emit_reload_insns (struct insn_chain *chain)
          /* Maybe the spill reg contains a copy of reload_out.  */
          if (rld[r].out != 0
              && (REG_P (rld[r].out)
-#ifdef AUTO_INC_DEC
-                 || ! rld[r].out_reg
-#endif
-                 || REG_P (rld[r].out_reg)))
+                 || (rld[r].out_reg
+                     ? REG_P (rld[r].out_reg)
+                     /* The reload value is an auto-modification of
+                        some kind.  For PRE_INC, POST_INC, PRE_DEC
+                        and POST_DEC, we record an equivalence
+                        between the reload register and the operand
+                        on the optimistic assumption that we can make
+                        the equivalence hold.  reload_as_needed must
+                        then either make it hold or invalidate the
+                        equivalence.
+
+                        PRE_MODIFY and POST_MODIFY addresses are reloaded
+                        somewhat differently, and allowing them here leads
+                        to problems.  */
+                     : (GET_CODE (rld[r].out) != POST_MODIFY
+                        && GET_CODE (rld[r].out) != PRE_MODIFY))))
            {
              rtx reg;
              enum machine_mode mode;
@@ -9033,7 +9045,7 @@ inc_for_reload (rtx reloadreg, rtx in, rtx value, int inc_amount)
                 be used as an address.  */
 
              if (! post)
-               emit_insn (gen_move_insn (reloadreg, incloc));
+               add_insn = emit_insn (gen_move_insn (reloadreg, incloc));
 
              return add_insn;
            }