Commit 7792f13c by Eric Botcazou Committed by Eric Botcazou

cfgrtl.c (fixup_reorder_chain): Do not emit NOPs in DECL_IGNORED_P functions.

	* cfgrtl.c (fixup_reorder_chain): Do not emit NOPs in DECL_IGNORED_P
	functions.
	(rtl_merge_blocks): Likewise.  Do not emit a NOP if the location of
	the edge can be forwarded.
	(cfg_layout_merge_blocks): Likewise.

From-SVN: r261856
parent 56b97603
2018-06-21 Eric Botcazou <ebotcazou@adacore.com> 2018-06-21 Eric Botcazou <ebotcazou@adacore.com>
* cfgrtl.c (fixup_reorder_chain): Do not emit NOPs in DECL_IGNORED_P
functions.
(rtl_merge_blocks): Likewise. Do not emit a NOP if the location of
the edge can be forwarded.
(cfg_layout_merge_blocks): Likewise.
2018-06-21 Eric Botcazou <ebotcazou@adacore.com>
* except.c (finish_eh_generation): Commit edge insertions only after * except.c (finish_eh_generation): Commit edge insertions only after
the EH edges have been redirected from post-landing to landing pads. the EH edges have been redirected from post-landing to landing pads.
......
...@@ -813,10 +813,14 @@ emit_nop_for_unique_locus_between (basic_block a, basic_block b) ...@@ -813,10 +813,14 @@ emit_nop_for_unique_locus_between (basic_block a, basic_block b)
static void static void
rtl_merge_blocks (basic_block a, basic_block b) rtl_merge_blocks (basic_block a, basic_block b)
{ {
/* If B is a forwarder block whose outgoing edge has no location, we'll
propagate the locus of the edge between A and B onto it. */
const bool forward_edge_locus
= (b->flags & BB_FORWARDER_BLOCK) != 0
&& LOCATION_LOCUS (EDGE_SUCC (b, 0)->goto_locus) == UNKNOWN_LOCATION;
rtx_insn *b_head = BB_HEAD (b), *b_end = BB_END (b), *a_end = BB_END (a); rtx_insn *b_head = BB_HEAD (b), *b_end = BB_END (b), *a_end = BB_END (a);
rtx_insn *del_first = NULL, *del_last = NULL; rtx_insn *del_first = NULL, *del_last = NULL;
rtx_insn *b_debug_start = b_end, *b_debug_end = b_end; rtx_insn *b_debug_start = b_end, *b_debug_end = b_end;
bool forwarder_p = (b->flags & BB_FORWARDER_BLOCK) != 0;
int b_empty = 0; int b_empty = 0;
if (dump_file) if (dump_file)
...@@ -887,9 +891,11 @@ rtl_merge_blocks (basic_block a, basic_block b) ...@@ -887,9 +891,11 @@ rtl_merge_blocks (basic_block a, basic_block b)
BB_HEAD (b) = b_empty ? NULL : b_head; BB_HEAD (b) = b_empty ? NULL : b_head;
delete_insn_chain (del_first, del_last, true); delete_insn_chain (del_first, del_last, true);
/* When not optimizing and the edge is the only place in RTL which holds /* If not optimizing, preserve the locus of the single edge between
some unique locus, emit a nop with that locus in between. */ blocks A and B if necessary by emitting a nop. */
if (!optimize) if (!optimize
&& !forward_edge_locus
&& !DECL_IGNORED_P (current_function_decl))
{ {
emit_nop_for_unique_locus_between (a, b); emit_nop_for_unique_locus_between (a, b);
a_end = BB_END (a); a_end = BB_END (a);
...@@ -918,9 +924,7 @@ rtl_merge_blocks (basic_block a, basic_block b) ...@@ -918,9 +924,7 @@ rtl_merge_blocks (basic_block a, basic_block b)
df_bb_delete (b->index); df_bb_delete (b->index);
/* If B was a forwarder block, propagate the locus on the edge. */ if (forward_edge_locus)
if (forwarder_p
&& LOCATION_LOCUS (EDGE_SUCC (b, 0)->goto_locus) == UNKNOWN_LOCATION)
EDGE_SUCC (b, 0)->goto_locus = EDGE_SUCC (a, 0)->goto_locus; EDGE_SUCC (b, 0)->goto_locus = EDGE_SUCC (a, 0)->goto_locus;
if (dump_file) if (dump_file)
...@@ -3916,9 +3920,9 @@ fixup_reorder_chain (void) ...@@ -3916,9 +3920,9 @@ fixup_reorder_chain (void)
force_nonfallthru (e); force_nonfallthru (e);
} }
/* Ensure goto_locus from edges has some instructions with that locus /* Ensure goto_locus from edges has some instructions with that locus in RTL
in RTL. */ when not optimizing. */
if (!optimize) if (!optimize && !DECL_IGNORED_P (current_function_decl))
FOR_EACH_BB_FN (bb, cfun) FOR_EACH_BB_FN (bb, cfun)
{ {
edge e; edge e;
...@@ -4605,7 +4609,11 @@ cfg_layout_can_merge_blocks_p (basic_block a, basic_block b) ...@@ -4605,7 +4609,11 @@ cfg_layout_can_merge_blocks_p (basic_block a, basic_block b)
static void static void
cfg_layout_merge_blocks (basic_block a, basic_block b) cfg_layout_merge_blocks (basic_block a, basic_block b)
{ {
bool forwarder_p = (b->flags & BB_FORWARDER_BLOCK) != 0; /* If B is a forwarder block whose outgoing edge has no location, we'll
propagate the locus of the edge between A and B onto it. */
const bool forward_edge_locus
= (b->flags & BB_FORWARDER_BLOCK) != 0
&& LOCATION_LOCUS (EDGE_SUCC (b, 0)->goto_locus) == UNKNOWN_LOCATION;
rtx_insn *insn; rtx_insn *insn;
gcc_checking_assert (cfg_layout_can_merge_blocks_p (a, b)); gcc_checking_assert (cfg_layout_can_merge_blocks_p (a, b));
...@@ -4626,9 +4634,11 @@ cfg_layout_merge_blocks (basic_block a, basic_block b) ...@@ -4626,9 +4634,11 @@ cfg_layout_merge_blocks (basic_block a, basic_block b)
try_redirect_by_replacing_jump (EDGE_SUCC (a, 0), b, true); try_redirect_by_replacing_jump (EDGE_SUCC (a, 0), b, true);
gcc_assert (!JUMP_P (BB_END (a))); gcc_assert (!JUMP_P (BB_END (a)));
/* When not optimizing and the edge is the only place in RTL which holds /* If not optimizing, preserve the locus of the single edge between
some unique locus, emit a nop with that locus in between. */ blocks A and B if necessary by emitting a nop. */
if (!optimize) if (!optimize
&& !forward_edge_locus
&& !DECL_IGNORED_P (current_function_decl))
emit_nop_for_unique_locus_between (a, b); emit_nop_for_unique_locus_between (a, b);
/* Move things from b->footer after a->footer. */ /* Move things from b->footer after a->footer. */
...@@ -4695,9 +4705,7 @@ cfg_layout_merge_blocks (basic_block a, basic_block b) ...@@ -4695,9 +4705,7 @@ cfg_layout_merge_blocks (basic_block a, basic_block b)
df_bb_delete (b->index); df_bb_delete (b->index);
/* If B was a forwarder block, propagate the locus on the edge. */ if (forward_edge_locus)
if (forwarder_p
&& LOCATION_LOCUS (EDGE_SUCC (b, 0)->goto_locus) == UNKNOWN_LOCATION)
EDGE_SUCC (b, 0)->goto_locus = EDGE_SUCC (a, 0)->goto_locus; EDGE_SUCC (b, 0)->goto_locus = EDGE_SUCC (a, 0)->goto_locus;
if (dump_file) if (dump_file)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment