diff options
author | dpatel <dpatel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-10-14 18:19:47 +0000 |
---|---|---|
committer | dpatel <dpatel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-10-14 18:19:47 +0000 |
commit | c077abad4a90da03f8e2a7579e88dab4661b3df6 (patch) | |
tree | e261933f35d83b197a74e8a7cd7a25697a6aed21 | |
parent | 731514a129505a2ddae8237fea894c19d8ba51cf (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/tree-if-conv.c | 15 |
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)) { |