Home | History | Annotate | Download | only in optimizing

Lines Matching defs:successor

77       HBasicBlock* successor = current->GetSuccessors()[successors_visited[current_id]++];
78 uint32_t successor_id = successor->GetBlockId();
80 DCHECK(ContainsElement(worklist, successor));
81 successor->AddBackEdge(current);
85 worklist.push_back(successor);
129 // We only need to update the successor, which might be live.
130 for (HBasicBlock* successor : block->GetSuccessors()) {
131 successor->RemovePredecessor(block);
211 static bool UpdateDominatorOfSuccessor(HBasicBlock* block, HBasicBlock* successor) {
212 DCHECK(ContainsElement(block->GetSuccessors(), successor));
214 HBasicBlock* old_dominator = successor->GetDominator();
222 successor->SetDominator(new_dominator);
250 HBasicBlock* successor = current->GetSuccessors()[successors_visited[current_id]++];
251 UpdateDominatorOfSuccessor(current, successor);
255 if (++visits[successor->GetBlockId()] ==
256 successor->GetPredecessors().size() - successor->NumberOfBackEdges()) {
257 reverse_post_order_.push_back(successor);
258 worklist.push_back(successor);
283 for (HBasicBlock* successor : block->GetSuccessors()) {
284 update_occurred |= UpdateDominatorOfSuccessor(block, successor);
295 for (HBasicBlock* successor : block->GetSuccessors()) {
296 DCHECK(!UpdateDominatorOfSuccessor(block, successor));
311 HBasicBlock* HGraph::SplitEdge(HBasicBlock* block, HBasicBlock* successor) {
312 HBasicBlock* new_block = new (arena_) HBasicBlock(this, successor->GetDexPc());
314 // Use `InsertBetween` to ensure the predecessor index and successor index of
315 // `block` and `successor` are preserved.
316 new_block->InsertBetween(block, successor);
320 void HGraph::SplitCriticalEdge(HBasicBlock* block, HBasicBlock* successor) {
321 // Insert a new node between `block` and `successor` to split the
323 HBasicBlock* new_block = SplitEdge(block, successor);
324 new_block->AddInstruction(new (arena_) HGoto(successor->GetDexPc()));
325 if (successor->IsLoopHeader()) {
327 HLoopInformation* info = successor->GetLoopInformation();
420 HBasicBlock* successor = normal_successors[j];
421 DCHECK(!successor->IsCatchBlock());
422 if (successor == exit_block_) {
426 } else if (successor->GetPredecessors().size() > 1) {
427 SplitCriticalEdge(block, successor);
431 DCHECK_EQ(normal_successors[j]->GetSingleSuccessor(), successor);
1449 for (HBasicBlock* successor : GetSuccessors()) {
1450 new_block->successors_.push_back(successor);
1451 successor->predecessors_[successor->GetPredecessorIndexOf(this)] = new_block;
1494 for (HBasicBlock* successor : GetSuccessors()) {
1495 new_block->successors_.push_back(successor);
1496 successor->predecessors_[successor->GetPredecessorIndexOf(this)] = new_block;
1521 for (HBasicBlock* successor : GetSuccessors()) {
1522 new_block->successors_.push_back(successor);
1523 successor->predecessors_[successor->GetPredecessorIndexOf(this)] = new_block;
1594 // The normal-flow successor of HTryBoundary is always stored at index zero.
1726 for (HBasicBlock* successor : successors_) {
1728 size_t this_index = successor->GetPredecessorIndexOf(this);
1729 successor->predecessors_.erase(successor->predecessors_.begin() + this_index);
1731 // Check that `successor` has other predecessors, otherwise `this` is the
1732 // dominator of `successor` which violates the order DCHECKed at the top.
1733 DCHECK(!successor->predecessors_.empty());
1735 // Remove this block's entries in the successor's phis. Skip exceptional
1739 if (!successor->IsCatchBlock()) {
1740 if (successor->predecessors_.size() == 1u) {
1741 // The successor has just one predecessor left. Replace phis with the only
1743 for (HInstructionIterator phi_it(successor->GetPhis()); !phi_it.Done(); phi_it.Advance()) {
1746 successor->RemovePhi(phi);
1749 for (HInstructionIterator phi_it(successor->GetPhis()); !phi_it.Done(); phi_it.Advance()) {
1781 // This block is the only normal-flow successor of the TryBoundary which
1798 // If we have one successor after removing one, then we must have
1800 // successor. Replace those with a HGoto.
1812 // There are multiple successors left. The removed block might be a successor
1871 HBasicBlock* successor = other->GetSuccessors()[0];
1872 successor->ReplacePredecessor(other, this);
1908 HBasicBlock* successor = other->GetSuccessors()[0];
1909 successor->ReplacePredecessor(other, this);
1928 HBasicBlock* successor = GetSuccessors()[0];
1929 successor->ReplacePredecessor(this, other);
2217 if_block->AddSuccessor(true_block); // True successor
2218 if_block->AddSuccessor(false_block); // False successor