public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [patch, ARM] Fix PR42017, LR not used in leaf functions
@ 2011-04-28  6:34 Chung-Lin Tang
  2011-05-03 13:24 ` Richard Sandiford
  0 siblings, 1 reply; 9+ messages in thread
From: Chung-Lin Tang @ 2011-04-28  6:34 UTC (permalink / raw)
  To: gcc-patches; +Cc: Richard Earnshaw, Ramana Radhakrishnan

[-- Attachment #1: Type: text/plain, Size: 1579 bytes --]

Hi, this patch tries to solve the problem of the LR register not
being used in leaf functions on ARM.

Looking at the dumps, it shows that register 14 (lr) conflicts with all
allocnos throughout the entire leaf procedure. A little digging shows
that lr is present in the OBJECT_CONFLICT_HARD_REGS() set of all
allocnos, which suggests that this may manifest from a convention of
some sort the code is currently following.

It turns out that, during the IRA liveness computations, the DF initing
of live hard regs, starting from the bottom end of the function, adds
EPILOGUE_USES right from the start. With no call sites to kill its
liveness, the entire procedure is prohibited from using LR at all.

This problem may also be more serious than just leaf functions.
Theoretically, this may affect all allocnos that happen to completely
lie on paths that reach the end of function without a call site, even in
non-leaf functions. All these are deprived of LR as an usable register.

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.

I did a cross-test on QEMU with clean results, plus a successful native
bootstrap on a Pandaboard. Is this okay for trunk?

Thanks,
Chung-Lin

2011-04-28  Chung-Lin Tang  <cltang@codesourcery.com>

	PR target/42017
	* config/arm/arm.h (EPILOGUE_USES): Only return true
	for LR_REGNUM after reload_completed.


[-- Attachment #2: arm-epilogue_uses.diff --]
[-- Type: text/plain, Size: 491 bytes --]

Index: config/arm/arm.h
===================================================================
--- config/arm/arm.h	(revision 173046)
+++ 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) (reload_completed && (REGNO) == LR_REGNUM)
 
 /* Determine if the epilogue should be output as RTL.
    You should override this if you define FUNCTION_EXTRA_EPILOGUE.  */


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2011-06-02  5:00 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-04-28  6:34 [patch, ARM] Fix PR42017, LR not used in leaf functions Chung-Lin Tang
2011-05-03 13:24 ` Richard Sandiford
2011-05-13 15:26   ` Richard Sandiford
2011-05-17  7:22     ` Chung-Lin Tang
2011-05-20 13:28       ` Ramana Radhakrishnan
2011-05-20 13:49         ` Chung-Lin Tang
2011-05-25 19:03           ` Chung-Lin Tang
2011-06-02  5:00             ` Ping " Chung-Lin Tang
2011-05-19 14:26     ` Eric Botcazou

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).