aboutsummaryrefslogtreecommitdiff
path: root/gcc/stmt.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>2000-03-26 16:50:27 -0800
committerRichard Henderson <rth@gcc.gnu.org>2000-03-26 16:50:27 -0800
commitb06775f990ad9fdc378388df18bbebf7d03ef9e3 (patch)
treeea8ea170426cc8cb9e99e73acabed34e6c0a6bc2 /gcc/stmt.c
parenta843e0ced84306002584b6c824996632690149d7 (diff)
downloadgcc-b06775f990ad9fdc378388df18bbebf7d03ef9e3.zip
gcc-b06775f990ad9fdc378388df18bbebf7d03ef9e3.tar.gz
gcc-b06775f990ad9fdc378388df18bbebf7d03ef9e3.tar.bz2
calls.c (expand_call): Pass parms not original exp to optimize_tail_recursion.
* calls.c (expand_call): Pass parms not original exp to optimize_tail_recursion. Mind return value instead of looking for a barrier. * stmt.c (optimize_tail_recursion): Take parameter list, not entire call_expr. Move checks for call_expr and current_function_decl ... (expand_return): ... here. From-SVN: r32758
Diffstat (limited to 'gcc/stmt.c')
-rw-r--r--gcc/stmt.c43
1 files changed, 18 insertions, 25 deletions
diff --git a/gcc/stmt.c b/gcc/stmt.c
index 0bcae69..88d665e 100644
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -2872,7 +2872,14 @@ expand_return (retval)
}
/* Attempt to optimize the call if it is tail recursive. */
- if (optimize_tail_recursion (retval_rhs, last_insn))
+ if (optimize
+ && retval_rhs != NULL_TREE
+ && frame_offset == 0
+ && TREE_CODE (retval_rhs) == CALL_EXPR
+ && TREE_CODE (TREE_OPERAND (retval_rhs, 0)) == ADDR_EXPR
+ && (TREE_OPERAND (TREE_OPERAND (retval_rhs, 0), 0)
+ == current_function_decl)
+ && optimize_tail_recursion (TREE_OPERAND (retval_rhs, 1), last_insn))
return;
#ifdef HAVE_return
@@ -3084,33 +3091,20 @@ drop_through_at_end_p ()
return insn && GET_CODE (insn) != BARRIER;
}
-/* 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. 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. */
+/* Attempt to optimize a potential tail recursion call into a goto.
+ ARGUMENTS are the arguments to a CALL_EXPR; LAST_INSN indicates
+ where to place the jump to the tail recursion label.
+
+ Return TRUE if the call was optimized into a goto. */
int
-optimize_tail_recursion (call_expr, last_insn)
- tree call_expr;
+optimize_tail_recursion (arguments, last_insn)
+ tree arguments;
rtx last_insn;
{
- /* For tail-recursive call to current function,
- just jump back to the beginning.
- It's unsafe if any auto variable in this function
- has its address taken; for simplicity,
- require stack frame to be empty. */
- if (optimize && call_expr != 0
- && frame_offset == 0
- && TREE_CODE (call_expr) == CALL_EXPR
- && TREE_CODE (TREE_OPERAND (call_expr, 0)) == ADDR_EXPR
- && TREE_OPERAND (TREE_OPERAND (call_expr, 0), 0) == current_function_decl
- /* Finish checking validity, and if valid emit code
- to set the argument variables for the new call. */
- && tail_recursion_args (TREE_OPERAND (call_expr, 1),
- DECL_ARGUMENTS (current_function_decl)))
+ /* Finish checking validity, and if valid emit code to set the
+ argument variables for the new call. */
+ if (tail_recursion_args (arguments, DECL_ARGUMENTS (current_function_decl)))
{
if (tail_recursion_label == 0)
{
@@ -3123,7 +3117,6 @@ optimize_tail_recursion (call_expr, last_insn)
emit_barrier ();
return 1;
}
-
return 0;
}