mirror of
https://gcc.gnu.org/git/gcc.git
synced 2025-01-08 20:17:14 +08:00
i386.c (ix86_can_use_return_insn_p): Fail for large poped args and for non-empty stack frames.
* i386.c (ix86_can_use_return_insn_p): Fail for large poped args and for non-empty stack frames. * i386.md (return): Expand to return-pop as needed. From-SVN: r31827
This commit is contained in:
parent
69732dcb9c
commit
9a7372d646
@ -11,6 +11,10 @@
|
||||
* jump.c (jump_optimize_1): Remove code to insert a return insn
|
||||
on the fallthru to the exit block.
|
||||
|
||||
* i386.c (ix86_can_use_return_insn_p): Fail for large poped args
|
||||
and for non-empty stack frames.
|
||||
* i386.md (return): Expand to return-pop as needed.
|
||||
|
||||
2000-02-06 Richard Henderson <rth@cygnus.com>
|
||||
|
||||
* simplify-rtx.c (simplify_relational_operation): Canonicalize
|
||||
|
@ -1555,15 +1555,29 @@ symbolic_reference_mentioned_p (op)
|
||||
int
|
||||
ix86_can_use_return_insn_p ()
|
||||
{
|
||||
HOST_WIDE_INT tsize;
|
||||
int nregs;
|
||||
|
||||
#ifdef NON_SAVING_SETJMP
|
||||
if (NON_SAVING_SETJMP && current_function_calls_setjmp)
|
||||
return 0;
|
||||
#endif
|
||||
#ifdef FUNCTION_BLOCK_PROFILER_EXIT
|
||||
if (profile_block_flag == 2)
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
if (! reload_completed)
|
||||
if (! reload_completed || frame_pointer_needed)
|
||||
return 0;
|
||||
|
||||
return ix86_nsaved_regs () == 0 || ! frame_pointer_needed;
|
||||
/* Don't allow more than 32 pop, since that's all we can do
|
||||
with one instruction. */
|
||||
if (current_function_pops_args
|
||||
&& current_function_args_size >= 32768)
|
||||
return 0;
|
||||
|
||||
tsize = ix86_compute_frame_size (get_frame_size (), &nregs, NULL, NULL);
|
||||
return tsize == 0 && nregs == 0;
|
||||
}
|
||||
|
||||
static char *pic_label_name;
|
||||
|
@ -7218,7 +7218,15 @@
|
||||
(define_expand "return"
|
||||
[(return)]
|
||||
"ix86_can_use_return_insn_p ()"
|
||||
"")
|
||||
"
|
||||
{
|
||||
if (current_function_pops_args)
|
||||
{
|
||||
rtx popc = GEN_INT (current_function_pops_args);
|
||||
emit_jump_insn (gen_return_pop_internal (popc));
|
||||
DONE;
|
||||
}
|
||||
}")
|
||||
|
||||
(define_insn "return_internal"
|
||||
[(return)]
|
||||
|
Loading…
Reference in New Issue
Block a user