OSDN Git Service

PR Bug middle-end/50232
authordanglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 3 Sep 2011 16:21:27 +0000 (16:21 +0000)
committerdanglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 3 Sep 2011 16:21:27 +0000 (16:21 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@178500 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/pa/pa-protos.h
gcc/config/pa/pa.c
gcc/config/pa/pa.md

index 8da81f7..a6d6f3b 100644 (file)
@@ -1,3 +1,11 @@
+2011-09-03  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+
+       PR Bug 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.
+
 2011-09-03  Eric Botcazou  <ebotcazou@adacore.com>
 
        * cfgexpand.c (add_stack_var): Assert that the alignment is not zero.
index d481c3d..8c733e4 100644 (file)
@@ -93,6 +93,7 @@ extern int and_mask_p (unsigned HOST_WIDE_INT);
 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 db404cd..e3ad4c8 100644 (file)
@@ -4329,6 +4329,24 @@ hppa_expand_epilogue (void)
     }
 }
 
+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 ee94b2e..62369a5 100644 (file)
 \f
 ;; 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)
   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 ();