Lines Matching refs:BBI
140 BBInfo &BBI; member
146 : BBI(b), Kind(k), NeedSubsumption(s), NumDups(d), NumDups2(d2) {} in IfcvtToken()
177 bool ReverseBranchCondition(BBInfo &BBI);
185 void ScanInstructions(BBInfo &BBI);
188 bool FeasibilityAnalysis(BBInfo &BBI, SmallVectorImpl<MachineOperand> &Cond,
192 void RemoveExtraEdges(BBInfo &BBI);
193 bool IfConvertSimple(BBInfo &BBI, IfcvtKind Kind);
194 bool IfConvertTriangle(BBInfo &BBI, IfcvtKind Kind);
195 bool IfConvertDiamond(BBInfo &BBI, IfcvtKind Kind,
197 void PredicateBlock(BBInfo &BBI,
226 bool blockAlwaysFallThrough(BBInfo &BBI) const { in blockAlwaysFallThrough()
227 return BBI.IsBrAnalyzable && BBI.TrueBB == NULL; in blockAlwaysFallThrough()
247 return C1->BBI.BB->getNumber() < C2->BBI.BB->getNumber(); in IfcvtTokenCmp()
307 BBInfo &BBI = Token->BBI; in INITIALIZE_PASS_DEPENDENCY() local
316 if (BBI.IsDone) in INITIALIZE_PASS_DEPENDENCY()
317 BBI.IsEnqueued = false; in INITIALIZE_PASS_DEPENDENCY()
318 if (!BBI.IsEnqueued) in INITIALIZE_PASS_DEPENDENCY()
321 BBI.IsEnqueued = false; in INITIALIZE_PASS_DEPENDENCY()
332 << "): BB#" << BBI.BB->getNumber() << " (" in INITIALIZE_PASS_DEPENDENCY()
334 ? BBI.FalseBB->getNumber() in INITIALIZE_PASS_DEPENDENCY()
335 : BBI.TrueBB->getNumber()) << ") "); in INITIALIZE_PASS_DEPENDENCY()
336 RetVal = IfConvertSimple(BBI, Kind); in INITIALIZE_PASS_DEPENDENCY()
359 DEBUG(dbgs() << "): BB#" << BBI.BB->getNumber() << " (T:" in INITIALIZE_PASS_DEPENDENCY()
360 << BBI.TrueBB->getNumber() << ",F:" in INITIALIZE_PASS_DEPENDENCY()
361 << BBI.FalseBB->getNumber() << ") "); in INITIALIZE_PASS_DEPENDENCY()
362 RetVal = IfConvertTriangle(BBI, Kind); in INITIALIZE_PASS_DEPENDENCY()
377 DEBUG(dbgs() << "Ifcvt (Diamond): BB#" << BBI.BB->getNumber() << " (T:" in INITIALIZE_PASS_DEPENDENCY()
378 << BBI.TrueBB->getNumber() << ",F:" in INITIALIZE_PASS_DEPENDENCY()
379 << BBI.FalseBB->getNumber() << ") "); in INITIALIZE_PASS_DEPENDENCY()
380 RetVal = IfConvertDiamond(BBI, Kind, NumDups, NumDups2); in INITIALIZE_PASS_DEPENDENCY()
436 bool IfConverter::ReverseBranchCondition(BBInfo &BBI) { in ReverseBranchCondition() argument
438 if (!TII->ReverseBranchCondition(BBI.BrCond)) { in ReverseBranchCondition()
439 TII->RemoveBranch(*BBI.BB); in ReverseBranchCondition()
440 TII->InsertBranch(*BBI.BB, BBI.FalseBB, BBI.TrueBB, BBI.BrCond, dl); in ReverseBranchCondition()
441 std::swap(BBI.TrueBB, BBI.FalseBB); in ReverseBranchCondition()
628 void IfConverter::ScanInstructions(BBInfo &BBI) { in ScanInstructions() argument
629 if (BBI.IsDone) in ScanInstructions()
632 bool AlreadyPredicated = !BBI.Predicate.empty(); in ScanInstructions()
634 BBI.TrueBB = BBI.FalseBB = NULL; in ScanInstructions()
635 BBI.BrCond.clear(); in ScanInstructions()
636 BBI.IsBrAnalyzable = in ScanInstructions()
637 !TII->AnalyzeBranch(*BBI.BB, BBI.TrueBB, BBI.FalseBB, BBI.BrCond); in ScanInstructions()
638 BBI.HasFallThrough = BBI.IsBrAnalyzable && BBI.FalseBB == NULL; in ScanInstructions()
640 if (BBI.BrCond.size()) { in ScanInstructions()
643 if (!BBI.FalseBB) in ScanInstructions()
644 BBI.FalseBB = findFalseBlock(BBI.BB, BBI.TrueBB); in ScanInstructions()
645 if (!BBI.FalseBB) { in ScanInstructions()
647 BBI.IsUnpredicable = true; in ScanInstructions()
653 BBI.NonPredSize = 0; in ScanInstructions()
654 BBI.ExtraCost = 0; in ScanInstructions()
655 BBI.ExtraCost2 = 0; in ScanInstructions()
656 BBI.ClobbersPred = false; in ScanInstructions()
657 for (MachineBasicBlock::iterator I = BBI.BB->begin(), E = BBI.BB->end(); in ScanInstructions()
663 BBI.CannotBeCopied = true; in ScanInstructions()
666 bool isCondBr = BBI.IsBrAnalyzable && I->isConditionalBranch(); in ScanInstructions()
670 BBI.NonPredSize++; in ScanInstructions()
675 BBI.ExtraCost += NumCycles-1; in ScanInstructions()
676 BBI.ExtraCost2 += ExtraPredCost; in ScanInstructions()
681 BBI.IsUnpredicable = true; in ScanInstructions()
686 if (BBI.ClobbersPred && !isPredicated) { in ScanInstructions()
696 BBI.IsUnpredicable = true; in ScanInstructions()
704 BBI.ClobbersPred = true; in ScanInstructions()
707 BBI.IsUnpredicable = true; in ScanInstructions()
715 bool IfConverter::FeasibilityAnalysis(BBInfo &BBI, in FeasibilityAnalysis() argument
719 if (BBI.IsDone || BBI.IsUnpredicable) in FeasibilityAnalysis()
724 if (BBI.Predicate.size() && !TII->SubsumesPredicate(BBI.Predicate, Pred)) in FeasibilityAnalysis()
727 if (BBI.BrCond.size()) { in FeasibilityAnalysis()
733 SmallVector<MachineOperand, 4> Cond(BBI.BrCond.begin(), BBI.BrCond.end()); in FeasibilityAnalysis()
751 BBInfo &BBI = BBAnalysis[BB->getNumber()]; in AnalyzeBlock() local
753 if (BBI.IsAnalyzed || BBI.IsBeingAnalyzed) in AnalyzeBlock()
754 return BBI; in AnalyzeBlock()
756 BBI.BB = BB; in AnalyzeBlock()
757 BBI.IsBeingAnalyzed = true; in AnalyzeBlock()
759 ScanInstructions(BBI); in AnalyzeBlock()
763 if (!BBI.IsBrAnalyzable || BBI.BrCond.empty() || BBI.IsDone) { in AnalyzeBlock()
764 BBI.IsBeingAnalyzed = false; in AnalyzeBlock()
765 BBI.IsAnalyzed = true; in AnalyzeBlock()
766 return BBI; in AnalyzeBlock()
770 if (BBI.TrueBB == BB || BBI.FalseBB == BB) { in AnalyzeBlock()
771 BBI.IsBeingAnalyzed = false; in AnalyzeBlock()
772 BBI.IsAnalyzed = true; in AnalyzeBlock()
773 return BBI; in AnalyzeBlock()
777 if (!BBI.FalseBB) { in AnalyzeBlock()
778 BBI.IsBeingAnalyzed = false; in AnalyzeBlock()
779 BBI.IsAnalyzed = true; in AnalyzeBlock()
780 return BBI; in AnalyzeBlock()
783 BBInfo &TrueBBI = AnalyzeBlock(BBI.TrueBB, Tokens); in AnalyzeBlock()
784 BBInfo &FalseBBI = AnalyzeBlock(BBI.FalseBB, Tokens); in AnalyzeBlock()
787 BBI.IsBeingAnalyzed = false; in AnalyzeBlock()
788 BBI.IsAnalyzed = true; in AnalyzeBlock()
789 return BBI; in AnalyzeBlock()
792 SmallVector<MachineOperand, 4> RevCond(BBI.BrCond.begin(), BBI.BrCond.end()); in AnalyzeBlock()
809 FeasibilityAnalysis(TrueBBI, BBI.BrCond) && in AnalyzeBlock()
819 Tokens.push_back(new IfcvtToken(BBI, ICDiamond, TNeedSub|FNeedSub, Dups, in AnalyzeBlock()
827 FeasibilityAnalysis(TrueBBI, BBI.BrCond, true)) { in AnalyzeBlock()
835 Tokens.push_back(new IfcvtToken(BBI, ICTriangle, TNeedSub, Dups)); in AnalyzeBlock()
842 FeasibilityAnalysis(TrueBBI, BBI.BrCond, true, true)) { in AnalyzeBlock()
843 Tokens.push_back(new IfcvtToken(BBI, ICTriangleRev, TNeedSub, Dups)); in AnalyzeBlock()
850 FeasibilityAnalysis(TrueBBI, BBI.BrCond)) { in AnalyzeBlock()
858 Tokens.push_back(new IfcvtToken(BBI, ICSimple, TNeedSub, Dups)); in AnalyzeBlock()
870 Tokens.push_back(new IfcvtToken(BBI, ICTriangleFalse, FNeedSub, Dups)); in AnalyzeBlock()
880 Tokens.push_back(new IfcvtToken(BBI, ICTriangleFRev, FNeedSub, Dups)); in AnalyzeBlock()
889 Tokens.push_back(new IfcvtToken(BBI, ICSimpleFalse, FNeedSub, Dups)); in AnalyzeBlock()
894 BBI.IsEnqueued = Enqueued; in AnalyzeBlock()
895 BBI.IsBeingAnalyzed = false; in AnalyzeBlock()
896 BBI.IsAnalyzed = true; in AnalyzeBlock()
897 return BBI; in AnalyzeBlock()
956 void IfConverter::RemoveExtraEdges(BBInfo &BBI) { in RemoveExtraEdges() argument
959 if (!TII->AnalyzeBranch(*BBI.BB, TBB, FBB, Cond)) in RemoveExtraEdges()
960 BBI.BB->CorrectExtraCFGEdges(TBB, FBB, !Cond.empty()); in RemoveExtraEdges()
1024 bool IfConverter::IfConvertSimple(BBInfo &BBI, IfcvtKind Kind) { in IfConvertSimple() argument
1025 BBInfo &TrueBBI = BBAnalysis[BBI.TrueBB->getNumber()]; in IfConvertSimple()
1026 BBInfo &FalseBBI = BBAnalysis[BBI.FalseBB->getNumber()]; in IfConvertSimple()
1030 SmallVector<MachineOperand, 4> Cond(BBI.BrCond.begin(), BBI.BrCond.end()); in IfConvertSimple()
1037 BBI.IsAnalyzed = false; in IfConvertSimple()
1053 BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB); in IfConvertSimple()
1056 CopyAndPredicateBlock(BBI, *CvtBBI, Cond, Redefs); in IfConvertSimple()
1061 BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB); in IfConvertSimple()
1062 MergeBlocks(BBI, *CvtBBI); in IfConvertSimple()
1066 if (!canFallThroughTo(BBI.BB, NextBBI->BB)) { in IfConvertSimple()
1067 InsertUncondBranch(BBI.BB, NextBBI->BB, TII); in IfConvertSimple()
1068 BBI.HasFallThrough = false; in IfConvertSimple()
1082 RemoveExtraEdges(BBI); in IfConvertSimple()
1086 BBI.IsDone = true; in IfConvertSimple()
1087 InvalidatePreds(BBI.BB); in IfConvertSimple()
1096 bool IfConverter::IfConvertTriangle(BBInfo &BBI, IfcvtKind Kind) { in IfConvertTriangle() argument
1097 BBInfo &TrueBBI = BBAnalysis[BBI.TrueBB->getNumber()]; in IfConvertTriangle()
1098 BBInfo &FalseBBI = BBAnalysis[BBI.FalseBB->getNumber()]; in IfConvertTriangle()
1103 SmallVector<MachineOperand, 4> Cond(BBI.BrCond.begin(), BBI.BrCond.end()); in IfConvertTriangle()
1110 BBI.IsAnalyzed = false; in IfConvertTriangle()
1126 if (PBB == BBI.BB) in IfConvertTriangle()
1145 BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB); in IfConvertTriangle()
1148 CopyAndPredicateBlock(BBI, *CvtBBI, Cond, Redefs, true); in IfConvertTriangle()
1155 BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB); in IfConvertTriangle()
1156 MergeBlocks(BBI, *CvtBBI, false); in IfConvertTriangle()
1165 TII->InsertBranch(*BBI.BB, CvtBBI->FalseBB, NULL, RevCond, dl); in IfConvertTriangle()
1166 BBI.BB->addSuccessor(CvtBBI->FalseBB); in IfConvertTriangle()
1173 bool isFallThrough = canFallThroughTo(BBI.BB, NextBBI->BB); in IfConvertTriangle()
1180 MergeBlocks(BBI, *NextBBI); in IfConvertTriangle()
1183 InsertUncondBranch(BBI.BB, NextBBI->BB, TII); in IfConvertTriangle()
1184 BBI.HasFallThrough = false; in IfConvertTriangle()
1191 RemoveExtraEdges(BBI); in IfConvertTriangle()
1195 BBI.IsDone = true; in IfConvertTriangle()
1196 InvalidatePreds(BBI.BB); in IfConvertTriangle()
1207 bool IfConverter::IfConvertDiamond(BBInfo &BBI, IfcvtKind Kind, in IfConvertDiamond() argument
1209 BBInfo &TrueBBI = BBAnalysis[BBI.TrueBB->getNumber()]; in IfConvertDiamond()
1210 BBInfo &FalseBBI = BBAnalysis[BBI.FalseBB->getNumber()]; in IfConvertDiamond()
1223 BBI.IsAnalyzed = false; in IfConvertDiamond()
1234 SmallVector<MachineOperand, 4> RevCond(BBI.BrCond.begin(), BBI.BrCond.end()); in IfConvertDiamond()
1237 SmallVector<MachineOperand, 4> *Cond1 = &BBI.BrCond; in IfConvertDiamond()
1254 BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB); in IfConvertDiamond()
1287 BBI.BB->splice(BBI.BB->end(), BBI1->BB, BBI1->BB->begin(), DI1); in IfConvertDiamond()
1368 MergeBlocks(BBI, *BBI1, TailBB == 0); in IfConvertDiamond()
1369 MergeBlocks(BBI, *BBI2, TailBB == 0); in IfConvertDiamond()
1389 MergeBlocks(BBI, TailBBI); in IfConvertDiamond()
1392 BBI.BB->addSuccessor(TailBB); in IfConvertDiamond()
1393 InsertUncondBranch(BBI.BB, TailBB, TII); in IfConvertDiamond()
1394 BBI.HasFallThrough = false; in IfConvertDiamond()
1401 BBI.BB->removeSuccessor(BBI1->BB); in IfConvertDiamond()
1402 BBI.BB->removeSuccessor(BBI2->BB); in IfConvertDiamond()
1403 RemoveExtraEdges(BBI); in IfConvertDiamond()
1406 BBI.IsDone = TrueBBI.IsDone = FalseBBI.IsDone = true; in IfConvertDiamond()
1407 InvalidatePreds(BBI.BB); in IfConvertDiamond()
1436 void IfConverter::PredicateBlock(BBInfo &BBI, in PredicateBlock() argument
1443 for (MachineBasicBlock::iterator I = BBI.BB->begin(); I != E; ++I) { in PredicateBlock()
1468 std::copy(Cond.begin(), Cond.end(), std::back_inserter(BBI.Predicate)); in PredicateBlock()
1470 BBI.IsAnalyzed = false; in PredicateBlock()
1471 BBI.NonPredSize = 0; in PredicateBlock()