* calls.c (expand_call): Fail sibcall when
!flag_optimize_sibling_calls
* invoke.texi (flag_optimize_sibling_calls): Document.
* toplev.c (flag_optimize_sibling_calls): New global variable.
(f_options): Add flag_optimize_sibling_calls.
(rest_of_compilation): Conditionize
optimize_sibling_and_tail_recursive_calls by
flag_optimize_sibling_calls.
(main): Set flag_optimize_sibling_calls for -O2.
* stmt.c (expand_return): Conditionize tail recursion by
flag_optimize_sibling_calls.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@32802
138bc75d-0d04-0410-961f-
82ee72b054a4
+Wed Mar 29 11:51:13 MET DST 2000 Jan Hubicka <jh@suse.cz>
+
+ * flags.h (flag_optimize_sibling_calls): Declare.
+ * calls.c (expand_call): Fail sibcall when
+ !flag_optimize_sibling_calls
+ * invoke.texi (flag_optimize_sibling_calls): Document.
+ * toplev.c (flag_optimize_sibling_calls): New global variable.
+ (f_options): Add flag_optimize_sibling_calls.
+ (rest_of_compilation): Conditionize
+ optimize_sibling_and_tail_recursive_calls by
+ flag_optimize_sibling_calls.
+ (main): Set flag_optimize_sibling_calls for -O2.
+ * stmt.c (expand_return): Conditionize tail recursion by
+ flag_optimize_sibling_calls.
+
2000-03-29 Richard Henderson <rth@cygnus.com>
* config/i386/att.h (LOCAL_LABEL_PREFIX): Define.
the call. */
try_tail_call = 0;
- if (optimize >= 2
+ if (flag_optimize_sibling_calls
&& currently_expanding_call == 1
&& stmt_loop_nest_empty ()
&& ! any_pending_cleanups (1))
extern int flag_fast_math;
+/* Nonzero allows GCC to optimize sibling and tail recursive calls. */
+
+extern int flag_optimize_sibling_calls;
+
/* Nonzero means the front end generally wants `errno' maintained by math
operations, like built-in SQRT, unless overridden by flag_fast_math. */
-finline-functions -finline-limit=@var{n} -fkeep-inline-functions
-fmove-all-movables -fno-default-inline -fno-defer-pop
-fno-function-cse -fno-inline -fno-peephole
--fomit-frame-pointer -foptimize-register-moves -fregmove
--frerun-cse-after-loop -frerun-loop-opt -freduce-all-givs
+-fomit-frame-pointer -foptimize-register-moves -foptimize-sibling-calls
+-fregmove -frerun-cse-after-loop -frerun-loop-opt -freduce-all-givs
-fschedule-insns -fschedule-insns2 -fstrength-reduce
-fstrict-aliasing -fthread-jumps -funroll-all-loops
-funroll-loops
in many functions. @strong{It also makes debugging impossible on
some machines.}
+@item -foptimize-sibling-calls
+Optimize sibling and tail recursive calls.
+
@ifset INTERNALS
On some machines, such as the Vax, this flag has no effect, because
the standard calling sequence automatically handles the frame pointer
}
/* Attempt to optimize the call if it is tail recursive. */
- if (optimize
+ if (flag_optimize_sibling_calls
&& retval_rhs != NULL_TREE
&& frame_offset == 0
&& TREE_CODE (retval_rhs) == CALL_EXPR
int flag_fast_math = 0;
+/* Nonzero allows GCC to optimize sibling and tail recursive calls. */
+
+int flag_optimize_sibling_calls = 0;
+
/* Nonzero means the front end generally wants `errno' maintained by math
operations, like built-in SQRT, unless overridden by flag_fast_math. */
"Defer popping functions args from stack until later" },
{"omit-frame-pointer", &flag_omit_frame_pointer, 1,
"When possible do not generate stack frames"},
+ {"optimize-sibling-calls", &flag_optimize_sibling_calls, 1,
+ "Optimize sibling and tail recursive calls" },
{"cse-follow-jumps", &flag_cse_follow_jumps, 1,
"When running CSE, follow jumps to their targets" },
{"cse-skip-blocks", &flag_cse_skip_blocks, 1,
/* We may have potential sibling or tail recursion sites. Select one
(of possibly multiple) methods of performing the call. */
init_EXPR_INSN_LIST_cache ();
- if (optimize)
+ if (flag_optimize_sibling_calls)
optimize_sibling_and_tail_recursive_calls ();
if (ggc_p)
if (optimize >= 2)
{
+ flag_optimize_sibling_calls = 1;
flag_cse_follow_jumps = 1;
flag_cse_skip_blocks = 1;
flag_gcse = 1;