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
This commit is contained in:
Richard Earnshaw 2012-09-14 17:10:45 +00:00 committed by Richard Earnshaw
parent cde43acdba
commit 0290430b75
2 changed files with 15 additions and 2 deletions

View File

@ -1,3 +1,10 @@
2012-09-14 Richard Earnshaw <rearnsha@arm.com>
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 <ebotcazou@adacore.com>
PR rtl-optimization/44194

View File

@ -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)