]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR Bug middle-end/50232
authorJohn David Anglin <dave.anglin@nrc-cnrc.gc.ca>
Sat, 3 Sep 2011 16:21:27 +0000 (16:21 +0000)
committerJohn David Anglin <danglin@gcc.gnu.org>
Sat, 3 Sep 2011 16:21:27 +0000 (16:21 +0000)
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.

From-SVN: r178500

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

index 8da81f7cbe3fa4435fcf14e6b55851f3b5e42cb1..a6d6f3bc3d47d17a05a56d076a860ed0ae3d58e6 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 d481c3d0ec2eb04e7022a5ea1e7510b6fd6340bd..8c733e4f6f4f126f633f56eecf6f8dd946670449 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 db404cd3c2e3dbb3bf12ce1ffbd042475613d19f..e3ad4c80d89118942989bdc16d0e2a1756237b75 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 ee94b2e9324c412628c52b4fcc73a2e2f4c3fcb1..62369a5e2b5004f0d2c8ce7d4ba06e95c66208ef 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 ();