aboutsummaryrefslogtreecommitdiff
path: root/gcc/reload1.c
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@codesourcery.com>2011-01-23 21:11:24 +0000
committerBernd Schmidt <bernds@gcc.gnu.org>2011-01-23 21:11:24 +0000
commitff3d9d08a811c2b1074010a72ede155231252eb0 (patch)
tree7c9c2e79ba79a0d4faca129d3249c4ec5931e662 /gcc/reload1.c
parent7fcaf152b608e3afc138f83fc06d230c4d83fa90 (diff)
downloadgcc-ff3d9d08a811c2b1074010a72ede155231252eb0.zip
gcc-ff3d9d08a811c2b1074010a72ede155231252eb0.tar.gz
gcc-ff3d9d08a811c2b1074010a72ede155231252eb0.tar.bz2
re PR rtl-optimization/47166 (SpecCpu2000 Ammp segfaults for ARM with -O3 -mthumb)
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. Co-Authored-By: Richard Sandiford <rdsandiford@googlemail.com> From-SVN: r169144
Diffstat (limited to 'gcc/reload1.c')
-rw-r--r--gcc/reload1.c26
1 files changed, 19 insertions, 7 deletions
diff --git a/gcc/reload1.c b/gcc/reload1.c
index 2f02ae3..3d58e58 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -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;
}