Lines Matching refs:BB

76       ICNotClassfied,  // BB data valid, but not classified.
78 ICSimple, // BB is entry of an one split, no rejoin sub-CFG.
82 ICTriangle, // BB is entry of a triangle sub-CFG.
83 ICDiamond // BB is entry of a diamond sub-CFG.
93 /// IsDone - True if BB is not to be considered for ifcvt.
94 /// IsBeingAnalyzed - True if BB is currently being analyzed.
95 /// IsAnalyzed - True if BB has been analyzed (info is still valid).
96 /// IsEnqueued - True if BB has been enqueued to be ifcvt'ed.
98 /// HasFallThrough - True if BB may fallthrough to the following BB.
99 /// IsUnpredicable - True if BB is known to be unpredicable.
100 /// ClobbersPred - True if BB could modify predicates (e.g. has
105 /// BB - Corresponding MachineBasicBlock.
108 /// Predicate - Predicate used in the BB.
122 MachineBasicBlock *BB;
131 ExtraCost(0), ExtraCost2(0), BB(nullptr), TrueBB(nullptr),
138 /// NeedSubsumption - True if the to-be-predicated BB has already been
196 BBInfo &AnalyzeBlock(MachineBasicBlock *BB,
201 void InvalidatePreds(MachineBasicBlock *BB);
216 bool MeetIfcvtSizeLimit(MachineBasicBlock &BB,
219 return Cycle > 0 && TII->isProfitableToIfCvt(BB, Cycle, Extra,
255 return C1->BBI.BB->getNumber() < C2->BBI.BB->getNumber();
344 << "): BB#" << BBI.BB->getNumber() << " ("
371 DEBUG(dbgs() << "): BB#" << BBI.BB->getNumber() << " (T:"
389 DEBUG(dbgs() << "Ifcvt (Diamond): BB#" << BBI.BB->getNumber() << " (T:"
433 /// findFalseBlock - BB has a fallthrough. Find its 'false' successor given
435 static MachineBasicBlock *findFalseBlock(MachineBasicBlock *BB,
437 for (MachineBasicBlock::succ_iterator SI = BB->succ_begin(),
438 E = BB->succ_end(); SI != E; ++SI) {
451 TII->RemoveBranch(*BBI.BB);
452 TII->InsertBranch(*BBI.BB, BBI.FalseBB, BBI.TrueBB, BBI.BrCond, dl);
461 static inline MachineBasicBlock *getNextBlock(MachineBasicBlock *BB) {
462 MachineFunction::iterator I = BB;
463 MachineFunction::iterator E = BB->getParent()->end();
482 if (TrueBBI.BB->pred_size() > 1) {
484 !TII->isProfitableToDupForIfCvt(*TrueBBI.BB, TrueBBI.NonPredSize,
506 if (TrueBBI.BB->pred_size() > 1) {
523 if (!TII->isProfitableToDupForIfCvt(*TrueBBI.BB, Size, Prediction))
530 MachineFunction::iterator I = TrueBBI.BB;
531 if (++I == TrueBBI.BB->getParent()->end())
535 return TExit && TExit == FalseBBI.BB;
551 TT = getNextBlock(TrueBBI.BB);
553 FT = getNextBlock(FalseBBI.BB);
558 if (TrueBBI.BB->pred_size() > 1 || FalseBBI.BB->pred_size() > 1)
567 MachineBasicBlock::iterator TIB = TrueBBI.BB->begin();
568 MachineBasicBlock::iterator FIB = FalseBBI.BB->begin();
569 MachineBasicBlock::iterator TIE = TrueBBI.BB->end();
570 MachineBasicBlock::iterator FIE = FalseBBI.BB->end();
645 // First analyze the end of BB branches.
649 !TII->AnalyzeBranch(*BBI.BB, BBI.TrueBB, BBI.FalseBB, BBI.BrCond);
653 // No false branch. This BB must end with a conditional branch and a
656 BBI.FalseBB = findFalseBlock(BBI.BB, BBI.TrueBB);
669 for (MachineBasicBlock::iterator I = BBI.BB->begin(), E = BBI.BB->end();
757 IfConverter::BBInfo &IfConverter::AnalyzeBlock(MachineBasicBlock *BB,
759 BBInfo &BBI = BBAnalysis[BB->getNumber()];
764 BBI.BB = BB;
778 if (BBI.TrueBB == BB || BBI.FalseBB == BB) {
809 BranchProbability Prediction = MBPI->getEdgeProbability(BB, TrueBBI.BB);
812 MeetIfcvtSizeLimit(*TrueBBI.BB, (TrueBBI.NonPredSize - (Dups + Dups2) +
814 *FalseBBI.BB, (FalseBBI.NonPredSize - (Dups + Dups2) +
833 MeetIfcvtSizeLimit(*TrueBBI.BB, TrueBBI.NonPredSize + TrueBBI.ExtraCost,
848 MeetIfcvtSizeLimit(*TrueBBI.BB, TrueBBI.NonPredSize + TrueBBI.ExtraCost,
856 MeetIfcvtSizeLimit(*TrueBBI.BB, TrueBBI.NonPredSize + TrueBBI.ExtraCost,
874 MeetIfcvtSizeLimit(*FalseBBI.BB,
884 MeetIfcvtSizeLimit(*FalseBBI.BB,
893 MeetIfcvtSizeLimit(*FalseBBI.BB,
913 MachineBasicBlock *BB = I;
914 AnalyzeBlock(BB, Tokens);
921 /// canFallThroughTo - Returns true either if ToBB is the next block after BB or
922 /// that all the intervening blocks are empty (given BB can fall through to its
924 static bool canFallThroughTo(MachineBasicBlock *BB, MachineBasicBlock *ToBB) {
925 MachineFunction::iterator PI = BB;
928 MachineFunction::iterator E = BB->getParent()->end();
939 /// InvalidatePreds - Invalidate predecessor BB info so it would be re-analyzed
942 void IfConverter::InvalidatePreds(MachineBasicBlock *BB) {
943 for (MachineBasicBlock::pred_iterator PI = BB->pred_begin(),
944 E = BB->pred_end(); PI != E; ++PI) {
946 if (PBBI.IsDone || PBBI.BB == BB)
953 /// InsertUncondBranch - Inserts an unconditional branch from BB to ToBB.
955 static void InsertUncondBranch(MachineBasicBlock *BB, MachineBasicBlock *ToBB,
959 TII->InsertBranch(*BB, ToBB, nullptr, NoCond, dl);
967 if (!TII->AnalyzeBranch(*BBI.BB, TBB, FBB, Cond))
968 BBI.BB->CorrectExtraCFGEdges(TBB, FBB, !Cond.empty());
1034 (CvtBBI->CannotBeCopied && CvtBBI->BB->pred_size() > 1)) {
1041 if (CvtBBI->BB->hasAddressTaken())
1042 // Conservatively abort if-conversion if BB's address is taken.
1049 // Initialize liveins to the first BB. These are potentiall redefined by
1052 Redefs.addLiveIns(CvtBBI->BB);
1053 Redefs.addLiveIns(NextBBI->BB);
1058 DontKill.addLiveIns(NextBBI->BB);
1060 if (CvtBBI->BB->pred_size() > 1) {
1061 BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
1068 BBI.BB->removeSuccessor(CvtBBI->BB);
1070 RemoveKills(CvtBBI->BB->begin(), CvtBBI->BB->end(), DontKill, *TRI);
1071 PredicateBlock(*CvtBBI, CvtBBI->BB->end(), Cond);
1074 BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
1079 if (!canFallThroughTo(BBI.BB, NextBBI->BB)) {
1080 InsertUncondBranch(BBI.BB, NextBBI->BB, TII);
1083 // BB:
1097 // Update block info. BB can be iteratively if-converted.
1100 InvalidatePreds(BBI.BB);
1143 (CvtBBI->CannotBeCopied && CvtBBI->BB->pred_size() > 1)) {
1150 if (CvtBBI->BB->hasAddressTaken())
1151 // Conservatively abort if-conversion if BB's address is taken.
1160 // BB has been changed, modify its predecessors (except for this
1162 for (MachineBasicBlock::pred_iterator PI = CvtBBI->BB->pred_begin(),
1163 E = CvtBBI->BB->pred_end(); PI != E; ++PI) {
1165 if (PBB == BBI.BB)
1176 // Initialize liveins to the first BB. These are potentially redefined by
1179 Redefs.addLiveIns(CvtBBI->BB);
1180 Redefs.addLiveIns(NextBBI->BB);
1188 // Get weights before modifying CvtBBI->BB and BBI.BB.
1189 CvtNext = MBPI->getEdgeWeight(CvtBBI->BB, NextBBI->BB);
1190 CvtFalse = MBPI->getEdgeWeight(CvtBBI->BB, CvtBBI->FalseBB);
1191 BBNext = MBPI->getEdgeWeight(BBI.BB, NextBBI->BB);
1192 BBCvt = MBPI->getEdgeWeight(BBI.BB, CvtBBI->BB);
1193 SumWeight = MBPI->getSumForBlock(CvtBBI->BB, WeightScale);
1195 if (CvtBBI->BB->pred_size() > 1) {
1196 BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
1203 BBI.BB->removeSuccessor(CvtBBI->BB);
1206 CvtBBI->NonPredSize -= TII->RemoveBranch(*CvtBBI->BB);
1207 PredicateBlock(*CvtBBI, CvtBBI->BB->end(), Cond);
1210 BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
1220 TII->InsertBranch(*BBI.BB, CvtBBI->FalseBB, nullptr, RevCond, dl);
1221 BBI.BB->addSuccessor(CvtBBI->FalseBB);
1223 // New_Weight(BBI.BB, NextBBI->BB) =
1224 // Weight(BBI.BB, NextBBI->BB) * getSumForBlock(CvtBBI->BB) +
1225 // Weight(BBI.BB, CvtBBI->BB) * Weight(CvtBBI->BB, NextBBI->BB)
1226 // New_Weight(BBI.BB, CvtBBI->FalseBB) =
1227 // Weight(BBI.BB, CvtBBI->BB) * Weight(CvtBBI->BB, CvtBBI->FalseBB)
1231 // We need to scale down all weights of BBI.BB to fit uint32_t.
1232 // Here BBI.BB is connected to CvtBBI->FalseBB and will fall through to
1234 ScaleWeights(NewNext, NewFalse, BBI.BB, getNextBlock(BBI.BB),
1242 bool isFallThrough = canFallThroughTo(BBI.BB, NextBBI->BB);
1248 NextBBI->BB->pred_size() == 1 && !NextBBI->HasFallThrough &&
1249 !NextBBI->BB->hasAddressTaken()) {
1253 InsertUncondBranch(BBI.BB, NextBBI->BB, TII);
1263 // Update block info. BB can be iteratively if-converted.
1266 InvalidatePreds(BBI.BB);
1290 TrueBBI.BB->pred_size() > 1 ||
1291 FalseBBI.BB->pred_size() > 1) {
1299 if (TrueBBI.BB->hasAddressTaken() || FalseBBI.BB->hasAddressTaken())
1300 // Conservatively abort if-conversion if either BB has its address taken.
1328 BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
1330 // Initialize liveins to the first BB. These are potentially redefined by
1333 Redefs.addLiveIns(BBI1->BB);
1336 MachineBasicBlock::iterator DI1 = BBI1->BB->begin();
1337 MachineBasicBlock::iterator DI2 = BBI2->BB->begin();
1338 MachineBasicBlock::iterator DIE1 = BBI1->BB->end();
1339 MachineBasicBlock::iterator DIE2 = BBI2->BB->end();
1364 for (MachineBasicBlock::reverse_iterator I = BBI2->BB->rbegin(),
1369 for (MachineBasicBlock::const_iterator I = BBI1->BB->begin(), E = DI1; I != E;
1373 BBI.BB->splice(BBI.BB->end(), BBI1->BB, BBI1->BB->begin(), DI1);
1374 BBI2->BB->erase(BBI2->BB->begin(), DI2);
1377 BBI1->NonPredSize -= TII->RemoveBranch(*BBI1->BB);
1378 DI1 = BBI1->BB->end();
1382 assert (DI1 != BBI1->BB->begin());
1388 BBI1->BB->erase(DI1, BBI1->BB->end());
1392 RemoveKills(BBI1->BB->begin(), BBI1->BB->end(), DontKill, *TRI);
1395 BBI2->NonPredSize -= TII->RemoveBranch(*BBI2->BB);
1396 DI2 = BBI2->BB->end();
1400 assert (DI2 != BBI2->BB->begin());
1417 if (TII->isProfitableToUnpredicate(*BBI1->BB, *BBI2->BB)) {
1418 for (MachineBasicBlock::iterator FI = BBI2->BB->begin(); FI != DI2; ++FI) {
1452 PredicateBlock(*BBI1, BBI1->BB->end(), *Cond1, &RedefsByFalse);
1468 !TailBBI.BB->hasAddressTaken();
1476 if (*PI != BBI1->BB && *PI != BBI2->BB)
1483 BBI.BB->addSuccessor(TailBB);
1484 InsertUncondBranch(BBI.BB, TailBB, TII);
1492 BBI.BB->removeSuccessor(BBI1->BB);
1493 BBI.BB->removeSuccessor(BBI2->BB);
1498 InvalidatePreds(BBI.BB);
1533 for (MachineBasicBlock::iterator I = BBI.BB->begin(); I != E; ++I) {
1568 /// CopyAndPredicateBlock - Copy and predicate instructions from source BB to
1573 MachineFunction &MF = *ToBBI.BB->getParent();
1575 for (MachineBasicBlock::iterator I = FromBBI.BB->begin(),
1576 E = FromBBI.BB->end(); I != E; ++I) {
1582 ToBBI.BB->insert(ToBBI.BB->end(), MI);
1609 std::vector<MachineBasicBlock *> Succs(FromBBI.BB->succ_begin(),
1610 FromBBI.BB->succ_end());
1611 MachineBasicBlock *NBB = getNextBlock(FromBBI.BB);
1619 ToBBI.BB->addSuccessor(Succ);
1639 assert(!FromBBI.BB->hasAddressTaken() &&
1640 "Removing a BB whose address is taken!");
1642 ToBBI.BB->splice(ToBBI.BB->end(),
1643 FromBBI.BB, FromBBI.BB->begin(), FromBBI.BB->end());
1645 std::vector<MachineBasicBlock *> Succs(FromBBI.BB->succ_begin(),
1646 FromBBI.BB->succ_end());
1647 MachineBasicBlock *NBB = getNextBlock(FromBBI.BB);
1655 FromBBI.BB->removeSuccessor(Succ);
1656 if (AddEdges && !ToBBI.BB->isSuccessor(Succ))
1657 ToBBI.BB->addSuccessor(Succ);
1661 if (NBB && !FromBBI.BB->isSuccessor(NBB))
1662 FromBBI.BB->addSuccessor(NBB);