calls.c (expand_call): Don't bother generating tail call sequences if there are pendi...
authorRichard Henderson <rth@cygnus.com>
Mon, 20 Mar 2000 22:40:50 +0000 (14:40 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Mon, 20 Mar 2000 22:40:50 +0000 (14:40 -0800)
        * calls.c (expand_call): Don't bother generating tail call
        sequences if there are pending cleanups.  Use
        expand_start_target_temps/expand_end_target_temps to elide
        cleanups created during sibcall expansion.

From-SVN: r32653

gcc/ChangeLog
gcc/calls.c

index d98fbf16e23f225855e1b3bb66e250a59c51a904..dcb99bc0f34ef6141fd57a8b6651db1c6453a243 100644 (file)
@@ -1,3 +1,10 @@
+2000-03-20  Richard Henderson  <rth@cygnus.com>
+
+       * calls.c (expand_call): Don't bother generating tail call
+       sequences if there are pending cleanups.  Use
+       expand_start_target_temps/expand_end_target_temps to elide
+       cleanups created during sibcall expansion.
+
 2000-03-20  Geoff Keating  <geoffk@cygnus.com>
 
        * configure.in: Set $IFS to a value if it doesn't already have one
index 21feeed39ac1e3567746e3361de0f1b8406f708f..104cc0753f432c2b33fe91d83646cc0735f8a015 100644 (file)
@@ -2020,7 +2020,8 @@ expand_call (exp, target, ignore)
   safe_for_reeval = 0;
   if (optimize >= 2
       && currently_expanding_call == 1
-      && stmt_loop_nest_empty ())
+      && stmt_loop_nest_empty ()
+      && ! any_pending_cleanups (1))
     {
       /* Verify that each argument is safe for re-evaluation.  */
       for (p = actparms; p; p = TREE_CHAIN (p))
@@ -2152,6 +2153,12 @@ expand_call (exp, target, ignore)
              || ! FUNCTION_OK_FOR_SIBCALL (fndecl))
            continue;
 
+         /* We know at this point that there are not currently any
+            pending cleanups.  If, however, in the process of evaluating
+            the arguments we were to create some, we'll need to be
+            able to get rid of them.  */
+         expand_start_target_temps ();
+
          /* State variables we need to save and restore between
             iterations.  */
          save_pending_stack_adjust = pending_stack_adjust;
@@ -2925,6 +2932,14 @@ expand_call (exp, target, ignore)
        if (args[i].aligned_regs)
          free (args[i].aligned_regs);
 
+      if (pass == 0)
+       {
+         /* Undo the fake expand_start_target_temps we did earlier.  If
+            there had been any cleanups created, we've already set
+            sibcall_failure.  */
+         expand_end_target_temps ();
+       }
+
       insns = get_insns ();
       end_sequence ();