This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH ARM -- clean up sibcalls


This patch cleans up sibling call generation so that we don't 
unnecessarily clobber the return register, this means that simple 
tail-calling functions may not have to save any registers at all, eg before

int foo(int);

int bar ()
{
  foo(1);
}

was compiled as

bar:
	str	lr, [sp, #-4]!
	mov	r0, #1
	ldr	lr, [sp], #4
	b	foo

We now get

bar:
	mov	r0, #1
	b	foo

2002-07-29  Richard Earnshaw  <rearnsha@arm.com>

	* arm.md (sibcall, sibcall_value): Add RETURN as part of the pattern,
	remove clobber of LR.
	(sibcall_insn, sibcall_value_insn): Update accordingly.
	(sibcall_epilogue): Remove debugging comment from assembler stream.

Index: arm.md
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/arm/arm.md,v
retrieving revision 1.103
diff -p -r1.103 arm.md
*** arm.md	24 Jul 2002 18:29:00 -0000	1.103
--- arm.md	29 Jul 2002 12:37:38 -0000
***************
*** 6691,6698 ****
  (define_expand "sibcall"
    [(parallel [(call (match_operand 0 "memory_operand" "")
  		    (match_operand 1 "general_operand" ""))
! 	      (use (match_operand 2 "" ""))
! 	      (use (reg:SI LR_REGNUM))])]
    "TARGET_ARM"
    "
    {
--- 6691,6698 ----
  (define_expand "sibcall"
    [(parallel [(call (match_operand 0 "memory_operand" "")
  		    (match_operand 1 "general_operand" ""))
! 	      (return)
! 	      (use (match_operand 2 "" ""))])]
    "TARGET_ARM"
    "
    {
***************
*** 6705,6712 ****
    [(parallel [(set (match_operand 0 "register_operand" "")
  		   (call (match_operand 1 "memory_operand" "")
  			 (match_operand 2 "general_operand" "")))
! 	      (use (match_operand 3 "" ""))
! 	      (use (reg:SI LR_REGNUM))])]
    "TARGET_ARM"
    "
    {
--- 6705,6712 ----
    [(parallel [(set (match_operand 0 "register_operand" "")
  		   (call (match_operand 1 "memory_operand" "")
  			 (match_operand 2 "general_operand" "")))
! 	      (return)
! 	      (use (match_operand 3 "" ""))])]
    "TARGET_ARM"
    "
    {
***************
*** 6718,6725 ****
  (define_insn "*sibcall_insn"
   [(call (mem:SI (match_operand:SI 0 "" "X"))
  	(match_operand 1 "" ""))
!   (use (match_operand 2 "" ""))
!   (use (reg:SI LR_REGNUM))]
    "TARGET_ARM && GET_CODE (operands[0]) == SYMBOL_REF"
    "*
    return NEED_PLT_RELOC ? \"b%?\\t%a0(PLT)\" : \"b%?\\t%a0\";
--- 6718,6725 ----
  (define_insn "*sibcall_insn"
   [(call (mem:SI (match_operand:SI 0 "" "X"))
  	(match_operand 1 "" ""))
!   (return)
!   (use (match_operand 2 "" ""))]
    "TARGET_ARM && GET_CODE (operands[0]) == SYMBOL_REF"
    "*
    return NEED_PLT_RELOC ? \"b%?\\t%a0(PLT)\" : \"b%?\\t%a0\";
***************
*** 6731,6738 ****
   [(set (match_operand 0 "s_register_operand" "=r,f")
         (call (mem:SI (match_operand:SI 1 "" "X,X"))
  	     (match_operand 2 "" "")))
!   (use (match_operand 3 "" ""))
!   (use (reg:SI LR_REGNUM))]
    "TARGET_ARM && GET_CODE (operands[1]) == SYMBOL_REF"
    "*
    return NEED_PLT_RELOC ? \"b%?\\t%a1(PLT)\" : \"b%?\\t%a1\";
--- 6731,6738 ----
   [(set (match_operand 0 "s_register_operand" "=r,f")
         (call (mem:SI (match_operand:SI 1 "" "X,X"))
  	     (match_operand 2 "" "")))
!   (return)
!   (use (match_operand 3 "" ""))]
    "TARGET_ARM && GET_CODE (operands[1]) == SYMBOL_REF"
    "*
    return NEED_PLT_RELOC ? \"b%?\\t%a1(PLT)\" : \"b%?\\t%a1\";
***************
*** 8656,8662 ****
    [(unspec_volatile [(const_int 0)] VUNSPEC_EPILOGUE)]
    "TARGET_ARM"
    "*
-   output_asm_insn (\"%@ Sibcall epilogue\", operands);
    if (USE_RETURN_INSN (FALSE))
      return output_return_instruction (const_true_rtx, FALSE, FALSE);
    return arm_output_epilogue (FALSE);
--- 8656,8661 ----

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]