Lines Matching defs:MBB

182   int getSCCNum(MachineBasicBlock *MBB) const;
184 bool hasBackEdge(MachineBasicBlock *MBB) const;
185 bool isRetiredBlock(MachineBasicBlock *MBB) const;
186 bool isActiveLoophead(MachineBasicBlock *MBB) const;
191 bool needMigrateBlock(MachineBasicBlock *MBB) const;
195 MachineBasicBlock &MBB);
200 void insertInstrEnd(MachineBasicBlock *MBB, int NewOpcode,
202 MachineInstr *insertInstrBefore(MachineBasicBlock *MBB, int NewOpcode,
207 void insertCondBranchBefore(MachineBasicBlock *MBB,
216 static void setTrueBranch(MachineInstr *MI, MachineBasicBlock *MBB);
217 static MachineBasicBlock *getFalseBranch(MachineBasicBlock *MBB,
221 static DebugLoc getLastDebugLocInBB(MachineBasicBlock *MBB);
222 static MachineInstr *getNormalBlockBranchInstr(MachineBasicBlock *MBB);
228 MachineInstr *getLoopendBlockBranchInstr(MachineBasicBlock *MBB);
230 static MachineInstr *getReturnInstr(MachineBasicBlock *MBB);
231 static bool isReturnBlock(MachineBasicBlock *MBB);
234 static MachineBasicBlock *clone(MachineBasicBlock *MBB);
242 static void wrapup(MachineBasicBlock *MBB);
244 int patternMatch(MachineBasicBlock *MBB);
245 int patternMatchGroup(MachineBasicBlock *MBB);
246 int serialPatternMatch(MachineBasicBlock *MBB);
247 int ifPatternMatch(MachineBasicBlock *MBB);
272 MachineBasicBlock *MBB, MachineBasicBlock *TrueMBB,
290 void removeUnconditionalBranch(MachineBasicBlock *MBB);
300 void removeRedundantConditionalBranch(MachineBasicBlock *MBB);
303 void removeSuccessor(MachineBasicBlock *MBB);
304 MachineBasicBlock *cloneBlockForPredecessor(MachineBasicBlock *MBB,
308 void recordSccnum(MachineBasicBlock *MBB, int SCCNum);
309 void retireBlock(MachineBasicBlock *MBB);
323 int R600MachineCFGStructurizer::getSCCNum(MachineBasicBlock *MBB) const {
324 MBBInfoMap::const_iterator It = BlockInfoMap.find(MBB);
338 bool R600MachineCFGStructurizer::hasBackEdge(MachineBasicBlock *MBB) const {
339 MachineLoop *LoopRep = MLI->getLoopFor(MBB);
343 return MBB->isSuccessor(LoopHeader);
346 bool R600MachineCFGStructurizer::isRetiredBlock(MachineBasicBlock *MBB) const {
347 MBBInfoMap::const_iterator It = BlockInfoMap.find(MBB);
353 bool R600MachineCFGStructurizer::isActiveLoophead(MachineBasicBlock *MBB) const {
354 MachineLoop *LoopRep = MLI->getLoopFor(MBB);
355 while (LoopRep && LoopRep->getHeader() == MBB) {
395 bool R600MachineCFGStructurizer::needMigrateBlock(MachineBasicBlock *MBB) const {
398 bool MultiplePreds = MBB && (MBB->pred_size() > 1);
402 unsigned BlkSize = MBB->size();
404 (BlkSize * (MBB->pred_size() - 1) > CloneInstrThreshold));
408 MachineBasicBlock::iterator I, MachineBasicBlock &MBB) {
411 if (I == MBB.end())
434 void R600MachineCFGStructurizer::insertInstrEnd(MachineBasicBlock *MBB,
437 MBB->getParent()->CreateMachineInstr(TII->get(NewOpcode), DL);
438 MBB->push_back(MI);
443 MachineInstr *R600MachineCFGStructurizer::insertInstrBefore(MachineBasicBlock *MBB,
447 MBB->getParent()->CreateMachineInstr(TII->get(NewOpcode), DL);
448 if (!MBB->empty())
449 MBB->insert(MBB->begin(), MI);
451 MBB->push_back(MI);
459 MachineBasicBlock *MBB = OldMI->getParent();
461 MBB->getParent()->CreateMachineInstr(TII->get(NewOpcode), DebugLoc());
462 MBB->insert(I, NewMBB);
471 MachineBasicBlock *MBB = OldMI->getParent();
472 MachineFunction *MF = MBB->getParent();
474 MBB->insert(I, NewMI);
537 MachineBasicBlock *MBB) {
538 MI->getOperand(0).setMBB(MBB);
542 R600MachineCFGStructurizer::getFalseBranch(MachineBasicBlock *MBB,
544 assert(MBB->succ_size() == 2);
546 MachineBasicBlock::succ_iterator It = MBB->succ_begin();
574 DebugLoc R600MachineCFGStructurizer::getLastDebugLocInBB(MachineBasicBlock *MBB) {
577 for (MachineInstr &MI : *MBB)
584 MachineBasicBlock *MBB) {
585 MachineBasicBlock::reverse_iterator It = MBB->rbegin();
593 MachineBasicBlock *MBB) {
594 for (MachineBasicBlock::reverse_iterator It = MBB->rbegin(), E = MBB->rend();
608 MachineInstr *R600MachineCFGStructurizer::getReturnInstr(MachineBasicBlock *MBB) {
609 MachineBasicBlock::reverse_iterator It = MBB->rbegin();
610 if (It != MBB->rend()) {
618 bool R600MachineCFGStructurizer::isReturnBlock(MachineBasicBlock *MBB) {
619 MachineInstr *MI = getReturnInstr(MBB);
620 bool IsReturn = MBB->succ_empty();
624 LLVM_DEBUG(dbgs() << "BB" << MBB->getNumber()
635 MachineBasicBlock *R600MachineCFGStructurizer::clone(MachineBasicBlock *MBB) {
636 MachineFunction *Func = MBB->getParent();
639 for (const MachineInstr &It : *MBB)
653 void R600MachineCFGStructurizer::wrapup(MachineBasicBlock *MBB) {
654 assert((!MBB->getParent()->getJumpTableInfo()
655 || MBB->getParent()->getJumpTableInfo()->isEmpty())
660 MachineBasicBlock::iterator Pre = MBB->begin();
661 MachineBasicBlock::iterator E = MBB->end();
706 for (MachineBasicBlock *MBB : OrderedBlks) {
707 removeUnconditionalBranch(MBB);
708 removeRedundantConditionalBranch(MBB);
709 if (isReturnBlock(MBB)) {
710 RetBlks.push_back(MBB);
712 assert(MBB->succ_size() <= 2);
735 MachineBasicBlock *MBB;
759 MBB = *It;
763 SccBeginMBB = MBB;
770 if (!isRetiredBlock(MBB))
771 patternMatch(MBB);
782 LLVM_DEBUG(dbgs() << "Can't reduce SCC " << getSCCNum(MBB)
791 LLVM_DEBUG(dbgs() << "repeat processing SCC" << getSCCNum(MBB)
853 for (MachineBasicBlock *MBB : SccNext) {
854 OrderedBlks.push_back(MBB);
855 recordSccnum(MBB, SccNum);
860 for (auto *MBB : nodes(MF)) {
861 SccNum = getSCCNum(MBB);
863 dbgs() << "unreachable block BB" << MBB->getNumber() << "\n";
867 int R600MachineCFGStructurizer::patternMatch(MachineBasicBlock *MBB) {
871 LLVM_DEBUG(dbgs() << "Begin patternMatch BB" << MBB->getNumber() << "\n";);
873 while ((CurMatch = patternMatchGroup(MBB)) > 0)
876 LLVM_DEBUG(dbgs() << "End patternMatch BB" << MBB->getNumber()
882 int R600MachineCFGStructurizer::patternMatchGroup(MachineBasicBlock *MBB) {
885 NumMatch += serialPatternMatch(MBB);
886 NumMatch += ifPatternMatch(MBB);
890 int R600MachineCFGStructurizer::serialPatternMatch(MachineBasicBlock *MBB) {
891 if (MBB->succ_size() != 1)
894 MachineBasicBlock *childBlk = *MBB->succ_begin();
898 mergeSerialBlock(MBB, childBlk);
903 int R600MachineCFGStructurizer::ifPatternMatch(MachineBasicBlock *MBB) {
905 if (MBB->succ_size() != 2)
907 if (hasBackEdge(MBB))
909 MachineInstr *BranchMI = getNormalBlockBranchInstr(MBB);
919 MachineBasicBlock *FalseMBB = getFalseBranch(MBB, BranchMI);
940 reversePredicateSetter(MBB->end(), *MBB);
950 return NumMatch + handleJumpintoIf(MBB, TrueMBB, FalseMBB);
959 Cloned += improveSimpleJumpintoIf(MBB, TrueMBB, FalseMBB, &LandBlk);
963 TrueMBB = cloneBlockForPredecessor(TrueMBB, MBB);
968 FalseMBB = cloneBlockForPredecessor(FalseMBB, MBB);
972 mergeIfthenelseBlock(BranchMI, MBB, TrueMBB, FalseMBB, LandBlk);
1017 for (MachineBasicBlock *MBB : ExitBlks)
1018 ExitBlkSet.insert(MBB);
1027 for (MachineBasicBlock *MBB : ExitingMBBs)
1028 mergeLoopbreakBlock(MBB, ExitBlk);
1029 for (MachineBasicBlock *MBB : LatchBlks)
1030 settleLoopcontBlock(MBB, LoopHeader);
1314 for (MachineBasicBlock *MBB : LandBlk->predecessors())
1315 if (MBB != TrueMBB && MBB != FalseMBB)
1343 MachineBasicBlock *MBB, MachineBasicBlock *TrueMBB,
1346 LLVM_DEBUG(dbgs() << "ifPattern BB" << MBB->getNumber(); dbgs() << "{ ";
1372 MBB->splice(I, TrueMBB, TrueMBB->begin(), TrueMBB->end());
1373 MBB->removeSuccessor(TrueMBB, true);
1382 MBB->splice(I, FalseMBB, FalseMBB->begin(),
1384 MBB->removeSuccessor(FalseMBB, true);
1395 MBB->addSuccessor(LandMBB);
1491 R600MachineCFGStructurizer::cloneBlockForPredecessor(MachineBasicBlock *MBB,
1493 assert(PredMBB->isSuccessor(MBB) && "succBlk is not a predecessor of curBlk");
1495 MachineBasicBlock *CloneMBB = clone(MBB); //clone instructions
1496 replaceInstrUseOfBlockWith(PredMBB, MBB, CloneMBB);
1499 PredMBB->replaceSuccessor(MBB, CloneMBB);
1502 cloneSuccessorList(CloneMBB, MBB);
1504 numClonedInstr += MBB->size();
1507 << "BB" << MBB->getNumber() << "size " << MBB->size()
1560 void R600MachineCFGStructurizer::removeUnconditionalBranch(MachineBasicBlock *MBB) {
1565 while ((BranchMI = getLoopendBlockBranchInstr(MBB))
1573 MachineBasicBlock *MBB) {
1574 if (MBB->succ_size() != 2)
1576 MachineBasicBlock *MBB1 = *MBB->succ_begin();
1577 MachineBasicBlock *MBB2 = *std::next(MBB->succ_begin());
1581 MachineInstr *BranchMI = getNormalBlockBranchInstr(MBB);
1586 MBB->removeSuccessor(MBB1, true);
1595 for (MachineBasicBlock *MBB : RetMBB) {
1596 if (MachineInstr *MI = getReturnInstr(MBB))
1598 MBB->addSuccessor(DummyExitBlk);
1599 LLVM_DEBUG(dbgs() << "Add dummyExitBlock to BB" << MBB->getNumber()
1605 void R600MachineCFGStructurizer::removeSuccessor(MachineBasicBlock *MBB) {
1606 while (MBB->succ_size())
1607 MBB->removeSuccessor(*MBB->succ_begin());
1610 void R600MachineCFGStructurizer::recordSccnum(MachineBasicBlock *MBB,
1612 BlockInformation *&srcBlkInfo = BlockInfoMap[MBB];
1618 void R600MachineCFGStructurizer::retireBlock(MachineBasicBlock *MBB) {
1619 LLVM_DEBUG(dbgs() << "Retiring BB" << MBB->getNumber() << "\n";);
1621 BlockInformation *&SrcBlkInfo = BlockInfoMap[MBB];
1627 assert(MBB->succ_empty() && MBB->pred_empty() && "can't retire block yet");