+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.
return 0;
}
-#ifdef HAVE_return
/* Insert use of return register before the end of BB. */
static void
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
gcc_assert (ANY_RETURN_P (pat));
JUMP_LABEL (jump) = pat;
}
-#endif
/* Set JUMP_LABEL for a return insn. */
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)
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;
}
}
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;
}
exit_fallthru_edge->flags &= ~EDGE_FALLTHRU;
return last_bb;
}
-#endif
/* Generate the prologue and epilogue RTL if the machine supports it. Thread
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;
}
#endif
-#ifdef HAVE_simple_return
bitmap_initialize (&bb_flags, &bitmap_default_obstack);
/* Try to perform a kind of shrink-wrapping, making sure the
function that require it. */
try_shrink_wrapping (&entry_edge, orig_entry_edge, &bb_flags, prologue_seq);
-#endif
if (split_prologue_seq != NULL_RTX)
{
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)
{
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
}
}
-#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. */
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;
}
#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. */
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
/* 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. */
if (num_delay_slots (insn) > 0)
obstack_ptr_grow (&unfilled_slots_obstack, insn);
}
-#endif
}
*plabel = label;
}
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);