summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordpatel <dpatel@138bc75d-0d04-0410-961f-82ee72b054a4>2004-10-14 18:19:47 +0000
committerdpatel <dpatel@138bc75d-0d04-0410-961f-82ee72b054a4>2004-10-14 18:19:47 +0000
commitc077abad4a90da03f8e2a7579e88dab4661b3df6 (patch)
treee261933f35d83b197a74e8a7cd7a25697a6aed21
parent731514a129505a2ddae8237fea894c19d8ba51cf (diff)
downloadgcc-c077abad4a90da03f8e2a7579e88dab4661b3df6.tar.gz
* tree-if-conv.c (process_phi_nodes): Process latch block.
(combine_blocks): Process latch block and update loop structure. * gcc.dg/pr17635.c : New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@89045 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/tree-if-conv.c15
3 files changed, 21 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 13d6db424d7..9762b14e370 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2004-10-14 Devang Patel <dpatel@apple.com>
+
+ PR 17635
+ * tree-if-conv.c (process_phi_nodes): Process latch block.
+ (combine_blocks): Process latch block and update loop structure.
+
2004-10-14 Olga Golovanevsky <olga@il.ibm.com>
* tree-vectorizer.c (vect_generate_tmps_on_preheader):
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2919fb34b07..0932934fd73 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2004-10-14 Devang Patel <dpatel@apple.com>
+
+ PR 17635
+ * gcc.dg/pr17635.c : New test.
+
2004-10-14 Olga GOlovanevsky <olga@il.ibm.com>
* testsuite/gcc.dg/vect/vect-28.c : Remove xfail.
diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c
index 88696465856..bb2ab9cf1a8 100644
--- a/gcc/tree-if-conv.c
+++ b/gcc/tree-if-conv.c
@@ -815,7 +815,7 @@ process_phi_nodes (struct loop *loop)
basic_block true_bb = NULL;
bb = ifc_bbs[i];
- if (bb == loop->header || bb == loop->latch)
+ if (bb == loop->header)
continue;
phi = phi_nodes (bb);
@@ -863,9 +863,6 @@ combine_blocks (struct loop *loop)
bb = ifc_bbs[i];
- if (bb == loop->latch)
- continue;
-
if (!exit_bb && bb_with_exit_edge_p (bb))
exit_bb = bb;
@@ -891,6 +888,9 @@ combine_blocks (struct loop *loop)
continue;
}
+ if (bb == loop->latch && empty_block_p (bb))
+ continue;
+
/* It is time to remove this basic block. First remove edges. */
while (EDGE_COUNT (bb->succs) > 0)
ssa_remove_edge (EDGE_SUCC (bb, 0));
@@ -921,6 +921,8 @@ combine_blocks (struct loop *loop)
delete_from_dominance_info (CDI_POST_DOMINATORS, bb);
/* Remove basic block. */
+ if (bb == loop->latch)
+ loop->latch = merge_target_bb;
remove_bb_from_loops (bb);
expunge_block (bb);
}
@@ -928,7 +930,10 @@ combine_blocks (struct loop *loop)
/* Now if possible, merge loop header and block with exit edge.
This reduces number of basic blocks to 2. Auto vectorizer addresses
loops with two nodes only. FIXME: Use cleanup_tree_cfg(). */
- if (exit_bb != loop->latch && empty_block_p (loop->latch))
+ if (exit_bb
+ && loop->header != loop->latch
+ && exit_bb != loop->latch
+ && empty_block_p (loop->latch))
{
if (can_merge_blocks_p (loop->header, exit_bb))
{