]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: PR Bug middle-end/50232
authorJohn David Anglin <dave.anglin@nrc-cnrc.gc.ca>
Mon, 12 Mar 2012 17:08:20 +0000 (17:08 +0000)
committerJohn David Anglin <danglin@gcc.gnu.org>
Mon, 12 Mar 2012 17:08:20 +0000 (17:08 +0000)
Backport from mainline
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.

From-SVN: r185252

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

index 296caa2b0cd2640fd9676c4f68b687cae965db0b..33767fa4eb532de73e210294e0a66153c179f487 100644 (file)
@@ -1,5 +1,14 @@
 2012-03-12  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
 
+       Backport from mainline
+       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.
+
        Backport for mainline
        2012-01-28  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
 
index dc42e55012f92ec90bb3063c6f3f6c2317c11c72..53dcda0094400626788d9997366fb0afc0a80193 100644 (file)
@@ -136,6 +136,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 1eaa88d222e889a681c4515bb9da4c6b3ea11ed6..5e5a0f05b79725f08d5623c1443bb647620778a6 100644 (file)
@@ -4442,6 +4442,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 c91e0579b4490336285480b51590060c68a33cf4..219900fc8ad9ad3171df062d579f61fb49c6a5b4 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 ();