aboutsummaryrefslogtreecommitdiff
path: root/gcc/function.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/function.c')
-rw-r--r--gcc/function.c52
1 files changed, 14 insertions, 38 deletions
diff --git a/gcc/function.c b/gcc/function.c
index 9077c91..561a1c5 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -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. */