rtl-optimization/32296
authordanglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 30 Jun 2007 14:26:18 +0000 (14:26 +0000)
committerdanglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 30 Jun 2007 14:26:18 +0000 (14:26 +0000)
* pa.md (return): Delete pattern.
(return_internal): Remove "(const_int 1)" from pattern.
(epilogue): Use return_internal pattern for trivial returns.
* pa-protos.h (hppa_can_use_return_insn_p): Delete declaration.
* pa.c (hppa_can_use_return_insn_p): Delete function.  Include "df.h".

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

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

index de2a2c1..27bcd14 100644 (file)
@@ -1,3 +1,12 @@
+2007-06-30  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+
+       rtl-optimization/32296
+       * pa.md (return): Delete pattern.
+       (return_internal): Remove "(const_int 1)" from pattern.
+       (epilogue): Use return_internal pattern for trivial returns.
+       * pa-protos.h (hppa_can_use_return_insn_p): Delete declaration.
+       * pa.c (hppa_can_use_return_insn_p): Delete function.  Include "df.h".
+
 2007-06-30  Daniel Berlin  <dberlin@dberlin.org>
        
        Fix PR tree-optimization/32540
index 8d60182..51b7ecb 100644 (file)
@@ -144,7 +144,6 @@ 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 int hppa_can_use_return_insn_p (void);
 extern int ior_mask_p (unsigned HOST_WIDE_INT);
 extern void compute_zdepdi_operands (unsigned HOST_WIDE_INT,
                                     unsigned *);
index f22f263..2be7b4e 100644 (file)
@@ -47,6 +47,7 @@ Boston, MA 02110-1301, USA.  */
 #include "tm_p.h"
 #include "target.h"
 #include "target-def.h"
+#include "df.h"
 
 /* Return nonzero if there is a bypass for the output of 
    OUT_INSN and the fp store IN_INSN.  */
@@ -4403,22 +4404,6 @@ return_addr_rtx (int count, rtx frameaddr)
   return saved_rp;
 }
 
-/* This is only valid once reload has completed because it depends on
-   knowing exactly how much (if any) frame there is and...
-
-   It's only valid if there is no frame marker to de-allocate and...
-
-   It's only valid if %r2 hasn't been saved into the caller's frame
-   (we're not profiling and %r2 isn't live anywhere).  */
-int
-hppa_can_use_return_insn_p (void)
-{
-  return (reload_completed
-         && (compute_frame_size (get_frame_size (), 0) ? 0 : 1)
-         && ! df_regs_ever_live_p (2)
-         && ! frame_pointer_needed);
-}
-
 void
 emit_bcond_fp (enum rtx_code code, rtx operand0)
 {
index 807e1ce..a732fa0 100644 (file)
 \f
 ;; Unconditional and other jump instructions.
 
-;; This can only be used in a leaf function, so we do
-;; not need to use the PIC register when generating PIC code.
-(define_insn "return"
-  [(return)
-   (use (reg:SI 2))
-   (const_int 0)]
-  "hppa_can_use_return_insn_p ()"
-  "*
-{
-  if (TARGET_PA_20)
-    return \"bve%* (%%r2)\";
-  return \"bv%* %%r0(%%r2)\";
-}"
-  [(set_attr "type" "branch")
-   (set_attr "length" "4")])
-
-;; Emit a different pattern for functions which have non-trivial
-;; epilogues so as not to confuse jump and reorg.
+;; This is used for most returns.
 (define_insn "return_internal"
   [(return)
-   (use (reg:SI 2))
-   (const_int 1)]
+   (use (reg:SI 2))]
   ""
   "*
 {
   ""
   "
 {
-  /* Try to use the trivial return first.  Else use the full
-     epilogue.  */
-  if (hppa_can_use_return_insn_p ())
-    emit_jump_insn (gen_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 ();
   else
     {
-      rtx x;
-
       hppa_expand_epilogue ();
 
       /* EH returns bypass the normal return stub.  Thus, we must do an
        x = gen_return_external_pic ();
       else
        x = gen_return_internal ();
-
-      emit_jump_insn (x);
     }
+  emit_jump_insn (x);
   DONE;
 }")