diff options
author | Roger Sayle <roger@eyesopen.com> | 2006-06-16 13:21:45 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2006-06-16 13:21:45 +0000 |
commit | 2d0df1f9a8051d2a89f50e75b9555db06a9fdad8 (patch) | |
tree | a40f1b62f264bb2144d100e2c702367189d4d55f /gcc/reg-stack.c | |
parent | e046c56eee0e7308f8704c8c13aa6ca5230201f1 (diff) | |
download | gcc-2d0df1f9a8051d2a89f50e75b9555db06a9fdad8.zip gcc-2d0df1f9a8051d2a89f50e75b9555db06a9fdad8.tar.gz gcc-2d0df1f9a8051d2a89f50e75b9555db06a9fdad8.tar.bz2 |
re PR middle-end/27802 (ICE with longjmp)
PR middle-end/27802
* reg-stack.c (subst_stack_regs): Handle noreturn function calls
that (would) return their results in stack registers.
* gcc.dg/pr27802-1.c: New test case.
From-SVN: r114721
Diffstat (limited to 'gcc/reg-stack.c')
-rw-r--r-- | gcc/reg-stack.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c index 83f4ebb..fc742bd 100644 --- a/gcc/reg-stack.c +++ b/gcc/reg-stack.c @@ -2282,6 +2282,16 @@ subst_stack_regs (rtx insn, stack regstack) if (NOTE_P (insn) || INSN_DELETED_P (insn)) return control_flow_insn_deleted; + /* If this a noreturn call, we can't insert pop insns after it. + Instead, reset the stack state to empty. */ + if (CALL_P (insn) + && find_reg_note (insn, REG_NORETURN, NULL)) + { + regstack->top = -1; + CLEAR_HARD_REG_SET (regstack->reg_set); + return control_flow_insn_deleted; + } + /* If there is a REG_UNUSED note on a stack register on this insn, the indicated reg must be popped. The REG_UNUSED note is removed, since the form of the newly emitted pop insn references the reg, |