diff mbox

[committed] Define "return" pattern on pa

Message ID 20110903162806.GA11449@hiauly1.hia.nrc.ca
State New
Headers show

Commit Message

John David Anglin Sept. 3, 2011, 4:28 p.m. UTC
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
diff mbox

Patch

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)
 {