Implements a BasicBlock iterator using the ArenaBitVector.
Added the implementation of a BasicBlock iterator using the ArenaBitVector.
This patch only adds the implementation of the iterator and does not yet use
it everywhere it could be.
Added one example in ssa_transformation.cc of its use.
Change-Id: Ia85d58320c80c48a43609265ea5318a416c71f18
Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
diff --git a/compiler/dex/ssa_transformation.cc b/compiler/dex/ssa_transformation.cc
index 502df1e..0f79f41 100644
--- a/compiler/dex/ssa_transformation.cc
+++ b/compiler/dex/ssa_transformation.cc
@@ -248,22 +248,11 @@
}
/* Calculate DF_up */
- ArenaBitVector::Iterator bv_iterator(bb->i_dominated);
- while (true) {
- // TUNING: hot call to BitVectorIteratorNext
- int dominated_idx = bv_iterator.Next();
- if (dominated_idx == -1) {
- break;
- }
- BasicBlock* dominated_bb = GetBasicBlock(dominated_idx);
- ArenaBitVector::Iterator df_iterator(dominated_bb->dom_frontier);
- while (true) {
- // TUNING: hot call to BitVectorIteratorNext
- int df_up_idx = df_iterator.Next();
- if (df_up_idx == -1) {
- break;
- }
- BasicBlock* df_up_block = GetBasicBlock(df_up_idx);
+ ArenaBitVector::BasicBlockIterator it(bb->i_dominated, cu_);
+ for (BasicBlock *dominated_bb = it.Next(); dominated_bb != nullptr; dominated_bb = it.Next()) {
+ ArenaBitVector::BasicBlockIterator inner_it(dominated_bb->dom_frontier, cu_);
+ for (BasicBlock *df_up_block = inner_it.Next(); df_up_block != nullptr;
+ df_up_block = inner_it.Next()) {
CheckForDominanceFrontier(bb, df_up_block);
}
}