aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-cfgcleanup.c
diff options
context:
space:
mode:
authorBin Cheng <bin.cheng@arm.com>2014-03-13 02:40:08 +0000
committerBin Cheng <amker@gcc.gnu.org>2014-03-13 02:40:08 +0000
commitd731ee04423f788ff370a82eab69b4038bb14cdd (patch)
treea7906c5a290183421fef8db4d70832d51442a831 /gcc/tree-cfgcleanup.c
parent9f493d9da64d9f3810e6acc83c304ce84cd71449 (diff)
downloadgcc-d731ee04423f788ff370a82eab69b4038bb14cdd.zip
gcc-d731ee04423f788ff370a82eab69b4038bb14cdd.tar.gz
gcc-d731ee04423f788ff370a82eab69b4038bb14cdd.tar.bz2
tree-cfgcleanup.c (remove_forwarder_block_with_phi): Record BB's single pred and update the father loop's latch info later.
* tree-cfgcleanup.c (remove_forwarder_block_with_phi): Record BB's single pred and update the father loop's latch info later. From-SVN: r208527
Diffstat (limited to 'gcc/tree-cfgcleanup.c')
-rw-r--r--gcc/tree-cfgcleanup.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c
index 926d300..08401dd 100644
--- a/gcc/tree-cfgcleanup.c
+++ b/gcc/tree-cfgcleanup.c
@@ -820,6 +820,12 @@ remove_forwarder_block_with_phi (basic_block bb)
&& DECL_NONLOCAL (gimple_label_label (label)))
return false;
+ /* Record BB's single pred in case we need to update the father
+ loop's latch information later. */
+ basic_block pred = NULL;
+ if (single_pred_p (bb))
+ pred = single_pred (bb);
+
/* Redirect each incoming edge to BB to DEST. */
while (EDGE_COUNT (bb->preds) > 0)
{
@@ -904,6 +910,11 @@ remove_forwarder_block_with_phi (basic_block bb)
set_immediate_dominator (CDI_DOMINATORS, dest, dom);
+ /* Adjust latch infomation of BB's parent loop as otherwise
+ the cfg hook has a hard time not to kill the loop. */
+ if (current_loops && bb->loop_father->latch == bb)
+ bb->loop_father->latch = pred;
+
/* Remove BB since all of BB's incoming edges have been redirected
to DEST. */
delete_basic_block (bb);