Lines Matching defs:BranchBlock
137 MachineBasicBlock *BranchBlock; // Block containing the branch
204 : BranchBlock(nullptr), BranchTargetBlock(nullptr),
208 BranchBlock = nullptr;
235 << Cand.BranchBlock->getNumber() << " can be coalesced:");
238 if (TII->analyzeBranch(*Cand.BranchBlock, Cand.BranchTargetBlock, FalseMBB,
244 for (auto &I : Cand.BranchBlock->terminators()) {
269 if (Cand.BranchBlock->isEHPad() || Cand.BranchBlock->hasEHPadSuccessor()) {
274 if (Cand.BranchBlock->mayHaveInlineAsmBr()) {
280 // FalseMBB is null, and BranchTargetBlock is a successor to BranchBlock)
282 !Cand.BranchBlock->isSuccessor(Cand.BranchTargetBlock)) {
288 if (Cand.BranchBlock->succ_size() != 2) {
294 assert(Cand.BranchBlock->canFallThrough() &&
298 // BranchBlock and that BranchTargetBlock is a successor to BranchBlock.
301 (*Cand.BranchBlock->succ_begin() == Cand.BranchTargetBlock)
302 ? *Cand.BranchBlock->succ_rbegin()
303 : *Cand.BranchBlock->succ_begin();
485 /// \return true if all instructions in SourceRegion.BranchBlock can be merged
492 if (TargetRegion.BranchTargetBlock != SourceRegion.BranchBlock)
494 else if (!MDT->dominates(TargetRegion.BranchBlock, SourceRegion.BranchBlock))
496 else if (!MPDT->dominates(SourceRegion.BranchBlock, TargetRegion.BranchBlock))
509 /// 2. Move to the end of the TargetRegion.BranchBlock.
511 /// TargetRegion.BranchTargetBlock (also SourceRegion.BranchBlock).
518 /// can be moved up, to the end of the TargetRegion.BranchBlock (immediately
528 /// \return true if all instructions in SourceRegion.BranchBlock can be merged
539 I = SourceRegion.BranchBlock->instr_begin(),
540 E = SourceRegion.BranchBlock->getFirstNonPHI();
552 if (Use.getParent() == SourceRegion.BranchBlock) {
562 // TargetRegion.BranchBlock (up) or SourceRegion.BranchTargetBlock (down)
564 I = SourceRegion.BranchBlock->getFirstNonPHI(),
565 E = SourceRegion.BranchBlock->end();
572 if (!canMoveToEnd(*I, *TargetRegion.BranchBlock)) {
582 /// Merge the instructions from SourceRegion.BranchBlock,
584 /// TargetRegion.BranchBlock, TargetRegion.BranchTargetBlock and
591 /// A region consists of a BranchBlock, a FallThroughBlock, and a
594 /// BranchBlock.
599 /// | TargetRegion.BranchBlock |
608 /// | SourceRegion.BranchBlock |
622 /// | TargetRegion.BranchBlock |
623 /// | SourceRegion.BranchBlock |
649 // Start the merging process by first handling the BranchBlock.
650 // Move any PHIs in SourceRegion.BranchBlock down to the branch-taken block
651 moveAndUpdatePHIs(SourceRegion.BranchBlock, SourceRegion.BranchTargetBlock);
653 // Move remaining instructions in SourceRegion.BranchBlock into
654 // TargetRegion.BranchBlock
656 SourceRegion.BranchBlock->getFirstNonPHI();
658 SourceRegion.BranchBlock->getFirstTerminator();
662 : TargetRegion.BranchBlock;
667 : TargetRegion.BranchBlock->getFirstTerminator();
669 Source->splice(Target, SourceRegion.BranchBlock, firstInstr, lastInstr);
675 // SourceRegion.BranchBlock to TargetRegion.BranchBlock.
676 SourceRegion.BranchBlock->removeSuccessor(SourceRegion.FallThroughBlock);
677 TargetRegion.BranchBlock->transferSuccessorsAndUpdatePHIs(
678 SourceRegion.BranchBlock);
679 // Update branch in TargetRegion.BranchBlock to jump to
681 // In this case, TargetRegion.BranchTargetBlock == SourceRegion.BranchBlock.
682 TargetRegion.BranchBlock->ReplaceUsesOfBlockWith(
683 SourceRegion.BranchBlock, SourceRegion.BranchTargetBlock);
684 // Remove the branch statement(s) in SourceRegion.BranchBlock
686 SourceRegion.BranchBlock->terminators().begin();
687 while (I != SourceRegion.BranchBlock->terminators().end()) {
703 TargetRegion.FallThroughBlock->removeSuccessor(SourceRegion.BranchBlock);
707 assert(SourceRegion.BranchBlock->empty() &&
709 SourceRegion.BranchBlock->eraseFromParent();
742 Cand1.BranchBlock = &MBB;
748 Cand2.BranchBlock = Cand1.BranchTargetBlock;
754 assert(MPDT->dominates(Cand2.BranchTargetBlock, Cand1.BranchBlock) &&
758 LLVM_DEBUG(dbgs() << "Blocks " << Cand1.BranchBlock->getNumber()
759 << " and " << Cand2.BranchBlock->getNumber()
765 << Cand1.BranchBlock->getNumber() << " and "
766 << Cand2.BranchBlock->getNumber() << "\n");
770 LLVM_DEBUG(dbgs() << "Merging blocks " << Cand1.BranchBlock->getNumber()