aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormarxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4>2019-02-14 11:25:18 +0000
committermarxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4>2019-02-14 11:25:18 +0000
commit3de663cc8845696bc8378bc1a4f16dc573b0e4c8 (patch)
tree07547ae6902d27088152b5c776233a2a8b72fb83
parent1269c68ecea0459d18a0e1cd6aff0d2ca7049b24 (diff)
Backport r268835
2019-02-14 Martin Liska <mliska@suse.cz> Backport from mainline 2019-02-13 Martin Liska <mliska@suse.cz> PR lto/88858 * cfgrtl.c (remove_barriers_from_footer): New function. (try_redirect_by_replacing_jump): Use it. (cfg_layout_redirect_edge_and_branch): Likewise. git-svn-id: https://gcc.gnu.org/svn/gcc/branches/gcc-8-branch@268872 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/cfgrtl.c46
2 files changed, 37 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8485211f929..f6994c421b8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,6 +1,16 @@
2019-02-14 Martin Liska <mliska@suse.cz>
Backport from mainline
+ 2019-02-13 Martin Liska <mliska@suse.cz>
+
+ PR lto/88858
+ * cfgrtl.c (remove_barriers_from_footer): New function.
+ (try_redirect_by_replacing_jump): Use it.
+ (cfg_layout_redirect_edge_and_branch): Likewise.
+
+2019-02-14 Martin Liska <mliska@suse.cz>
+
+ Backport from mainline
2019-02-11 Martin Liska <mliska@suse.cz>
PR ipa/89009
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index 7af4191da77..f6e4fecd647 100644
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -984,6 +984,31 @@ block_label (basic_block block)
return as_a <rtx_code_label *> (BB_HEAD (block));
}
+/* Remove all barriers from BB_FOOTER of a BB. */
+
+static void
+remove_barriers_from_footer (basic_block bb)
+{
+ rtx_insn *insn = BB_FOOTER (bb);
+
+ /* Remove barriers but keep jumptables. */
+ while (insn)
+ {
+ if (BARRIER_P (insn))
+ {
+ if (PREV_INSN (insn))
+ SET_NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
+ else
+ BB_FOOTER (bb) = NEXT_INSN (insn);
+ if (NEXT_INSN (insn))
+ SET_PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
+ }
+ if (LABEL_P (insn))
+ return;
+ insn = NEXT_INSN (insn);
+ }
+}
+
/* Attempt to perform edge redirection by replacing possibly complex jump
instruction by unconditional jump or removing jump completely. This can
apply only if all edges now point to the same block. The parameters and
@@ -1047,26 +1072,8 @@ try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout)
/* Selectively unlink whole insn chain. */
if (in_cfglayout)
{
- rtx_insn *insn = BB_FOOTER (src);
-
delete_insn_chain (kill_from, BB_END (src), false);
-
- /* Remove barriers but keep jumptables. */
- while (insn)
- {
- if (BARRIER_P (insn))
- {
- if (PREV_INSN (insn))
- SET_NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
- else
- BB_FOOTER (src) = NEXT_INSN (insn);
- if (NEXT_INSN (insn))
- SET_PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
- }
- if (LABEL_P (insn))
- break;
- insn = NEXT_INSN (insn);
- }
+ remove_barriers_from_footer (src);
}
else
delete_insn_chain (kill_from, PREV_INSN (BB_HEAD (target)),
@@ -4379,6 +4386,7 @@ cfg_layout_redirect_edge_and_branch (edge e, basic_block dest)
"Removing crossing jump while redirecting edge form %i to %i\n",
e->src->index, dest->index);
delete_insn (BB_END (src));
+ remove_barriers_from_footer (src);
e->flags |= EDGE_FALLTHRU;
}