aboutsummaryrefslogtreecommitdiff
path: root/gcc/reload.c
diff options
context:
space:
mode:
authorRichard Earnshaw <rearnsha@arm.com>2012-09-14 17:10:45 +0000
committerRichard Earnshaw <rearnsha@gcc.gnu.org>2012-09-14 17:10:45 +0000
commit0290430b751b0f2d3a086d36475d4ceda5a5098e (patch)
treeb9aab0164d03a44a4a0d11b593533cb96d017c9c /gcc/reload.c
parentcde43acdba16efdb6e4e4488ec19e4106b5396c7 (diff)
downloadgcc-0290430b751b0f2d3a086d36475d4ceda5a5098e.zip
gcc-0290430b751b0f2d3a086d36475d4ceda5a5098e.tar.gz
gcc-0290430b751b0f2d3a086d36475d4ceda5a5098e.tar.bz2
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
Diffstat (limited to 'gcc/reload.c')
-rw-r--r--gcc/reload.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/gcc/reload.c b/gcc/reload.c
index f4f3ed0..2e41ed6 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)