+Fri Feb 12 13:06:28 1999 Jim Wilson <wilson@cygnus.com>
+
+ * stmt.c (expand_return): Return if optimize_tail_recursion succeeded.
+ (optimize_tail_recursion): Change return type from void to int.
+ Add return statements.
+ * tree.h (optimize_tail_recursion): Change prototype to match.
+
Fri Feb 12 21:09:51 1999 J"orn Rennecke <amylaar@cygnus.co.uk>
* reload.c (find_reloads_subreg_address): New function, broken out of
}
/* Attempt to optimize the call if it is tail recursive. */
- optimize_tail_recursion (retval_rhs, last_insn);
+ if (optimize_tail_recursion (retval_rhs, last_insn))
+ return;
#ifdef HAVE_return
/* This optimization is safe if there are local cleanups
\f
/* Test CALL_EXPR to determine if it is a potential tail recursion call
and emit code to optimize the tail recursion. LAST_INSN indicates where
- to place the jump to the tail recursion label.
+ to place the jump to the tail recursion label. Return TRUE if the
+ call was optimized into a goto.
This is only used by expand_return, but expand_call is expected to
use it soon. */
-void
+int
optimize_tail_recursion (call_expr, last_insn)
tree call_expr;
rtx last_insn;
emit_queue ();
expand_goto_internal (NULL_TREE, tail_recursion_label, last_insn);
emit_barrier ();
+ return 1;
}
+
+ return 0;
}
/* Emit code to alter this function's formal parms for a tail-recursive call.
extern void expand_null_return PROTO((void));
extern void expand_return PROTO((tree));
-extern void optimize_tail_recursion PROTO((tree, struct rtx_def *));
+extern int optimize_tail_recursion PROTO((tree, struct rtx_def *));
extern void expand_start_bindings PROTO((int));
extern void expand_end_bindings PROTO((tree, int, int));
extern void start_cleanup_deferral PROTO((void));