diff options
Diffstat (limited to 'compiler/optimizing/nodes.cc')
| -rw-r--r-- | compiler/optimizing/nodes.cc | 46 | 
1 files changed, 24 insertions, 22 deletions
| diff --git a/compiler/optimizing/nodes.cc b/compiler/optimizing/nodes.cc index 45c7eb1a46..91553226c6 100644 --- a/compiler/optimizing/nodes.cc +++ b/compiler/optimizing/nodes.cc @@ -1432,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); @@ -1449,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); @@ -1477,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;  } @@ -1504,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;  } @@ -1852,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; @@ -1889,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; @@ -2521,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: |