Home | History | Annotate | Download | only in CodeGen

Lines Matching refs:BBI

136     /// BBI             - Corresponding BBInfo.
147 BBInfo &BBI;
153 : BBI(b), Kind(k), NeedSubsumption(s), NumDups(d), NumDups2(d2) {}
187 bool ReverseBranchCondition(BBInfo &BBI);
195 void ScanInstructions(BBInfo &BBI);
198 bool FeasibilityAnalysis(BBInfo &BBI, SmallVectorImpl<MachineOperand> &Cond,
202 void RemoveExtraEdges(BBInfo &BBI);
203 bool IfConvertSimple(BBInfo &BBI, IfcvtKind Kind);
204 bool IfConvertTriangle(BBInfo &BBI, IfcvtKind Kind);
205 bool IfConvertDiamond(BBInfo &BBI, IfcvtKind Kind,
207 void PredicateBlock(BBInfo &BBI,
234 bool blockAlwaysFallThrough(BBInfo &BBI) const {
235 return BBI.IsBrAnalyzable && BBI.TrueBB == nullptr;
255 return C1->BBI.BB->getNumber() < C2->BBI.BB->getNumber();
319 BBInfo &BBI = Token->BBI;
328 if (BBI.IsDone)
329 BBI.IsEnqueued = false;
330 if (!BBI.IsEnqueued)
333 BBI.IsEnqueued = false;
344 << "): BB#" << BBI.BB->getNumber() << " ("
346 ? BBI.FalseBB->getNumber()
347 : BBI.TrueBB->getNumber()) << ") ");
348 RetVal = IfConvertSimple(BBI, Kind);
371 DEBUG(dbgs() << "): BB#" << BBI.BB->getNumber() << " (T:"
372 << BBI.TrueBB->getNumber() << ",F:"
373 << BBI.FalseBB->getNumber() << ") ");
374 RetVal = IfConvertTriangle(BBI, Kind);
389 DEBUG(dbgs() << "Ifcvt (Diamond): BB#" << BBI.BB->getNumber() << " (T:"
390 << BBI.TrueBB->getNumber() << ",F:"
391 << BBI.FalseBB->getNumber() << ") ");
392 RetVal = IfConvertDiamond(BBI, Kind, NumDups, NumDups2);
448 bool IfConverter::ReverseBranchCondition(BBInfo &BBI) {
450 if (!TII->ReverseBranchCondition(BBI.BrCond)) {
451 TII->RemoveBranch(*BBI.BB);
452 TII->InsertBranch(*BBI.BB, BBI.FalseBB, BBI.TrueBB, BBI.BrCond, dl);
453 std::swap(BBI.TrueBB, BBI.FalseBB);
640 void IfConverter::ScanInstructions(BBInfo &BBI) {
641 if (BBI.IsDone)
644 bool AlreadyPredicated = !BBI.Predicate.empty();
646 BBI.TrueBB = BBI.FalseBB = nullptr;
647 BBI.BrCond.clear();
648 BBI.IsBrAnalyzable =
649 !TII->AnalyzeBranch(*BBI.BB, BBI.TrueBB, BBI.FalseBB, BBI.BrCond);
650 BBI.HasFallThrough = BBI.IsBrAnalyzable && BBI.FalseBB == nullptr;
652 if (BBI.BrCond.size()) {
655 if (!BBI.FalseBB)
656 BBI.FalseBB = findFalseBlock(BBI.BB, BBI.TrueBB);
657 if (!BBI.FalseBB) {
659 BBI.IsUnpredicable = true;
665 BBI.NonPredSize = 0;
666 BBI.ExtraCost = 0;
667 BBI.ExtraCost2 = 0;
668 BBI.ClobbersPred = false;
669 for (MachineBasicBlock::iterator I = BBI.BB->begin(), E = BBI.BB->end();
675 BBI.CannotBeCopied = true;
678 bool isCondBr = BBI.IsBrAnalyzable && I->isConditionalBranch();
685 BBI.NonPredSize++;
689 BBI.ExtraCost += NumCycles-1;
690 BBI.ExtraCost2 += ExtraPredCost;
695 BBI.IsUnpredicable = true;
699 if (BBI.ClobbersPred && !isPredicated) {
704 BBI.IsUnpredicable = true;
712 BBI.ClobbersPred = true;
715 BBI.IsUnpredicable = true;
723 bool IfConverter::FeasibilityAnalysis(BBInfo &BBI,
727 if (BBI.IsDone || BBI.IsUnpredicable)
732 if (BBI.Predicate.size() && !TII->SubsumesPredicate(Pred, BBI.Predicate))
735 if (BBI.BrCond.size()) {
741 SmallVector<MachineOperand, 4> Cond(BBI.BrCond.begin(), BBI.BrCond.end());
759 BBInfo &BBI = BBAnalysis[BB->getNumber()];
761 if (BBI.IsAnalyzed || BBI.IsBeingAnalyzed)
762 return BBI;
764 BBI.BB = BB;
765 BBI.IsBeingAnalyzed = true;
767 ScanInstructions(BBI);
771 if (!BBI.IsBrAnalyzable || BBI.BrCond.empty() || BBI.IsDone) {
772 BBI.IsBeingAnalyzed = false;
773 BBI.IsAnalyzed = true;
774 return BBI;
778 if (BBI.TrueBB == BB || BBI.FalseBB == BB) {
779 BBI.IsBeingAnalyzed = false;
780 BBI.IsAnalyzed = true;
781 return BBI;
785 if (!BBI.FalseBB) {
786 BBI.IsBeingAnalyzed = false;
787 BBI.IsAnalyzed = true;
788 return BBI;
791 BBInfo &TrueBBI = AnalyzeBlock(BBI.TrueBB, Tokens);
792 BBInfo &FalseBBI = AnalyzeBlock(BBI.FalseBB, Tokens);
795 BBI.IsBeingAnalyzed = false;
796 BBI.IsAnalyzed = true;
797 return BBI;
800 SmallVector<MachineOperand, 4> RevCond(BBI.BrCond.begin(), BBI.BrCond.end());
817 FeasibilityAnalysis(TrueBBI, BBI.BrCond) &&
827 Tokens.push_back(new IfcvtToken(BBI, ICDiamond, TNeedSub|FNeedSub, Dups,
835 FeasibilityAnalysis(TrueBBI, BBI.BrCond, true)) {
843 Tokens.push_back(new IfcvtToken(BBI, ICTriangle, TNeedSub, Dups));
850 FeasibilityAnalysis(TrueBBI, BBI.BrCond, true, true)) {
851 Tokens.push_back(new IfcvtToken(BBI, ICTriangleRev, TNeedSub, Dups));
858 FeasibilityAnalysis(TrueBBI, BBI.BrCond)) {
866 Tokens.push_back(new IfcvtToken(BBI, ICSimple, TNeedSub, Dups));
878 Tokens.push_back(new IfcvtToken(BBI, ICTriangleFalse, FNeedSub, Dups));
888 Tokens.push_back(new IfcvtToken(BBI, ICTriangleFRev, FNeedSub, Dups));
897 Tokens.push_back(new IfcvtToken(BBI, ICSimpleFalse, FNeedSub, Dups));
902 BBI.IsEnqueued = Enqueued;
903 BBI.IsBeingAnalyzed = false;
904 BBI.IsAnalyzed = true;
905 return BBI;
964 void IfConverter::RemoveExtraEdges(BBInfo &BBI) {
967 if (!TII->AnalyzeBranch(*BBI.BB, TBB, FBB, Cond))
968 BBI.BB->CorrectExtraCFGEdges(TBB, FBB, !Cond.empty());
1023 bool IfConverter::IfConvertSimple(BBInfo &BBI, IfcvtKind Kind) {
1024 BBInfo &TrueBBI = BBAnalysis[BBI.TrueBB->getNumber()];
1025 BBInfo &FalseBBI = BBAnalysis[BBI.FalseBB->getNumber()];
1029 SmallVector<MachineOperand, 4> Cond(BBI.BrCond.begin(), BBI.BrCond.end());
1036 BBI.IsAnalyzed = false;
1061 BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
1064 CopyAndPredicateBlock(BBI, *CvtBBI, Cond);
1068 BBI.BB->removeSuccessor(CvtBBI->BB);
1074 BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
1075 MergeBlocks(BBI, *CvtBBI);
1079 if (!canFallThroughTo(BBI.BB, NextBBI->BB)) {
1080 InsertUncondBranch(BBI.BB, NextBBI->BB, TII);
1081 BBI.HasFallThrough = false;
1095 RemoveExtraEdges(BBI);
1099 BBI.IsDone = true;
1100 InvalidatePreds(BBI.BB);
1131 bool IfConverter::IfConvertTriangle(BBInfo &BBI, IfcvtKind Kind) {
1132 BBInfo &TrueBBI = BBAnalysis[BBI.TrueBB->getNumber()];
1133 BBInfo &FalseBBI = BBAnalysis[BBI.FalseBB->getNumber()];
1138 SmallVector<MachineOperand, 4> Cond(BBI.BrCond.begin(), BBI.BrCond.end());
1145 BBI.IsAnalyzed = false;
1165 if (PBB == BBI.BB)
1188 // Get weights before modifying CvtBBI->BB and BBI.BB.
1191 BBNext = MBPI->getEdgeWeight(BBI.BB, NextBBI->BB);
1192 BBCvt = MBPI->getEdgeWeight(BBI.BB, CvtBBI->BB);
1196 BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
1199 CopyAndPredicateBlock(BBI, *CvtBBI, Cond, true);
1203 BBI.BB->removeSuccessor(CvtBBI->BB);
1210 BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
1211 MergeBlocks(BBI, *CvtBBI, false);
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);
1250 MergeBlocks(BBI, *NextBBI);
1253 InsertUncondBranch(BBI.BB, NextBBI->BB, TII);
1254 BBI.HasFallThrough = false;
1261 RemoveExtraEdges(BBI);
1265 BBI.IsDone = true;
1266 InvalidatePreds(BBI.BB);
1277 bool IfConverter::IfConvertDiamond(BBInfo &BBI, IfcvtKind Kind,
1279 BBInfo &TrueBBI = BBAnalysis[BBI.TrueBB->getNumber()];
1280 BBInfo &FalseBBI = BBAnalysis[BBI.FalseBB->getNumber()];
1293 BBI.IsAnalyzed = false;
1308 SmallVector<MachineOperand, 4> RevCond(BBI.BrCond.begin(), BBI.BrCond.end());
1311 SmallVector<MachineOperand, 4> *Cond1 = &BBI.BrCond;
1328 BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
1373 BBI.BB->splice(BBI.BB->end(), BBI1->BB, BBI1->BB->begin(), DI1);
1458 MergeBlocks(BBI, *BBI1, TailBB == nullptr);
1459 MergeBlocks(BBI, *BBI2, TailBB == nullptr);
1480 MergeBlocks(BBI, TailBBI);
1483 BBI.BB->addSuccessor(TailBB);
1484 InsertUncondBranch(BBI.BB, TailBB, TII);
1485 BBI.HasFallThrough = false;
1492 BBI.BB->removeSuccessor(BBI1->BB);
1493 BBI.BB->removeSuccessor(BBI2->BB);
1494 RemoveExtraEdges(BBI);
1497 BBI.IsDone = TrueBBI.IsDone = FalseBBI.IsDone = true;
1498 InvalidatePreds(BBI.BB);
1527 void IfConverter::PredicateBlock(BBInfo &BBI,
1533 for (MachineBasicBlock::iterator I = BBI.BB->begin(); I != E; ++I) {
1558 std::copy(Cond.begin(), Cond.end(), std::back_inserter(BBI.Predicate));
1560 BBI.IsAnalyzed = false;
1561 BBI.NonPredSize = 0;