Lines Matching defs:TailBB
187 // TailBB's immediate successors are now successors of those predecessors
188 // which duplicated TailBB. Add the predecessors as sources to the PHI
354 /// Process PHI node in TailBB by turning it into a copy in PredBB. Remember the
357 MachineInstr *MI, MachineBasicBlock *TailBB, MachineBasicBlock *PredBB,
373 if (isDefLiveOut(DefReg, TailBB, MRI) || RegsUsedByPhi.count(DefReg))
382 if (MI->getNumOperands() == 1 && !TailBB->hasAddressTaken())
388 /// Duplicate a TailBB instruction to PredBB and update
391 MachineInstr *MI, MachineBasicBlock *TailBB, MachineBasicBlock *PredBB,
416 if (isDefLiveOut(Reg, TailBB, MRI) || UsedByPhi.count(Reg))
566 MachineBasicBlock &TailBB) {
570 if (!LayoutMode && TailBB.canFallThrough())
574 if (TailBB.isSuccessor(&TailBB))
581 if (TailBB.pred_size() > TailDupPredSize &&
582 TailBB.succ_size() > TailDupSuccSize)
590 llvm::shouldOptimizeForSize(&TailBB, PSI, MBFI);
604 if (TII->analyzeBranch(TailBB, PredTBB, PredFBB, PredCond) &&
605 TailBB.canFallThrough())
615 if (!TailBB.empty())
616 HasIndirectbr = TailBB.back().isIndirectBranch();
624 for (MachineInstr &MI : TailBB) {
631 (TailBB.getParent()->getTarget().getTargetTriple().isOSDarwin() ||
669 // Check if any of the successors of TailBB has a PHI node in which the
670 // value corresponding to TailBB uses a subregister.
678 for (auto *SB : TailBB.successors()) {
682 unsigned Idx = getPHISrcRegOpIdx(&I, &TailBB);
699 return canCompletelyDuplicateBB(TailBB);
703 bool TailDuplicator::isSimpleBB(MachineBasicBlock *TailBB) {
704 if (TailBB->succ_size() != 1)
706 if (TailBB->pred_empty())
708 MachineBasicBlock::iterator I = TailBB->getFirstNonDebugInstr(true);
709 if (I == TailBB->end())
740 MachineBasicBlock *TailBB, SmallVectorImpl<MachineBasicBlock *> &TDBBs,
742 SmallPtrSet<MachineBasicBlock *, 8> Succs(TailBB->succ_begin(),
743 TailBB->succ_end());
744 SmallVector<MachineBasicBlock *, 8> Preds(TailBB->predecessors());
760 << "From simple Succ: " << *TailBB);
762 MachineBasicBlock *NewTarget = *TailBB->succ_begin();
776 if (PredFBB == TailBB)
778 if (PredTBB == TailBB)
797 PredBB->replaceSuccessor(TailBB, NewTarget);
799 PredBB->removeSuccessor(TailBB, true);
811 bool TailDuplicator::canTailDuplicate(MachineBasicBlock *TailBB,
824 // future under more specific conditions. If TailBB is an INLINEASM_BR
825 // indirect target, we need to see if the edge from PredBB to TailBB is from
829 // the successor list in PredBB and predecessor list in TailBB.
830 if (TailBB->isInlineAsmBrIndirectTarget())
835 /// If it is profitable, duplicate TailBB's contents in each
838 /// \p TailBB Block to be duplicated.
845 bool TailDuplicator::tailDuplicate(bool IsSimple, MachineBasicBlock *TailBB,
850 LLVM_DEBUG(dbgs() << "\n*** Tail-duplicating " << printMBBReference(*TailBB)
853 bool ShouldUpdateTerminators = TailBB->canFallThrough();
856 getRegsUsedByPHIs(*TailBB, &UsedByPhi);
859 return duplicateSimpleBB(TailBB, TDBBs, UsedByPhi);
869 Preds.insert(TailBB->pred_begin(), TailBB->pred_end());
872 assert(TailBB != PredBB &&
875 if (!canTailDuplicate(TailBB, PredBB))
885 else if (PredBB->isLayoutSuccessor(TailBB) && PredBB->canFallThrough())
892 << "From Succ: " << *TailBB);
899 // Clone the contents of TailBB into PredBB.
902 for (MachineInstr &MI : llvm::make_early_inc_range(*TailBB)) {
906 processPHI(&MI, TailBB, PredBB, LocalVRMap, CopyInfos, UsedByPhi, true);
910 duplicateInstruction(&MI, TailBB, PredBB, LocalVRMap, UsedByPhi);
915 NumTailDupAdded += TailBB->size() - 1; // subtract one for removed branch
921 for (MachineBasicBlock *Succ : TailBB->successors())
922 PredBB->addSuccessor(Succ, MBPI->getEdgeProbability(TailBB, Succ));
926 PredBB->updateTerminator(TailBB->getNextNode());
932 // If TailBB was duplicated into all its predecessors except for the prior
937 PrevBB = &*std::prev(TailBB->getIterator());
944 *PrevBB->succ_begin() == TailBB &&
947 (!PriorTBB || PriorTBB == TailBB) &&
948 TailBB->pred_size() == 1 &&
949 !TailBB->hasAddressTaken()) {
951 << "From MBB: " << *TailBB);
962 MachineBasicBlock::iterator I = TailBB->begin();
964 while (I != TailBB->end() && I->isPHI()) {
968 processPHI(MI, TailBB, PrevBB, LocalVRMap, CopyInfos, UsedByPhi,
973 while (I != TailBB->end()) {
978 duplicateInstruction(MI, TailBB, PrevBB, LocalVRMap, UsedByPhi);
985 PrevBB->splice(PrevBB->end(), TailBB, TailBB->begin(), TailBB->end());
989 PrevBB->transferSuccessors(TailBB);
993 PrevBB->updateTerminator(TailBB->getNextNode());
1040 for (MachineInstr &MI : make_early_inc_range(TailBB->phis())) {
1043 processPHI(&MI, TailBB, PredBB, LocalVRMap, CopyInfos, UsedByPhi, false);