aboutsummaryrefslogtreecommitdiff
path: root/gcc/reload1.c
diff options
context:
space:
mode:
authorPeter Bergner <bergner@vnet.ibm.com>2006-12-13 13:19:03 -0600
committerPeter Bergner <bergner@gcc.gnu.org>2006-12-13 13:19:03 -0600
commit8c1249f9652e78aa0dd94f9548e4675ebf3e600f (patch)
treea3f908a3433ea8a7b7170937c4987b77ea227176 /gcc/reload1.c
parentc53fa1740ae95a29c87a0cff19641657d85eb894 (diff)
downloadgcc-8c1249f9652e78aa0dd94f9548e4675ebf3e600f.zip
gcc-8c1249f9652e78aa0dd94f9548e4675ebf3e600f.tar.gz
gcc-8c1249f9652e78aa0dd94f9548e4675ebf3e600f.tar.bz2
re PR middle-end/30191 (GCC error: in eliminate_regs_in_insn, at reload1.c:3126)
PR middle-end/30191 Revert: * reload1.c (eliminate_regs_in_insn): Merge the plus_src "else" and the offset == 0 "then" clauses. * config/rs6000/predicates.md (gpc_reg_operand): Check for reload_in_progress. From-SVN: r119844
Diffstat (limited to 'gcc/reload1.c')
-rw-r--r--gcc/reload1.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/gcc/reload1.c b/gcc/reload1.c
index 7ba93a6..4543835 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -3098,12 +3098,7 @@ eliminate_regs_in_insn (rtx insn, int replace)
if (GET_CODE (XEXP (plus_cst_src, 0)) == SUBREG)
to_rtx = gen_lowpart (GET_MODE (XEXP (plus_cst_src, 0)),
to_rtx);
- /* If we have a nonzero offset, and the source is already
- a simple REG, the following transformation would
- increase the cost of the insn by replacing a simple REG
- with (plus (reg sp) CST). So try only when we already
- had a PLUS before. */
- if (offset == 0 || plus_src)
+ if (offset == 0)
{
int num_clobbers;
/* We assume here that if we need a PARALLEL with
@@ -3112,7 +3107,7 @@ eliminate_regs_in_insn (rtx insn, int replace)
There's not much we can do if that doesn't work. */
PATTERN (insn) = gen_rtx_SET (VOIDmode,
SET_DEST (old_set),
- plus_constant (to_rtx, offset));
+ to_rtx);
num_clobbers = 0;
INSN_CODE (insn) = recog (PATTERN (insn), insn, &num_clobbers);
if (num_clobbers)
@@ -3125,6 +3120,26 @@ eliminate_regs_in_insn (rtx insn, int replace)
}
gcc_assert (INSN_CODE (insn) >= 0);
}
+ /* If we have a nonzero offset, and the source is already
+ a simple REG, the following transformation would
+ increase the cost of the insn by replacing a simple REG
+ with (plus (reg sp) CST). So try only when we already
+ had a PLUS before. */
+ else if (plus_src)
+ {
+ new_body = old_body;
+ if (! replace)
+ {
+ new_body = copy_insn (old_body);
+ if (REG_NOTES (insn))
+ REG_NOTES (insn) = copy_insn_1 (REG_NOTES (insn));
+ }
+ PATTERN (insn) = new_body;
+ old_set = single_set (insn);
+
+ XEXP (SET_SRC (old_set), 0) = to_rtx;
+ XEXP (SET_SRC (old_set), 1) = GEN_INT (offset);
+ }
else
break;