i386.c (ix86_can_use_return_insn_p): Fail for large poped args and for non-empty...
authorRichard Henderson <rth@cygnus.com>
Sun, 6 Feb 2000 13:19:20 +0000 (05:19 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Sun, 6 Feb 2000 13:19:20 +0000 (05:19 -0800)
        * 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
gcc/config/i386/i386.c
gcc/config/i386/i386.md

index ac0c6433a0ed1cc810f477d4e348e959b1ad6374..06b32fb45a2a26c428d7c8a08e906c0b81eb65bd 100644 (file)
        * 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
index 82c0f07908c87ffca89326c508cb9564ad188f24..de8517a0e79d41d3f2022b457b7bb49411017d1f 100644 (file)
@@ -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;
 }
 \f
 static char *pic_label_name;
index 4c36024756aee3aa33e0229927731a1dfa7f9bbe..7624f23b08f273a3ab9ad37917fbd15528c11341 100644 (file)
 (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)]