Hi,
On Wed, 20 Jun 2007, I wrote:
> Index: gcc/df-problems.c
> ===================================================================
> --- gcc/df-problems.c (revision 125811)
> +++ gcc/df-problems.c (working copy)
> @@ -1574,7 +1574,7 @@
> /* Call-clobbered registers die across exception and call edges. */
> /* ??? Abnormal call edges ignored for the moment, as this gets
> confused by sibling call edges, which crashes reg-stack. */
> - if (e->flags & EDGE_EH)
> + if ((e->flags & EDGE_EH) || (e->flags & EDGE_SIBCALL))
> bitmap_ior_and_compl_into (op1, op2, df_invalidated_by_call);
> else
> bitmap_ior_into (op1, op2);
Adding the patch below seems to make reg-stack happy, so this may be a way
to fix the edge information.
bye, Roman
Index: gcc/gcc/reg-stack.c
===================================================================
--- gcc.orig/gcc/reg-stack.c
+++ gcc/gcc/reg-stack.c
@@ -2316,6 +2316,12 @@ subst_stack_regs (rtx insn, stack regsta
if (NOTE_P (insn) || INSN_DELETED_P (insn))
return control_flow_insn_deleted;
+ if (SIBLING_CALL_P (insn))
+ {
+ CLEAR_HARD_REG_SET (regstack->reg_set);
+ 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)