On 2011/5/13 04:26 PM, Richard Sandiford wrote: > Richard Sandiford <richard.sandif...@linaro.org> writes: >> Chung-Lin Tang <clt...@codesourcery.com> writes: >>> My fix here simply adds 'reload_completed' as an additional condition >>> for EPILOGUE_USES to return true for LR_REGNUM. I think this should be >>> valid, as correct LR save/restoring is handled by the epilogue/prologue >>> code; it should be safe for IRA to treat it as a normal call-used register. >> >> FWIW, epilogue_completed might be a more accurate choice. > > I still stand by this, although I realise no other target does it.
Did a re-test of the patch just to be sure, as expected the test results were also clear. Attached is the updated patch. >> It seems a lot of other ports suffer from the same problem though. >> I wonder which targets really do want to make a register live throughout >> the function? If none do, perhaps we should say that this macro is >> only meaningful once the epilogue has been generated. > > To answer my own question, I suppose VRSAVE is one. So I was wrong > about the target-independent "fix". > > Richard To rehash what I remember we discussed at LDS, such registers like VRSAVE might be more appropriately placed in global regs. It looks like EPILOGUE_USES could be more clarified in its use... To Richard Earnshaw and Ramana, is the patch okay for trunk? This should be a not-so-insignificant performance regression-fix/improvement. Thanks, Chung-Lin
Index: config/arm/arm.h =================================================================== --- config/arm/arm.h (revision 173814) +++ config/arm/arm.h (working copy) @@ -1627,7 +1627,7 @@ frame. */ #define EXIT_IGNORE_STACK 1 -#define EPILOGUE_USES(REGNO) ((REGNO) == LR_REGNUM) +#define EPILOGUE_USES(REGNO) (epilogue_completed && (REGNO) == LR_REGNUM) /* Determine if the epilogue should be output as RTL. You should override this if you define FUNCTION_EXTRA_EPILOGUE. */