Home | History | Annotate | Download | only in CodeGen

Lines Matching full:bbi

138     /// BBI             - Corresponding BBInfo.
149 BBInfo &BBI;
155 : BBI(b), Kind(k), NeedSubsumption(s), NumDups(d), NumDups2(d2) {}
198 bool ReverseBranchCondition(BBInfo &BBI);
206 void ScanInstructions(BBInfo &BBI);
209 bool FeasibilityAnalysis(BBInfo &BBI, SmallVectorImpl<MachineOperand> &Cond,
214 void RemoveExtraEdges(BBInfo &BBI);
215 bool IfConvertSimple(BBInfo &BBI, IfcvtKind Kind);
216 bool IfConvertTriangle(BBInfo &BBI, IfcvtKind Kind);
217 bool IfConvertDiamond(BBInfo &BBI, IfcvtKind Kind,
219 void PredicateBlock(BBInfo &BBI,
246 bool blockAlwaysFallThrough(BBInfo &BBI) const {
247 return BBI.IsBrAnalyzable && BBI.TrueBB == nullptr;
268 return C1->BBI.BB->getNumber() < C2->BBI.BB->getNumber();
334 BBInfo &BBI = Token->BBI;
341 if (BBI.IsDone)
342 BBI.IsEnqueued = false;
343 if (!BBI.IsEnqueued)
346 BBI.IsEnqueued = false;
357 << "): BB#" << BBI.BB->getNumber() << " ("
359 ? BBI.FalseBB->getNumber()
360 : BBI.TrueBB->getNumber()) << ") ");
361 RetVal = IfConvertSimple(BBI, Kind);
384 DEBUG(dbgs() << "): BB#" << BBI.BB->getNumber() << " (T:"
385 << BBI.TrueBB->getNumber() << ",F:"
386 << BBI.FalseBB->getNumber() << ") ");
387 RetVal = IfConvertTriangle(BBI, Kind);
402 DEBUG(dbgs() << "Ifcvt (Diamond): BB#" << BBI.BB->getNumber() << " (T:"
403 << BBI.TrueBB->getNumber() << ",F:"
404 << BBI.FalseBB->getNumber() << ") ");
405 RetVal = IfConvertDiamond(BBI, Kind, NumDups, NumDups2);
453 bool IfConverter::ReverseBranchCondition(BBInfo &BBI) {
455 if (!TII->ReverseBranchCondition(BBI.BrCond)) {
456 TII->RemoveBranch(*BBI.BB);
457 TII->InsertBranch(*BBI.BB, BBI.FalseBB, BBI.TrueBB, BBI.BrCond, dl);
458 std::swap(BBI.TrueBB, BBI.FalseBB);
649 void IfConverter::ScanInstructions(BBInfo &BBI) {
650 if (BBI.IsDone)
653 bool AlreadyPredicated = !BBI.Predicate.empty();
655 BBI.TrueBB = BBI.FalseBB = nullptr;
656 BBI.BrCond.clear();
657 BBI.IsBrAnalyzable =
658 !TII->analyzeBranch(*BBI.BB, BBI.TrueBB, BBI.FalseBB, BBI.BrCond);
659 BBI.HasFallThrough = BBI.IsBrAnalyzable && BBI.FalseBB == nullptr;
661 if (BBI.BrCond.size()) {
664 if (!BBI.FalseBB)
665 BBI.FalseBB = findFalseBlock(BBI.BB, BBI.TrueBB);
666 if (!BBI.FalseBB) {
668 BBI.IsUnpredicable = true;
674 BBI.NonPredSize = 0;
675 BBI.ExtraCost = 0;
676 BBI.ExtraCost2 = 0;
677 BBI.ClobbersPred = false;
678 for (auto &MI : *BBI.BB) {
683 // BBI.CannotBeCopied to true if MI is convergent. To see why, consider the
713 BBI.CannotBeCopied = true;
716 bool isCondBr = BBI.IsBrAnalyzable && MI.isConditionalBranch();
723 BBI.NonPredSize++;
727 BBI.ExtraCost += NumCycles-1;
728 BBI.ExtraCost2 += ExtraPredCost;
733 BBI.IsUnpredicable = true;
737 if (BBI.ClobbersPred && !isPredicated) {
742 BBI.IsUnpredicable = true;
750 BBI.ClobbersPred = true;
753 BBI.IsUnpredicable = true;
761 bool IfConverter::FeasibilityAnalysis(BBInfo &BBI,
765 if (BBI.IsDone || BBI.IsUnpredicable)
771 if (BBI.Predicate.size() && !BBI.IsBrAnalyzable)
776 if (BBI.Predicate.size() && !TII->SubsumesPredicate(Pred, BBI.Predicate))
779 if (BBI.BrCond.size()) {
785 SmallVector<MachineOperand, 4> Cond(BBI.BrCond.begin(), BBI.BrCond.end());
817 BBInfo &BBI = BBAnalysis[BB->getNumber()];
820 if (BBI.IsAnalyzed || BBI.IsBeingAnalyzed) {
825 BBI.BB = BB;
826 BBI.IsBeingAnalyzed = true;
828 ScanInstructions(BBI);
832 if (!BBI.IsBrAnalyzable || BBI.BrCond.empty() || BBI.IsDone) {
833 BBI.IsBeingAnalyzed = false;
834 BBI.IsAnalyzed = true;
840 if (BBI.TrueBB == BB || BBI.FalseBB == BB) {
841 BBI.IsBeingAnalyzed = false;
842 BBI.IsAnalyzed = true;
848 if (!BBI.FalseBB) {
849 BBI.IsBeingAnalyzed = false;
850 BBI.IsAnalyzed = true;
857 BBStack.push_back(BBI.FalseBB);
858 BBStack.push_back(BBI.TrueBB);
862 BBInfo &TrueBBI = BBAnalysis[BBI.TrueBB->getNumber()];
863 BBInfo &FalseBBI = BBAnalysis[BBI.FalseBB->getNumber()];
866 BBI.IsBeingAnalyzed = false;
867 BBI.IsAnalyzed = true;
873 RevCond(BBI.BrCond.begin(), BBI.BrCond.end());
890 FeasibilityAnalysis(TrueBBI, BBI.BrCond) &&
901 BBI, ICDiamond, TNeedSub | FNeedSub, Dups, Dups2));
908 FeasibilityAnalysis(TrueBBI, BBI.BrCond, true)) {
917 llvm::make_unique<IfcvtToken>(BBI, ICTriangle, TNeedSub, Dups));
924 FeasibilityAnalysis(TrueBBI, BBI.BrCond, true, true)) {
926 llvm::make_unique<IfcvtToken>(BBI, ICTriangleRev, TNeedSub, Dups));
933 FeasibilityAnalysis(TrueBBI, BBI.BrCond)) {
942 llvm::make_unique<IfcvtToken>(BBI, ICSimple, TNeedSub, Dups));
954 Tokens.push_back(llvm::make_unique<IfcvtToken>(BBI, ICTriangleFalse,
966 llvm::make_unique<IfcvtToken>(BBI, ICTriangleFRev, FNeedSub, Dups));
976 llvm::make_unique<IfcvtToken>(BBI, ICSimpleFalse, FNeedSub, Dups));
981 BBI.IsEnqueued = Enqueued;
982 BBI.IsBeingAnalyzed = false;
983 BBI.IsAnalyzed = true;
1041 void IfConverter::RemoveExtraEdges(BBInfo &BBI) {
1044 if (!TII->analyzeBranch(*BBI.BB, TBB, FBB, Cond))
1045 BBI.BB->CorrectExtraCFGEdges(TBB, FBB, !Cond.empty());
1111 bool IfConverter::IfConvertSimple(BBInfo &BBI, IfcvtKind Kind) {
1112 BBInfo &TrueBBI = BBAnalysis[BBI.TrueBB->getNumber()];
1113 BBInfo &FalseBBI = BBAnalysis[BBI.FalseBB->getNumber()];
1117 SmallVector<MachineOperand, 4> Cond(BBI.BrCond.begin(), BBI.BrCond.end());
1124 BBI.IsAnalyzed = false;
1149 BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
1152 CopyAndPredicateBlock(BBI, *CvtBBI, Cond);
1156 BBI.BB->removeSuccessor(CvtBBI->BB, true);
1162 BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
1163 MergeBlocks(BBI, *CvtBBI);
1167 if (!canFallThroughTo(BBI.BB, NextBBI->BB)) {
1168 InsertUncondBranch(BBI.BB, NextBBI->BB, TII);
1169 BBI.HasFallThrough = false;
1183 RemoveExtraEdges(BBI);
1187 BBI.IsDone = true;
1188 InvalidatePreds(BBI.BB);
1197 bool IfConverter::IfConvertTriangle(BBInfo &BBI, IfcvtKind Kind) {
1198 BBInfo &TrueBBI = BBAnalysis[BBI.TrueBB->getNumber()];
1199 BBInfo &FalseBBI = BBAnalysis[BBI.FalseBB->getNumber()];
1204 SmallVector<MachineOperand, 4> Cond(BBI.BrCond.begin(), BBI.BrCond.end());
1211 BBI.IsAnalyzed = false;
1231 if (PBB == BBI.BB)
1254 // Get probabilities before modifying CvtBBI->BB and BBI.BB.
1257 BBNext = MBPI->getEdgeProbability(BBI.BB, NextBBI->BB);
1258 BBCvt = MBPI->getEdgeProbability(BBI.BB, CvtBBI->BB);
1262 BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
1265 CopyAndPredicateBlock(BBI, *CvtBBI, Cond, true);
1269 BBI.BB->removeSuccessor(CvtBBI->BB, true);
1276 BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
1277 MergeBlocks(BBI, *CvtBBI, false);
1288 // NewNext = New_Prob(BBI.BB, NextBBI->BB) =
1289 // Prob(BBI.BB, NextBBI->BB) +
1290 // Prob(BBI.BB, CvtBBI->BB) * Prob(CvtBBI->BB, NextBBI->BB)
1291 // NewFalse = New_Prob(BBI.BB, CvtBBI->FalseBB) =
1292 // Prob(BBI.BB, CvtBBI->BB) * Prob(CvtBBI->BB, CvtBBI->FalseBB)
1293 auto NewTrueBB = getNextBlock(BBI.BB);
1296 std::find(BBI.BB->succ_begin(), BBI.BB->succ_end(), NewTrueBB);
1297 if (NewTrueBBIter != BBI.BB->succ_end())
1298 BBI.BB->setSuccProbability(NewTrueBBIter, NewNext);
1301 TII->InsertBranch(*BBI.BB, CvtBBI->FalseBB, nullptr, RevCond, dl);
1302 BBI.BB->addSuccessor(CvtBBI->FalseBB, NewFalse);
1309 bool isFallThrough = canFallThroughTo(BBI.BB, NextBBI->BB);
1317 MergeBlocks(BBI, *NextBBI);
1320 InsertUncondBranch(BBI.BB, NextBBI->BB, TII);
1321 BBI.HasFallThrough = false;
1328 RemoveExtraEdges(BBI);
1332 BBI.IsDone = true;
1333 InvalidatePreds(BBI.BB);
1344 bool IfConverter::IfConvertDiamond(BBInfo &BBI, IfcvtKind Kind,
1346 BBInfo &TrueBBI = BBAnalysis[BBI.TrueBB->getNumber()];
1347 BBInfo &FalseBBI = BBAnalysis[BBI.FalseBB->getNumber()];
1360 BBI.IsAnalyzed = false;
1375 SmallVector<MachineOperand, 4> RevCond(BBI.BrCond.begin(), BBI.BrCond.end());
1378 SmallVector<MachineOperand, 4> *Cond1 = &BBI.BrCond;
1395 BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
1435 BBI.BB->splice(BBI.BB->end(), BBI1->BB, BBI1->BB->begin(), DI1);
1539 MergeBlocks(BBI, *BBI1, TailBB == nullptr);
1540 MergeBlocks(BBI, *BBI2, TailBB == nullptr);
1553 MachineBasicBlock::const_iterator TI = BBI.BB->getFirstTerminator();
1554 if (TI != BBI.BB->end() && TII->isPredicated(*TI))
1567 MergeBlocks(BBI, TailBBI);
1570 BBI.BB->addSuccessor(TailBB, BranchProbability::getOne());
1571 InsertUncondBranch(BBI.BB, TailBB, TII);
1572 BBI.HasFallThrough = false;
1579 BBI.BB->removeSuccessor(BBI1->BB);
1580 BBI.BB->removeSuccessor(BBI2->BB, true);
1581 RemoveExtraEdges(BBI);
1584 BBI.IsDone = TrueBBI.IsDone = FalseBBI.IsDone = true;
1585 InvalidatePreds(BBI.BB);
1613 void IfConverter::PredicateBlock(BBInfo &BBI,
1619 for (MachineInstr &I : llvm::make_range(BBI.BB->begin(), E)) {
1644 BBI.Predicate.append(Cond.begin(), Cond.end());
1646 BBI.IsAnalyzed = false;
1647 BBI.NonPredSize = 0;