aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2018-06-21 17:03:58 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2018-06-21 17:03:58 +0000
commit7792f13c845a8dc97e6b0a8023d81c67e8d650d2 (patch)
tree1d15d6a55f847cb610cc2b68f62fcd4598119be3
parent56b97603ec286907d09f0c38322931c04f4b78e5 (diff)
downloadgcc-7792f13c845a8dc97e6b0a8023d81c67e8d650d2.zip
gcc-7792f13c845a8dc97e6b0a8023d81c67e8d650d2.tar.gz
gcc-7792f13c845a8dc97e6b0a8023d81c67e8d650d2.tar.bz2
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
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/cfgrtl.c42
2 files changed, 33 insertions, 17 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d8e1361..902f8df 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,13 @@
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
the EH edges have been redirected from post-landing to landing pads.
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index 19cef22..3b1931d 100644
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -813,10 +813,14 @@ emit_nop_for_unique_locus_between (basic_block a, basic_block b)
static void
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 *del_first = NULL, *del_last = NULL;
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;
if (dump_file)
@@ -887,9 +891,11 @@ rtl_merge_blocks (basic_block a, basic_block b)
BB_HEAD (b) = b_empty ? NULL : b_head;
delete_insn_chain (del_first, del_last, true);
- /* When not optimizing and the edge is the only place in RTL which holds
- some unique locus, emit a nop with that locus in between. */
- if (!optimize)
+ /* If not optimizing, preserve the locus of the single edge between
+ blocks A and B if necessary by emitting a nop. */
+ if (!optimize
+ && !forward_edge_locus
+ && !DECL_IGNORED_P (current_function_decl))
{
emit_nop_for_unique_locus_between (a, b);
a_end = BB_END (a);
@@ -918,9 +924,7 @@ rtl_merge_blocks (basic_block a, basic_block b)
df_bb_delete (b->index);
- /* If B was a forwarder block, propagate the locus on the edge. */
- if (forwarder_p
- && LOCATION_LOCUS (EDGE_SUCC (b, 0)->goto_locus) == UNKNOWN_LOCATION)
+ if (forward_edge_locus)
EDGE_SUCC (b, 0)->goto_locus = EDGE_SUCC (a, 0)->goto_locus;
if (dump_file)
@@ -3916,9 +3920,9 @@ fixup_reorder_chain (void)
force_nonfallthru (e);
}
- /* Ensure goto_locus from edges has some instructions with that locus
- in RTL. */
- if (!optimize)
+ /* Ensure goto_locus from edges has some instructions with that locus in RTL
+ when not optimizing. */
+ if (!optimize && !DECL_IGNORED_P (current_function_decl))
FOR_EACH_BB_FN (bb, cfun)
{
edge e;
@@ -4605,7 +4609,11 @@ cfg_layout_can_merge_blocks_p (basic_block a, basic_block b)
static void
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;
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)
try_redirect_by_replacing_jump (EDGE_SUCC (a, 0), b, true);
gcc_assert (!JUMP_P (BB_END (a)));
- /* When not optimizing and the edge is the only place in RTL which holds
- some unique locus, emit a nop with that locus in between. */
- if (!optimize)
+ /* If not optimizing, preserve the locus of the single edge between
+ blocks A and B if necessary by emitting a nop. */
+ if (!optimize
+ && !forward_edge_locus
+ && !DECL_IGNORED_P (current_function_decl))
emit_nop_for_unique_locus_between (a, b);
/* Move things from b->footer after a->footer. */
@@ -4695,9 +4705,7 @@ cfg_layout_merge_blocks (basic_block a, basic_block b)
df_bb_delete (b->index);
- /* If B was a forwarder block, propagate the locus on the edge. */
- if (forwarder_p
- && LOCATION_LOCUS (EDGE_SUCC (b, 0)->goto_locus) == UNKNOWN_LOCATION)
+ if (forward_edge_locus)
EDGE_SUCC (b, 0)->goto_locus = EDGE_SUCC (a, 0)->goto_locus;
if (dump_file)