This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR 53743 and other -freorder-blocks-and-partition failures (issue6823047)
- From: tejohnson at google dot com (Teresa Johnson)
- To: reply at codereview dot appspotmail dot com,davidxl at google dot com,gcc-patches at gcc dot gnu dot org
- Date: Mon, 29 Oct 2012 22:20:00 -0700 (PDT)
- Subject: [PATCH] Fix PR 53743 and other -freorder-blocks-and-partition failures (issue6823047)
This patch fixes three different failures I encountered while trying to use
-freorder-blocks-and-partition, including the failure reported in PR 53743.
Bootstrapped and tested on x86_64-unknown-linux-gnu. Ok for trunk?
Thanks,
Teresa
2012-10-29 Teresa Johnson <tejohnson@google.com>
PR optimization/53743
* function.c (thread_prologue_and_epilogue_insns): Don't
store exit predecessor BB until after it is potentially split.
* bb-reorder.c (insert_section_boundary_note): Ensure that
a barrier exists before a switch section node, as this is expected
by later passes (e.g. dwarf CFI code).
* cfgrtl.c (rtl_can_merge_blocks): Use the same condition looking
for region-crossing jumps as in try_redirect_by_replacing_jump,
which may be called while merging blocks.
(cfg_layout_can_merge_blocks_p): Ditto.
Index: function.c
===================================================================
--- function.c (revision 192692)
+++ function.c (working copy)
@@ -6517,7 +6517,7 @@ epilogue_done:
basic_block simple_return_block_cold = NULL;
edge pending_edge_hot = NULL;
edge pending_edge_cold = NULL;
- basic_block exit_pred = EXIT_BLOCK_PTR->prev_bb;
+ basic_block exit_pred;
int i;
gcc_assert (entry_edge != orig_entry_edge);
@@ -6545,6 +6545,12 @@ epilogue_done:
else
pending_edge_cold = e;
}
+
+ /* Save a pointer to the exit's predecessor BB for use in
+ inserting new BBs at the end of the function. Do this
+ after the call to split_block above which may split
+ the original exit pred. */
+ exit_pred = EXIT_BLOCK_PTR->prev_bb;
FOR_EACH_VEC_ELT (edge, unconverted_simple_returns, i, e)
{
Index: bb-reorder.c
===================================================================
--- bb-reorder.c (revision 192692)
+++ bb-reorder.c (working copy)
@@ -2188,6 +2188,8 @@ insert_section_boundary_note (void)
first_partition = BB_PARTITION (bb);
if (BB_PARTITION (bb) != first_partition)
{
+ /* There should be a barrier between text sections. */
+ emit_barrier_after (BB_END (bb->prev_bb));
new_note = emit_note_before (NOTE_INSN_SWITCH_TEXT_SECTIONS,
BB_HEAD (bb));
/* ??? This kind of note always lives between basic blocks,
Index: cfgrtl.c
===================================================================
--- cfgrtl.c (revision 192692)
+++ cfgrtl.c (working copy)
@@ -912,7 +912,8 @@ rtl_can_merge_blocks (basic_block a, basic_block b
partition boundaries). See the comments at the top of
bb-reorder.c:partition_hot_cold_basic_blocks for complete details. */
- if (BB_PARTITION (a) != BB_PARTITION (b))
+ if (find_reg_note (BB_END (a), REG_CROSSING_JUMP, NULL_RTX)
+ || BB_PARTITION (a) != BB_PARTITION (b))
return false;
/* Protect the loop latches. */
@@ -3978,7 +3979,8 @@ cfg_layout_can_merge_blocks_p (basic_block a, basi
partition boundaries). See the comments at the top of
bb-reorder.c:partition_hot_cold_basic_blocks for complete details. */
- if (BB_PARTITION (a) != BB_PARTITION (b))
+ if (find_reg_note (BB_END (a), REG_CROSSING_JUMP, NULL_RTX)
+ || BB_PARTITION (a) != BB_PARTITION (b))
return false;
/* Protect the loop latches. */
--
This patch is available for review at http://codereview.appspot.com/6823047