44 lines
1.4 KiB
Diff
44 lines
1.4 KiB
Diff
|
2009-04-24 Vladimir Makarov <vmakarov@redhat.com>
|
||
|
|
||
|
PR target/39856
|
||
|
* reg-stack.c (subst_stack_regs_pat): Remove gcc_assert for note
|
||
|
for clobber.
|
||
|
|
||
|
--- gcc/reg-stack.c (revision 146648)
|
||
|
+++ gcc/reg-stack.c (working copy)
|
||
|
@@ -1371,21 +1371,23 @@ subst_stack_regs_pat (rtx insn, stack re
|
||
|
|
||
|
if (pat != PATTERN (insn))
|
||
|
{
|
||
|
- /* The fix_truncdi_1 pattern wants to be able to allocate
|
||
|
- its own scratch register. It does this by clobbering
|
||
|
- an fp reg so that it is assured of an empty reg-stack
|
||
|
- register. If the register is live, kill it now.
|
||
|
- Remove the DEAD/UNUSED note so we don't try to kill it
|
||
|
- later too. */
|
||
|
+ /* The fix_truncdi_1 pattern wants to be able to
|
||
|
+ allocate its own scratch register. It does this by
|
||
|
+ clobbering an fp reg so that it is assured of an
|
||
|
+ empty reg-stack register. If the register is live,
|
||
|
+ kill it now. Remove the DEAD/UNUSED note so we
|
||
|
+ don't try to kill it later too.
|
||
|
+
|
||
|
+ In reality the UNUSED note can be absent in some
|
||
|
+ complicated cases when the register is reused for
|
||
|
+ partially set variable. */
|
||
|
|
||
|
if (note)
|
||
|
emit_pop_insn (insn, regstack, *dest, EMIT_BEFORE);
|
||
|
else
|
||
|
- {
|
||
|
- note = find_reg_note (insn, REG_UNUSED, *dest);
|
||
|
- gcc_assert (note);
|
||
|
- }
|
||
|
- remove_note (insn, note);
|
||
|
+ note = find_reg_note (insn, REG_UNUSED, *dest);
|
||
|
+ if (note)
|
||
|
+ remove_note (insn, note);
|
||
|
replace_reg (dest, FIRST_STACK_REG + 1);
|
||
|
}
|
||
|
else
|