From 0290430b751b0f2d3a086d36475d4ceda5a5098e Mon Sep 17 00:00:00 2001 From: Richard Earnshaw Date: Fri, 14 Sep 2012 17:10:45 +0000 Subject: [PATCH] re PR target/54516 (ICE in reload_cse_simplify_operands, at postreload.c:403 with -O1 -march=armv7-a -mthumb) PR target/54516 PR rtl-optimization/54540 * reload.c (find_dummy_reload): Don't use OUT as a reload reg for IN if it overlaps a fixed register. From-SVN: r191307 --- gcc/ChangeLog | 7 +++++++ gcc/reload.c | 10 ++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 847b12089d97..21a8f94e22fc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2012-09-14 Richard Earnshaw + + PR target/54516 + PR rtl-optimization/54540 + * reload.c (find_dummy_reload): Don't use OUT as a reload reg + for IN if it overlaps a fixed register. + 2012-09-14 Eric Botcazou PR rtl-optimization/44194 diff --git a/gcc/reload.c b/gcc/reload.c index f4f3ed03d859..2e41ed6498e6 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -2036,7 +2036,12 @@ find_dummy_reload (rtx real_in, rtx real_out, rtx *inloc, rtx *outloc, However, we only ignore IN in its role as this reload. If the insn uses IN elsewhere and it contains OUT, that counts. We can't be sure it's the "same" operand - so it might not go through this reload. */ + so it might not go through this reload. + + We also need to avoid using OUT if it, or part of it, is a + fixed register. Modifying such registers, even transiently, + may have undefined effects on the machine, such as modifying + the stack pointer. */ saved_rtx = *inloc; *inloc = const0_rtx; @@ -2049,7 +2054,8 @@ find_dummy_reload (rtx real_in, rtx real_out, rtx *inloc, rtx *outloc, for (i = 0; i < nwords; i++) if (! TEST_HARD_REG_BIT (reg_class_contents[(int) rclass], - regno + i)) + regno + i) + || fixed_regs[regno + i]) break; if (i == nwords)