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]

[committed] Define "return" pattern on pa


This change defines a "return" insn pattern on pa to improve return
optimization when no epilogue is needed.  Tested on hppa2.0w-hp-hpux11.11
and hppa-unknown-linux-gnu.  Committed to trunk.

Defining a "return" pattern fixes PR middle-end/50232 on PA.

Dave
-- 
J. David Anglin                                  dave.anglin@nrc-cnrc.gc.ca
National Research Council of Canada              (613) 990-0752 (FAX: 952-6602)

2011-09-03  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>

	PR middle-end/50232
	* config/pa/pa.md (return): Define "return" insn pattern.
	(epilogue): Use it when no epilogue is needed.
	* config/pa/pa.c (pa_can_use_return_insn): New function.
	* config/pa/pa-protos.h (pa_can_use_return_insn): Declare.

Index: config/pa/pa.md
===================================================================
--- config/pa/pa.md	(revision 178315)
+++ config/pa/pa.md	(working copy)
@@ -6671,6 +6671,20 @@
 
 ;; Unconditional and other jump instructions.
 
+;; Trivial return used when no epilogue is needed.
+(define_insn "return"
+  [(return)
+   (use (reg:SI 2))]
+  "pa_can_use_return_insn ()"
+  "*
+{
+  if (TARGET_PA_20)
+    return \"bve%* (%%r2)\";
+  return \"bv%* %%r0(%%r2)\";
+}"
+  [(set_attr "type" "branch")
+   (set_attr "length" "4")])
+
 ;; This is used for most returns.
 (define_insn "return_internal"
   [(return)
@@ -6719,11 +6733,8 @@
   rtx x;
 
   /* Try to use the trivial return first.  Else use the full epilogue.  */
-  if (reload_completed
-      && !frame_pointer_needed
-      && !df_regs_ever_live_p (2)
-      && (compute_frame_size (get_frame_size (), 0) ? 0 : 1))
-    x = gen_return_internal ();
+  if (pa_can_use_return_insn ())
+    x = gen_return ();
   else
     {
       hppa_expand_epilogue ();
Index: config/pa/pa-protos.h
===================================================================
--- config/pa/pa-protos.h	(revision 178315)
+++ config/pa/pa-protos.h	(working copy)
@@ -93,6 +93,7 @@
 extern int cint_ok_for_move (HOST_WIDE_INT);
 extern void hppa_expand_prologue (void);
 extern void hppa_expand_epilogue (void);
+extern bool pa_can_use_return_insn (void);
 extern int ior_mask_p (unsigned HOST_WIDE_INT);
 extern void compute_zdepdi_operands (unsigned HOST_WIDE_INT,
 				     unsigned *);
Index: config/pa/pa.c
===================================================================
--- config/pa/pa.c	(revision 178315)
+++ config/pa/pa.c	(working copy)
@@ -4329,6 +4329,24 @@
     }
 }
 
+bool
+pa_can_use_return_insn (void)
+{
+  if (!reload_completed)
+    return false;
+
+  if (frame_pointer_needed)
+    return false;
+
+  if (df_regs_ever_live_p (2))
+    return false;
+
+  if (crtl->profile)
+    return false;
+
+  return compute_frame_size (get_frame_size (), 0) == 0;
+}
+
 rtx
 hppa_pic_save_rtx (void)
 {


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