aboutsummaryrefslogtreecommitdiff
path: root/gcc/reg-stack.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/reg-stack.c')
-rw-r--r--gcc/reg-stack.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c
index f5d263fbff2..f502958aec5 100644
--- a/gcc/reg-stack.c
+++ b/gcc/reg-stack.c
@@ -310,7 +310,7 @@ stack_regs_mentioned (const_rtx insn)
unsigned int uid, max;
int test;
- if (! INSN_P (insn) || !stack_regs_mentioned_data)
+ if (! INSN_P (insn) /* || DEBUG_INSN_P (insn) */ || !stack_regs_mentioned_data)
return 0;
uid = INSN_UID (insn);
@@ -1361,6 +1361,16 @@ subst_stack_regs_pat (rtx insn, stack regstack, rtx pat)
since the REG_DEAD notes are not issued.) */
break;
+ case VAR_LOCATION:
+ for (dest = &REG_NOTES (insn); *dest; dest = &XEXP (*dest, 1))
+ if (REG_NOTE_KIND (*dest) == REG_DEAD
+ && STACK_REG_P (*(src = &XEXP (*dest, 0)))
+ && TEST_HARD_REG_BIT (regstack->reg_set, REGNO (*src)))
+ /* ??? This is not right. We want to *avoid* emitting the
+ pop and the corresponding push. */
+ emit_pop_insn (insn, regstack, *src, EMIT_AFTER);
+ break;
+
case CLOBBER:
{
rtx note;