This is the mail archive of the 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]

[arm] Redundant return instructions

We currently emit a redundant return instruction when a function has pertend 
args and a frame pointer.

For example, when the following code compiled with -O2 -fno-omit-frame-pointer
foo (int num, ...)
  return num;

The last two instructions are 
        ldmfd   sp, {fp, sp, pc}
        mov     pc, lr

This is a regression caused by my earlier cleanup in this area. Patch below 
fixes it.
The conditions removed do not apply when a frame pointer is used.
When a frame pointer is used the check is redundant as the same condition is 
used to set saved_regs_mask|(1<<PC_REGNUM) earlier in the function.

Tested with cross to arm-none-elf.

2004-06-24  Paul Brook  <>

	* config/arm/arm.c (arm_output_epilogue): Remove excess checks.

Index: config/arm/arm.c
RCS file: /var/cvsroot/gcc-cvs/gcc/gcc/config/arm/arm.c,v
retrieving revision 1.365
diff -u -p -r1.365 arm.c
--- config/arm/arm.c	28 May 2004 16:00:00 -0000	1.365
+++ config/arm/arm.c	24 Jun 2004 00:03:36 -0000
@@ -9705,10 +9705,7 @@ arm_output_epilogue (rtx sibling)
   /* We may have already restored PC directly from the stack.  */
-  if (! really_return
-    || (ARM_FUNC_TYPE (func_type) == ARM_FT_NORMAL
-	&& current_function_pretend_args_size == 0
-	&& saved_regs_mask & (1 << PC_REGNUM)))
+  if (!really_return || saved_regs_mask & (1 << PC_REGNUM))
     return "";
   /* Generate the return instruction.  */

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