* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@114721
138bc75d-0d04-0410-961f-
82ee72b054a4
+2006-06-16 Roger Sayle <roger@eyesopen.com>
+
+ PR middle-end/27802
+ * reg-stack.c (subst_stack_regs): Handle noreturn function calls
+ that (would) return their results in stack registers.
+
2006-06-16 Michael Matz <matz@suse.de>
Richard Guenther <rguenther@suse.de>
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,
+2006-06-16 Roger Sayle <roger@eyesopen.com>
+
+ PR middle-end/27802
+ * gcc.dg/pr27802-1.c: New test case.
+
2006-06-15 Mark Mitchell <mark@codesourcery.com>
PR c++/27689
--- /dev/null
+/* Noreturn functions returning FP types used to confuse reg-stack on x86. */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+double bar1() __attribute__((noreturn));
+void foo1() { bar1(); }
+
+double bar2() __attribute__((noreturn));
+double foo2() { return bar2(); }
+
+void bar3() __attribute__((noreturn));
+double foo3() { bar3(); }
+
+double bar4() __attribute__((noreturn));
+double foo4() { bar4(); }
+