From 9a7372d64614a15d430fdf60a925a8958eec3ff3 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Sun, 6 Feb 2000 05:19:20 -0800 Subject: [PATCH] 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 --- gcc/ChangeLog | 4 ++++ gcc/config/i386/i386.c | 18 ++++++++++++++++-- gcc/config/i386/i386.md | 10 +++++++++- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ac0c6433a0e..06b32fb45a2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 * simplify-rtx.c (simplify_relational_operation): Canonicalize diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 82c0f07908c..de8517a0e79 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -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 || frame_pointer_needed) + return 0; - if (! reload_completed) + /* 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; - return ix86_nsaved_regs () == 0 || ! frame_pointer_needed; + tsize = ix86_compute_frame_size (get_frame_size (), &nregs, NULL, NULL); + return tsize == 0 && nregs == 0; } static char *pic_label_name; diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 4c36024756a..7624f23b08f 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -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)] -- 2.30.2