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)

Reply via email to