* 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
+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.
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 *);
}
}
+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)
{
\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 ();