always define HAVE_simple_return and HAVE_return

gcc/ChangeLog:

2015-04-27  Trevor Saunders  <tbsaunde+gcc@tbsaunde.org>

	* bb-reorder.c (HAVE_return): Don't check if its undefined.
	* defaults.h (gen_simple_return): New function.
	(gen_simple_return): Likewise.
	(HAVE_return): Add default definition to false.
	(HAVE_simple_return): Likewise.
	* cfgrtl.c (force_nonfallthru_and_redirect): Remove checks if
	HAVE_return and HAVE_simple_return are defined.
	* function.c (gen_return_pattern): Likewise.
	(convert_jumps_to_returns): Likewise.
	(thread_prologue_and_epilogue_insns): Likewise.
	* reorg.c (find_end_label): Likewise.
	(dbr_schedule): Likewise.
	* shrink-wrap.c: Likewise.
	* shrink-wrap.h: Likewise.

From-SVN: r222505
This commit is contained in:
Trevor Saunders 2015-04-28 04:44:09 +00:00 committed by Trevor Saunders
parent a3699d669a
commit 08b7ff1e1d
8 changed files with 58 additions and 75 deletions

View File

@ -1,3 +1,20 @@
2015-04-27 Trevor Saunders <tbsaunde+gcc@tbsaunde.org>
* bb-reorder.c (HAVE_return): Don't check if its undefined.
* defaults.h (gen_simple_return): New function.
(gen_simple_return): Likewise.
(HAVE_return): Add default definition to false.
(HAVE_simple_return): Likewise.
* cfgrtl.c (force_nonfallthru_and_redirect): Remove checks if
HAVE_return and HAVE_simple_return are defined.
* function.c (gen_return_pattern): Likewise.
(convert_jumps_to_returns): Likewise.
(thread_prologue_and_epilogue_insns): Likewise.
* reorg.c (find_end_label): Likewise.
(dbr_schedule): Likewise.
* shrink-wrap.c: Likewise.
* shrink-wrap.h: Likewise.
2015-04-27 Trevor Saunders <tbsaunde+gcc@tbsaunde.org>
* defaults.h (EPILOGUE_USES): Add default definition of false.

View File

@ -142,15 +142,6 @@
the object file there will be an extra round. */
#define N_ROUNDS 5
/* Stubs in case we don't have a return insn.
We have to check at run time too, not only compile time. */
#ifndef HAVE_return
#define HAVE_return 0
#define gen_return() NULL_RTX
#endif
struct target_bb_reorder default_target_bb_reorder;
#if SWITCHABLE_TARGET
struct target_bb_reorder *this_target_bb_reorder = &default_target_bb_reorder;

View File

@ -1705,21 +1705,19 @@ force_nonfallthru_and_redirect (edge e, basic_block target, rtx jump_label)
{
if (jump_label == ret_rtx)
{
#ifdef HAVE_return
if (!HAVE_return)
gcc_unreachable ();
emit_jump_insn_after_setloc (gen_return (), BB_END (jump_block), loc);
#else
gcc_unreachable ();
#endif
}
else
{
gcc_assert (jump_label == simple_return_rtx);
#ifdef HAVE_simple_return
if (!HAVE_simple_return)
gcc_unreachable ();
emit_jump_insn_after_setloc (gen_simple_return (),
BB_END (jump_block), loc);
#else
gcc_unreachable ();
#endif
}
set_return_jump_label (BB_END (jump_block));
}

View File

@ -1398,6 +1398,26 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#define TARGET_SUPPORTS_WIDE_INT 0
#endif
#ifndef HAVE_simple_return
#define HAVE_simple_return 0
static inline rtx
gen_simple_return ()
{
gcc_unreachable ();
return NULL;
}
#endif
#ifndef HAVE_return
#define HAVE_return 0
static inline rtx
gen_return ()
{
gcc_unreachable ();
return NULL;
}
#endif
#endif /* GCC_INSN_FLAGS_H */
#endif /* ! GCC_DEFAULTS_H */

View File

@ -5649,7 +5649,6 @@ prologue_epilogue_contains (const_rtx insn)
return 0;
}
#ifdef HAVE_return
/* Insert use of return register before the end of BB. */
static void
@ -5674,12 +5673,10 @@ emit_use_return_register_into_block (basic_block bb)
static rtx
gen_return_pattern (bool simple_p)
{
#ifdef HAVE_simple_return
if (!HAVE_simple_return)
gcc_assert (!simple_p);
return simple_p ? gen_simple_return () : gen_return ();
#else
gcc_assert (!simple_p);
return gen_return ();
#endif
}
/* Insert an appropriate return pattern at the end of block BB. This
@ -5697,7 +5694,6 @@ emit_return_into_block (bool simple_p, basic_block bb)
gcc_assert (ANY_RETURN_P (pat));
JUMP_LABEL (jump) = pat;
}
#endif
/* Set JUMP_LABEL for a return insn. */
@ -5713,7 +5709,6 @@ set_return_jump_label (rtx returnjump)
JUMP_LABEL (returnjump) = ret_rtx;
}
#if defined (HAVE_return) || defined (HAVE_simple_return)
/* Return true if there are any active insns between HEAD and TAIL. */
bool
active_insn_between (rtx_insn *head, rtx_insn *tail)
@ -5788,15 +5783,13 @@ convert_jumps_to_returns (basic_block last_bb, bool simple_p,
dest = ret_rtx;
if (!redirect_jump (jump, dest, 0))
{
#ifdef HAVE_simple_return
if (simple_p)
if (HAVE_simple_return && simple_p)
{
if (dump_file)
fprintf (dump_file,
"Failed to redirect bb %d branch.\n", bb->index);
unconverted.safe_push (e);
}
#endif
continue;
}
@ -5811,15 +5804,13 @@ convert_jumps_to_returns (basic_block last_bb, bool simple_p,
}
else
{
#ifdef HAVE_simple_return
if (simple_p)
if (HAVE_simple_return && simple_p)
{
if (dump_file)
fprintf (dump_file,
"Failed to redirect bb %d branch.\n", bb->index);
unconverted.safe_push (e);
}
#endif
continue;
}
@ -5847,7 +5838,6 @@ emit_return_for_exit (edge exit_fallthru_edge, bool simple_p)
exit_fallthru_edge->flags &= ~EDGE_FALLTHRU;
return last_bb;
}
#endif
/* Generate the prologue and epilogue RTL if the machine supports it. Thread
@ -5902,10 +5892,8 @@ void
thread_prologue_and_epilogue_insns (void)
{
bool inserted;
#ifdef HAVE_simple_return
vec<edge> unconverted_simple_returns = vNULL;
bitmap_head bb_flags;
#endif
rtx_insn *returnjump;
rtx_insn *epilogue_end ATTRIBUTE_UNUSED;
rtx_insn *prologue_seq ATTRIBUTE_UNUSED, *split_prologue_seq ATTRIBUTE_UNUSED;
@ -5976,7 +5964,6 @@ thread_prologue_and_epilogue_insns (void)
}
#endif
#ifdef HAVE_simple_return
bitmap_initialize (&bb_flags, &bitmap_default_obstack);
/* Try to perform a kind of shrink-wrapping, making sure the
@ -5984,7 +5971,6 @@ thread_prologue_and_epilogue_insns (void)
function that require it. */
try_shrink_wrapping (&entry_edge, orig_entry_edge, &bb_flags, prologue_seq);
#endif
if (split_prologue_seq != NULL_RTX)
{
@ -6009,14 +5995,11 @@ thread_prologue_and_epilogue_insns (void)
exit_fallthru_edge = find_fallthru_edge (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds);
#ifdef HAVE_simple_return
if (entry_edge != orig_entry_edge)
if (HAVE_simple_return && entry_edge != orig_entry_edge)
exit_fallthru_edge
= get_unconverted_simple_return (exit_fallthru_edge, bb_flags,
&unconverted_simple_returns,
&returnjump);
#endif
#ifdef HAVE_return
if (HAVE_return)
{
if (exit_fallthru_edge == NULL)
@ -6035,17 +6018,16 @@ thread_prologue_and_epilogue_insns (void)
{
last_bb = emit_return_for_exit (exit_fallthru_edge, false);
epilogue_end = returnjump = BB_END (last_bb);
#ifdef HAVE_simple_return
/* Emitting the return may add a basic block.
Fix bb_flags for the added block. */
if (last_bb != exit_fallthru_edge->src)
if (HAVE_simple_return && last_bb != exit_fallthru_edge->src)
bitmap_set_bit (&bb_flags, last_bb->index);
#endif
goto epilogue_done;
}
}
}
#endif
/* A small fib -- epilogue is not yet completed, but we wish to re-use
this marker for the splits of EH_RETURN patterns, and nothing else
@ -6157,10 +6139,9 @@ epilogue_done:
}
}
#ifdef HAVE_simple_return
convert_to_simple_return (entry_edge, orig_entry_edge, bb_flags, returnjump,
unconverted_simple_returns);
#endif
if (HAVE_simple_return)
convert_to_simple_return (entry_edge, orig_entry_edge, bb_flags,
returnjump, unconverted_simple_returns);
#ifdef HAVE_sibcall_epilogue
/* Emit sibling epilogues before any sibling call sites. */
@ -6174,11 +6155,8 @@ epilogue_done:
if (!CALL_P (insn)
|| ! SIBLING_CALL_P (insn)
#ifdef HAVE_simple_return
|| (entry_edge != orig_entry_edge
&& !bitmap_bit_p (&bb_flags, bb->index))
#endif
)
|| (HAVE_simple_return && (entry_edge != orig_entry_edge
&& !bitmap_bit_p (&bb_flags, bb->index))))
{
ei_next (&ei);
continue;
@ -6225,9 +6203,7 @@ epilogue_done:
}
#endif
#ifdef HAVE_simple_return
bitmap_clear (&bb_flags);
#endif
/* Threading the prologue and epilogue changes the artificial refs
in the entry and exit blocks. */

View File

@ -485,11 +485,7 @@ find_end_label (rtx kind)
else
{
#ifdef HAVE_epilogue
if (HAVE_epilogue
#ifdef HAVE_return
&& ! HAVE_return
#endif
)
if (HAVE_epilogue && ! HAVE_return)
/* The RETURN insn has its delay slot filled so we cannot
emit the label just before it. Since we already have
an epilogue and cannot emit a new RETURN, we cannot
@ -500,7 +496,6 @@ find_end_label (rtx kind)
/* Otherwise, make a new label and emit a RETURN and BARRIER,
if needed. */
emit_label (label);
#ifdef HAVE_return
if (HAVE_return)
{
/* The return we make may have delay slots too. */
@ -511,7 +506,6 @@ find_end_label (rtx kind)
if (num_delay_slots (insn) > 0)
obstack_ptr_grow (&unfilled_slots_obstack, insn);
}
#endif
}
*plabel = label;
}
@ -3825,12 +3819,8 @@ dbr_schedule (rtx_insn *first)
delete_related_insns (function_simple_return_label);
need_return_insns = false;
#ifdef HAVE_return
need_return_insns |= HAVE_return && function_return_label != 0;
#endif
#ifdef HAVE_simple_return
need_return_insns |= HAVE_simple_return && function_simple_return_label != 0;
#endif
if (need_return_insns)
make_return_insns (first);

View File

@ -80,7 +80,6 @@ along with GCC; see the file COPYING3. If not see
#include "regcprop.h"
#include "rtl-iter.h"
#ifdef HAVE_simple_return
/* Return true if INSN requires the stack frame to be set up.
PROLOGUE_USED contains the hard registers used in the function
@ -1043,5 +1042,3 @@ convert_to_simple_return (edge entry_edge, edge orig_entry_edge,
}
}
}
#endif

View File

@ -23,9 +23,6 @@ along with GCC; see the file COPYING3. If not see
#include "hashtab.h"
#include "vec.h"
#include "machmode.h"
#ifdef HAVE_simple_return
#include "function.h"
/* In shrink-wrap.c. */
@ -43,9 +40,6 @@ extern void convert_to_simple_return (edge entry_edge, edge orig_entry_edge,
rtx_insn *returnjump,
vec<edge> unconverted_simple_returns);
#define SHRINK_WRAPPING_ENABLED (flag_shrink_wrap && HAVE_simple_return)
#else
#define SHRINK_WRAPPING_ENABLED false
#endif
#endif /* GCC_SHRINK_WRAP_H */