Home | History | Annotate | Download | only in CodeGen

Lines Matching full:bbi

128     /// BBI             - Corresponding BBInfo.
139 BBInfo &BBI;
145 : BBI(b), Kind(k), NeedSubsumption(s), NumDups(d), NumDups2(d2) {}
175 bool ReverseBranchCondition(BBInfo &BBI);
183 void ScanInstructions(BBInfo &BBI);
186 bool FeasibilityAnalysis(BBInfo &BBI, SmallVectorImpl<MachineOperand> &Cond,
190 void RemoveExtraEdges(BBInfo &BBI);
191 bool IfConvertSimple(BBInfo &BBI, IfcvtKind Kind);
192 bool IfConvertTriangle(BBInfo &BBI, IfcvtKind Kind);
193 bool IfConvertDiamond(BBInfo &BBI, IfcvtKind Kind,
195 void PredicateBlock(BBInfo &BBI,
223 bool blockAlwaysFallThrough(BBInfo &BBI) const {
224 return BBI.IsBrAnalyzable && BBI.TrueBB == NULL;
244 return C1->BBI.BB->getNumber() < C2->BBI.BB->getNumber();
298 BBInfo &BBI = Token->BBI;
307 if (BBI.IsDone)
308 BBI.IsEnqueued = false;
309 if (!BBI.IsEnqueued)
312 BBI.IsEnqueued = false;
324 << "): BB#" << BBI.BB->getNumber() << " ("
326 ? BBI.FalseBB->getNumber()
327 : BBI.TrueBB->getNumber()) << ") ");
328 RetVal = IfConvertSimple(BBI, Kind);
351 DEBUG(dbgs() << "): BB#" << BBI.BB->getNumber() << " (T:"
352 << BBI.TrueBB->getNumber() << ",F:"
353 << BBI.FalseBB->getNumber() << ") ");
354 RetVal = IfConvertTriangle(BBI, Kind);
369 DEBUG(dbgs() << "Ifcvt (Diamond): BB#" << BBI.BB->getNumber() << " (T:"
370 << BBI.TrueBB->getNumber() << ",F:"
371 << BBI.FalseBB->getNumber() << ") ");
372 RetVal = IfConvertDiamond(BBI, Kind, NumDups, NumDups2);
428 bool IfConverter::ReverseBranchCondition(BBInfo &BBI) {
430 if (!TII->ReverseBranchCondition(BBI.BrCond)) {
431 TII->RemoveBranch(*BBI.BB);
432 TII->InsertBranch(*BBI.BB, BBI.FalseBB, BBI.TrueBB, BBI.BrCond, dl);
433 std::swap(BBI.TrueBB, BBI.FalseBB);
620 void IfConverter::ScanInstructions(BBInfo &BBI) {
621 if (BBI.IsDone)
624 bool AlreadyPredicated = BBI.Predicate.size() > 0;
626 BBI.TrueBB = BBI.FalseBB = NULL;
627 BBI.BrCond.clear();
628 BBI.IsBrAnalyzable =
629 !TII->AnalyzeBranch(*BBI.BB, BBI.TrueBB, BBI.FalseBB, BBI.BrCond);
630 BBI.HasFallThrough = BBI.IsBrAnalyzable && BBI.FalseBB == NULL;
632 if (BBI.BrCond.size()) {
635 if (!BBI.FalseBB)
636 BBI.FalseBB = findFalseBlock(BBI.BB, BBI.TrueBB);
637 if (!BBI.FalseBB) {
639 BBI.IsUnpredicable = true;
645 BBI.NonPredSize = 0;
646 BBI.ExtraCost = 0;
647 BBI.ExtraCost2 = 0;
648 BBI.ClobbersPred = false;
649 for (MachineBasicBlock::iterator I = BBI.BB->begin(), E = BBI.BB->end();
656 BBI.CannotBeCopied = true;
659 bool isCondBr = BBI.IsBrAnalyzable && MCID.isConditionalBranch();
663 BBI.NonPredSize++;
668 BBI.ExtraCost += NumCycles-1;
669 BBI.ExtraCost2 += ExtraPredCost;
674 BBI.IsUnpredicable = true;
679 if (BBI.ClobbersPred && !isPredicated) {
689 BBI.IsUnpredicable = true;
697 BBI.ClobbersPred = true;
700 BBI.IsUnpredicable = true;
708 bool IfConverter::FeasibilityAnalysis(BBInfo &BBI,
712 if (BBI.IsDone || BBI.IsUnpredicable)
717 if (BBI.Predicate.size() && !TII->SubsumesPredicate(BBI.Predicate, Pred))
720 if (BBI.BrCond.size()) {
726 SmallVector<MachineOperand, 4> Cond(BBI.BrCond.begin(), BBI.BrCond.end());
744 BBInfo &BBI = BBAnalysis[BB->getNumber()];
746 if (BBI.IsAnalyzed || BBI.IsBeingAnalyzed)
747 return BBI;
749 BBI.BB = BB;
750 BBI.IsBeingAnalyzed = true;
752 ScanInstructions(BBI);
756 if (!BBI.IsBrAnalyzable || BBI.BrCond.empty() || BBI.IsDone) {
757 BBI.IsBeingAnalyzed = false;
758 BBI.IsAnalyzed = true;
759 return BBI;
763 if (BBI.TrueBB == BB || BBI.FalseBB == BB) {
764 BBI.IsBeingAnalyzed = false;
765 BBI.IsAnalyzed = true;
766 return BBI;
770 if (!BBI.FalseBB) {
771 BBI.IsBeingAnalyzed = false;
772 BBI.IsAnalyzed = true;
773 return BBI;
776 BBInfo &TrueBBI = AnalyzeBlock(BBI.TrueBB, Tokens);
777 BBInfo &FalseBBI = AnalyzeBlock(BBI.FalseBB, Tokens);
780 BBI.IsBeingAnalyzed = false;
781 BBI.IsAnalyzed = true;
782 return BBI;
785 SmallVector<MachineOperand, 4> RevCond(BBI.BrCond.begin(), BBI.BrCond.end());
802 FeasibilityAnalysis(TrueBBI, BBI.BrCond) &&
812 Tokens.push_back(new IfcvtToken(BBI, ICDiamond, TNeedSub|FNeedSub, Dups,
820 FeasibilityAnalysis(TrueBBI, BBI.BrCond, true)) {
828 Tokens.push_back(new IfcvtToken(BBI, ICTriangle, TNeedSub, Dups));
835 FeasibilityAnalysis(TrueBBI, BBI.BrCond, true, true)) {
836 Tokens.push_back(new IfcvtToken(BBI, ICTriangleRev, TNeedSub, Dups));
843 FeasibilityAnalysis(TrueBBI, BBI.BrCond)) {
851 Tokens.push_back(new IfcvtToken(BBI, ICSimple, TNeedSub, Dups));
863 Tokens.push_back(new IfcvtToken(BBI, ICTriangleFalse, FNeedSub, Dups));
873 Tokens.push_back(new IfcvtToken(BBI, ICTriangleFRev, FNeedSub, Dups));
882 Tokens.push_back(new IfcvtToken(BBI, ICSimpleFalse, FNeedSub, Dups));
887 BBI.IsEnqueued = Enqueued;
888 BBI.IsBeingAnalyzed = false;
889 BBI.IsAnalyzed = true;
890 return BBI;
949 void IfConverter::RemoveExtraEdges(BBInfo &BBI) {
952 if (!TII->AnalyzeBranch(*BBI.BB, TBB, FBB, Cond))
953 BBI.BB->CorrectExtraCFGEdges(TBB, FBB, !Cond.empty());
1018 bool IfConverter::IfConvertSimple(BBInfo &BBI, IfcvtKind Kind) {
1019 BBInfo &TrueBBI = BBAnalysis[BBI.TrueBB->getNumber()];
1020 BBInfo &FalseBBI = BBAnalysis[BBI.FalseBB->getNumber()];
1024 SmallVector<MachineOperand, 4> Cond(BBI.BrCond.begin(), BBI.BrCond.end());
1031 BBI.IsAnalyzed = false;
1047 BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
1050 CopyAndPredicateBlock(BBI, *CvtBBI, Cond, Redefs);
1055 BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
1056 MergeBlocks(BBI, *CvtBBI);
1060 if (!canFallThroughTo(BBI.BB, NextBBI->BB)) {
1061 InsertUncondBranch(BBI.BB, NextBBI->BB, TII);
1062 BBI.HasFallThrough = false;
1076 RemoveExtraEdges(BBI);
1080 BBI.IsDone = true;
1081 InvalidatePreds(BBI.BB);
1090 bool IfConverter::IfConvertTriangle(BBInfo &BBI, IfcvtKind Kind) {
1091 BBInfo &TrueBBI = BBAnalysis[BBI.TrueBB->getNumber()];
1092 BBInfo &FalseBBI = BBAnalysis[BBI.FalseBB->getNumber()];
1097 SmallVector<MachineOperand, 4> Cond(BBI.BrCond.begin(), BBI.BrCond.end());
1104 BBI.IsAnalyzed = false;
1120 if (PBB == BBI.BB)
1139 BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
1142 CopyAndPredicateBlock(BBI, *CvtBBI, Cond, Redefs, true);
1149 BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
1150 MergeBlocks(BBI, *CvtBBI, false);
1159 TII->InsertBranch(*BBI.BB, CvtBBI->FalseBB, NULL, RevCond, dl);
1160 BBI.BB->addSuccessor(CvtBBI->FalseBB);
1167 bool isFallThrough = canFallThroughTo(BBI.BB, NextBBI->BB);
1174 MergeBlocks(BBI, *NextBBI);
1177 InsertUncondBranch(BBI.BB, NextBBI->BB, TII);
1178 BBI.HasFallThrough = false;
1185 RemoveExtraEdges(BBI);
1189 BBI.IsDone = true;
1190 InvalidatePreds(BBI.BB);
1201 bool IfConverter::IfConvertDiamond(BBInfo &BBI, IfcvtKind Kind,
1203 BBInfo &TrueBBI = BBAnalysis[BBI.TrueBB->getNumber()];
1204 BBInfo &FalseBBI = BBAnalysis[BBI.FalseBB->getNumber()];
1217 BBI.IsAnalyzed = false;
1228 SmallVector<MachineOperand, 4> RevCond(BBI.BrCond.begin(), BBI.BrCond.end());
1231 SmallVector<MachineOperand, 4> *Cond1 = &BBI.BrCond;
1248 BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
1281 BBI.BB->splice(BBI.BB->end(), BBI1->BB, BBI1->BB->begin(), DI1);
1314 MergeBlocks(BBI, *BBI1, TailBB == 0);
1315 MergeBlocks(BBI, *BBI2, TailBB == 0);
1335 MergeBlocks(BBI, TailBBI);
1338 BBI.BB->addSuccessor(TailBB);
1339 InsertUncondBranch(BBI.BB, TailBB, TII);
1340 BBI
1347 BBI.BB->removeSuccessor(BBI1->BB);
1348 BBI.BB->removeSuccessor(BBI2->BB);
1349 RemoveExtraEdges(BBI);
1352 BBI.IsDone = TrueBBI.IsDone = FalseBBI.IsDone = true;
1353 InvalidatePreds(BBI.BB);
1361 void IfConverter::PredicateBlock(BBInfo &BBI,
1365 for (MachineBasicBlock::iterator I = BBI.BB->begin(); I != E; ++I) {
1380 std::copy(Cond.begin(), Cond.end(), std::back_inserter(BBI.Predicate));
1382 BBI.IsAnalyzed = false;
1383 BBI.NonPredSize = 0;