diff options
Diffstat (limited to 'gcc/function.c')
-rw-r--r-- | gcc/function.c | 52 |
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. */ |