diff options
Diffstat (limited to 'compiler/optimizing/nodes.cc')
| -rw-r--r-- | compiler/optimizing/nodes.cc | 82 |
1 files changed, 38 insertions, 44 deletions
diff --git a/compiler/optimizing/nodes.cc b/compiler/optimizing/nodes.cc index 59cc0091bf..91553226c6 100644 --- a/compiler/optimizing/nodes.cc +++ b/compiler/optimizing/nodes.cc @@ -179,16 +179,16 @@ GraphAnalysisResult HGraph::BuildDominatorTree() { } void HGraph::ClearDominanceInformation() { - for (HReversePostOrderIterator it(*this); !it.Done(); it.Advance()) { - it.Current()->ClearDominanceInformation(); + for (HBasicBlock* block : GetReversePostOrder()) { + block->ClearDominanceInformation(); } reverse_post_order_.clear(); } void HGraph::ClearLoopInformation() { SetHasIrreducibleLoops(false); - for (HReversePostOrderIterator it(*this); !it.Done(); it.Advance()) { - it.Current()->SetLoopInformation(nullptr); + for (HBasicBlock* block : GetReversePostOrder()) { + block->SetLoopInformation(nullptr); } } @@ -275,8 +275,7 @@ void HGraph::ComputeDominanceInformation() { bool update_occurred = true; while (update_occurred) { update_occurred = false; - for (HReversePostOrderIterator it(*this); !it.Done(); it.Advance()) { - HBasicBlock* block = it.Current(); + for (HBasicBlock* block : GetReversePostOrder()) { for (HBasicBlock* successor : block->GetSuccessors()) { update_occurred |= UpdateDominatorOfSuccessor(block, successor); } @@ -287,8 +286,7 @@ void HGraph::ComputeDominanceInformation() { // Make sure that there are no remaining blocks whose dominator information // needs to be updated. if (kIsDebugBuild) { - for (HReversePostOrderIterator it(*this); !it.Done(); it.Advance()) { - HBasicBlock* block = it.Current(); + for (HBasicBlock* block : GetReversePostOrder()) { for (HBasicBlock* successor : block->GetSuccessors()) { DCHECK(!UpdateDominatorOfSuccessor(block, successor)); } @@ -297,8 +295,7 @@ void HGraph::ComputeDominanceInformation() { // Populate `dominated_blocks_` information after computing all dominators. // The potential presence of irreducible loops requires to do it after. - for (HReversePostOrderIterator it(*this); !it.Done(); it.Advance()) { - HBasicBlock* block = it.Current(); + for (HBasicBlock* block : GetReversePostOrder()) { if (!block->IsEntryBlock()) { block->GetDominator()->AddDominatedBlock(block); } @@ -375,8 +372,7 @@ void HGraph::SimplifyLoop(HBasicBlock* header) { void HGraph::ComputeTryBlockInformation() { // Iterate in reverse post order to propagate try membership information from // predecessors to their successors. - for (HReversePostOrderIterator it(*this); !it.Done(); it.Advance()) { - HBasicBlock* block = it.Current(); + for (HBasicBlock* block : GetReversePostOrder()) { if (block->IsEntryBlock() || block->IsCatchBlock()) { // Catch blocks after simplification have only exceptional predecessors // and hence are never in tries. @@ -446,8 +442,7 @@ GraphAnalysisResult HGraph::AnalyzeLoops() const { // We iterate post order to ensure we visit inner loops before outer loops. // `PopulateRecursive` needs this guarantee to know whether a natural loop // contains an irreducible loop. - for (HPostOrderIterator it(*this); !it.Done(); it.Advance()) { - HBasicBlock* block = it.Current(); + for (HBasicBlock* block : GetPostOrder()) { if (block->IsLoopHeader()) { if (block->IsCatchBlock()) { // TODO: Dealing with exceptional back edges could be tricky because @@ -1134,8 +1129,8 @@ void HGraphVisitor::VisitInsertionOrder() { } void HGraphVisitor::VisitReversePostOrder() { - for (HReversePostOrderIterator it(*graph_); !it.Done(); it.Advance()) { - VisitBasicBlock(it.Current()); + for (HBasicBlock* block : graph_->GetReversePostOrder()) { + VisitBasicBlock(block); } } @@ -1437,10 +1432,10 @@ HBasicBlock* HBasicBlock::SplitBefore(HInstruction* cursor) { AddInstruction(new (GetGraph()->GetArena()) HGoto(new_block->GetDexPc())); for (HBasicBlock* successor : GetSuccessors()) { - new_block->successors_.push_back(successor); successor->predecessors_[successor->GetPredecessorIndexOf(this)] = new_block; } - successors_.clear(); + new_block->successors_.swap(successors_); + DCHECK(successors_.empty()); AddSuccessor(new_block); GetGraph()->AddBlock(new_block); @@ -1454,10 +1449,10 @@ HBasicBlock* HBasicBlock::CreateImmediateDominator() { HBasicBlock* new_block = new (GetGraph()->GetArena()) HBasicBlock(GetGraph(), GetDexPc()); for (HBasicBlock* predecessor : GetPredecessors()) { - new_block->predecessors_.push_back(predecessor); predecessor->successors_[predecessor->GetSuccessorIndexOf(this)] = new_block; } - predecessors_.clear(); + new_block->predecessors_.swap(predecessors_); + DCHECK(predecessors_.empty()); AddPredecessor(new_block); GetGraph()->AddBlock(new_block); @@ -1482,16 +1477,16 @@ HBasicBlock* HBasicBlock::SplitBeforeForInlining(HInstruction* cursor) { new_block->instructions_.SetBlockOfInstructions(new_block); for (HBasicBlock* successor : GetSuccessors()) { - new_block->successors_.push_back(successor); successor->predecessors_[successor->GetPredecessorIndexOf(this)] = new_block; } - successors_.clear(); + new_block->successors_.swap(successors_); + DCHECK(successors_.empty()); for (HBasicBlock* dominated : GetDominatedBlocks()) { dominated->dominator_ = new_block; - new_block->dominated_blocks_.push_back(dominated); } - dominated_blocks_.clear(); + new_block->dominated_blocks_.swap(dominated_blocks_); + DCHECK(dominated_blocks_.empty()); return new_block; } @@ -1509,16 +1504,16 @@ HBasicBlock* HBasicBlock::SplitAfterForInlining(HInstruction* cursor) { new_block->instructions_.SetBlockOfInstructions(new_block); for (HBasicBlock* successor : GetSuccessors()) { - new_block->successors_.push_back(successor); successor->predecessors_[successor->GetPredecessorIndexOf(this)] = new_block; } - successors_.clear(); + new_block->successors_.swap(successors_); + DCHECK(successors_.empty()); for (HBasicBlock* dominated : GetDominatedBlocks()) { dominated->dominator_ = new_block; - new_block->dominated_blocks_.push_back(dominated); } - dominated_blocks_.clear(); + new_block->dominated_blocks_.swap(dominated_blocks_); + DCHECK(dominated_blocks_.empty()); return new_block; } @@ -1857,17 +1852,19 @@ void HBasicBlock::MergeWith(HBasicBlock* other) { // Update links to the successors of `other`. successors_.clear(); - while (!other->successors_.empty()) { - HBasicBlock* successor = other->GetSuccessors()[0]; - successor->ReplacePredecessor(other, this); + for (HBasicBlock* successor : other->GetSuccessors()) { + successor->predecessors_[successor->GetPredecessorIndexOf(other)] = this; } + successors_.swap(other->successors_); + DCHECK(other->successors_.empty()); // Update the dominator tree. RemoveDominatedBlock(other); for (HBasicBlock* dominated : other->GetDominatedBlocks()) { - dominated_blocks_.push_back(dominated); dominated->SetDominator(this); } + dominated_blocks_.insert( + dominated_blocks_.end(), other->dominated_blocks_.begin(), other->dominated_blocks_.end()); other->dominated_blocks_.clear(); other->dominator_ = nullptr; @@ -1894,16 +1891,18 @@ void HBasicBlock::MergeWithInlined(HBasicBlock* other) { // Update links to the successors of `other`. successors_.clear(); - while (!other->successors_.empty()) { - HBasicBlock* successor = other->GetSuccessors()[0]; - successor->ReplacePredecessor(other, this); + for (HBasicBlock* successor : other->GetSuccessors()) { + successor->predecessors_[successor->GetPredecessorIndexOf(other)] = this; } + successors_.swap(other->successors_); + DCHECK(other->successors_.empty()); // Update the dominator tree. for (HBasicBlock* dominated : other->GetDominatedBlocks()) { - dominated_blocks_.push_back(dominated); dominated->SetDominator(this); } + dominated_blocks_.insert( + dominated_blocks_.end(), other->dominated_blocks_.begin(), other->dominated_blocks_.end()); other->dominated_blocks_.clear(); other->dominator_ = nullptr; other->graph_ = nullptr; @@ -1986,10 +1985,8 @@ HInstruction* HGraph::InlineInto(HGraph* outer_graph, HInvoke* invoke) { // Update the environments in this graph to have the invoke's environment // as parent. { - HReversePostOrderIterator it(*this); - it.Advance(); // Skip the entry block, we do not need to update the entry's suspend check. - for (; !it.Done(); it.Advance()) { - HBasicBlock* block = it.Current(); + // Skip the entry block, we do not need to update the entry's suspend check. + for (HBasicBlock* block : GetReversePostOrderSkipEntryBlock()) { for (HInstructionIterator instr_it(block->GetInstructions()); !instr_it.Done(); instr_it.Advance()) { @@ -2070,8 +2067,7 @@ HInstruction* HGraph::InlineInto(HGraph* outer_graph, HInvoke* invoke) { // Do a reverse post order of the blocks in the callee and do (1), (2), (3) // and (4) to the blocks that apply. - for (HReversePostOrderIterator it(*this); !it.Done(); it.Advance()) { - HBasicBlock* current = it.Current(); + for (HBasicBlock* current : GetReversePostOrder()) { if (current != exit_block_ && current != entry_block_ && current != first) { DCHECK(current->GetTryCatchInformation() == nullptr); DCHECK(current->GetGraph() == this); @@ -2529,8 +2525,6 @@ std::ostream& operator<<(std::ostream& os, HLoadString::LoadKind rhs) { return os << "BootImageLinkTimePcRelative"; case HLoadString::LoadKind::kBootImageAddress: return os << "BootImageAddress"; - case HLoadString::LoadKind::kDexCacheAddress: - return os << "DexCacheAddress"; case HLoadString::LoadKind::kBssEntry: return os << "BssEntry"; case HLoadString::LoadKind::kDexCacheViaMethod: |