From a10441ee7d5e555d444f55753a59557491d0c641 Mon Sep 17 00:00:00 2001 From: bernds Date: Sun, 23 Jan 2011 21:11:24 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@169144 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 9 +++++++++ gcc/reload1.c | 26 +++++++++++++++++++------- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 87ae1d42ebc..e6d8bcbca0c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2011-01-23 Bernd Schmidt + Richard Sandiford + + 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 * compare-elim.c (maybe_select_cc_mode): Add ATTRIBUTE_UNUSED diff --git a/gcc/reload1.c b/gcc/reload1.c index 2f02ae38158..3d58e5877cf 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; } -- 2.11.0