summaryrefslogtreecommitdiff
path: root/compiler/dex/dataflow_iterator-inl.h
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/dex/dataflow_iterator-inl.h')
-rw-r--r--compiler/dex/dataflow_iterator-inl.h59
1 files changed, 47 insertions, 12 deletions
diff --git a/compiler/dex/dataflow_iterator-inl.h b/compiler/dex/dataflow_iterator-inl.h
index 64e5fa64e3..0ca1a47f79 100644
--- a/compiler/dex/dataflow_iterator-inl.h
+++ b/compiler/dex/dataflow_iterator-inl.h
@@ -24,65 +24,100 @@ namespace art {
// Single forward pass over the nodes.
inline BasicBlock* DataflowIterator::ForwardSingleNext() {
BasicBlock* res = NULL;
+
+ // Are we not yet at the end?
if (idx_ < end_idx_) {
- BasicBlockId bb_id = block_id_list_->Get(idx_++);
+ // Get the next index.
+ BasicBlockId bb_id = block_id_list_->Get(idx_);
res = mir_graph_->GetBasicBlock(bb_id);
+ idx_++;
}
+
return res;
}
// Repeat full forward passes over all nodes until no change occurs during a complete pass.
-inline BasicBlock* DataflowIterator::ForwardRepeatNext(bool had_change) {
- changed_ |= had_change;
+inline BasicBlock* DataflowIterator::ForwardRepeatNext() {
BasicBlock* res = NULL;
- if ((idx_ >= end_idx_) && changed_) {
+
+ // Are we at the end and have we changed something?
+ if ((idx_ >= end_idx_) && changed_ == true) {
+ // Reset the index.
idx_ = start_idx_;
repeats_++;
changed_ = false;
}
+
+ // Are we not yet at the end?
if (idx_ < end_idx_) {
- BasicBlockId bb_id = block_id_list_->Get(idx_++);
+ // Get the BasicBlockId.
+ BasicBlockId bb_id = block_id_list_->Get(idx_);
res = mir_graph_->GetBasicBlock(bb_id);
+ idx_++;
}
+
return res;
}
// Single reverse pass over the nodes.
inline BasicBlock* DataflowIterator::ReverseSingleNext() {
BasicBlock* res = NULL;
+
+ // Are we not yet at the end?
if (idx_ >= 0) {
- BasicBlockId bb_id = block_id_list_->Get(idx_--);
+ // Get the BasicBlockId.
+ BasicBlockId bb_id = block_id_list_->Get(idx_);
res = mir_graph_->GetBasicBlock(bb_id);
+ idx_--;
}
+
return res;
}
// Repeat full backwards passes over all nodes until no change occurs during a complete pass.
-inline BasicBlock* DataflowIterator::ReverseRepeatNext(bool had_change) {
- changed_ |= had_change;
+inline BasicBlock* DataflowIterator::ReverseRepeatNext() {
BasicBlock* res = NULL;
+
+ // Are we done and we changed something during the last iteration?
if ((idx_ < 0) && changed_) {
+ // Reset the index.
idx_ = start_idx_;
repeats_++;
changed_ = false;
}
+
+ // Are we not yet done?
if (idx_ >= 0) {
- BasicBlockId bb_id = block_id_list_->Get(idx_--);
+ // Get the BasicBlockId.
+ BasicBlockId bb_id = block_id_list_->Get(idx_);
res = mir_graph_->GetBasicBlock(bb_id);
+ idx_--;
}
+
return res;
}
// AllNodes uses the existing GrowableArray iterator, and should be considered unordered.
-inline BasicBlock* AllNodesIterator::Next() {
+inline BasicBlock* AllNodesIterator::Next(bool had_change) {
BasicBlock* res = NULL;
+
+ // Suppose we want to keep looking.
bool keep_looking = true;
- while (keep_looking) {
+
+ // Find the next BasicBlock.
+ while (keep_looking == true) {
+ // Get next BasicBlock.
res = all_nodes_iterator_->Next();
- if ((res == NULL) || (!res->hidden)) {
+
+ // Are we done or is the BasicBlock not hidden?
+ if ((res == NULL) || (res->hidden == false)) {
keep_looking = false;
}
}
+
+ // Update changed: if had_changed is true, we remember it for the whole iteration.
+ changed_ |= had_change;
+
return res;
}