This patch came about because I noticed a comment about "the second
condition" in rs6000_emit_epilogue no longer matched the code. I was
going to fix the comment, then noticed the code could be simplified.
In rs6000_emit_epilogue, lr_save_offset is a small positive value (4,8
or 16), or zero when !lr_save_p, and total_size a HOST_WIDE_INT. In
rs6000_legitimate_offset_address_p, "offset" is an unsigned
HOST_WIDE_INT, "extra" a value between 0 and 12.
Unless my numerical analysis has totally deserted me, the new code
here is exactly equivalent to the old. Bootstrapped and regression
tested powerpc-linux. Committing as obvious.
* config/rs6000/rs6000.c (rs6000_emit_epilogue): Simplify
use_backchain_to_restore_sp initialisation.
(rs6000_legitimate_offset_address_p): Simplify offset test.
Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c (revision 177267)
+++ gcc/config/rs6000/rs6000.c (working copy)
@@ -5391,9 +5391,9 @@ rs6000_legitimate_offset_address_p (enum
break;
}
offset += 0x8000;
- return (offset < 0x10000) && (offset + extra < 0x10000);
+ return offset < 0x10000 - extra;
}
bool
legitimate_indexed_address_p (rtx x, int strict)
@@ -20711,12 +20711,9 @@ rs6000_emit_epilogue (int sibcall)
is more efficient than an addis, addi pair. The second condition
here will not trigger at the moment; We don't actually need a
frame pointer for alloca, but the generic parts of the compiler
give us one anyway. */
- use_backchain_to_restore_sp = (info->total_size > 32767
- || info->total_size
- + (info->lr_save_p ? info->lr_save_offset
: 0)
- > 32767
+ use_backchain_to_restore_sp = (info->total_size > 32767 -
info->lr_save_offset
|| (cfun->calls_alloca
&& !frame_pointer_needed));
restore_lr = (info->lr_save_p
&& (restoring_FPRs_inline
--
Alan Modra
Australia Development Lab, IBM