Lines Matching refs:BasicBlock
1 //===- BasicBlockUtils.cpp - BasicBlock Utilities --------------------------==//
24 #include "llvm/IR/BasicBlock.h"
63 ArrayRef<BasicBlock *> BBs,
69 SmallPtrSet<BasicBlock *, 4> UniqueSuccessors;
70 for (BasicBlock *Succ : successors(BB)) {
96 void llvm::DeleteDeadBlock(BasicBlock *BB, DomTreeUpdater *DTU,
101 void llvm::DeleteDeadBlocks(ArrayRef <BasicBlock *> BBs, DomTreeUpdater *DTU,
105 SmallPtrSet<BasicBlock *, 4> Dead(BBs.begin(), BBs.end());
108 for (BasicBlock *Pred : predecessors(BB))
118 for (BasicBlock *BB : BBs)
127 df_iterator_default_set<BasicBlock*> Reachable;
130 for (BasicBlock *BB : depth_first_ext(&F, Reachable))
134 std::vector<BasicBlock*> DeadBlocks;
135 for (BasicBlock &BB : F)
145 bool llvm::FoldSingleEntryPHINodes(BasicBlock *BB,
164 bool llvm::DeleteDeadPHIs(BasicBlock *BB, const TargetLibraryInfo *TLI,
180 bool llvm::MergeBlockIntoPredecessor(BasicBlock *BB, DomTreeUpdater *DTU,
189 BasicBlock *PredBB = BB->getUniquePredecessor();
207 BasicBlock *NewSucc = nullptr;
253 SmallPtrSet<BasicBlock *, 8> SeenSuccs;
254 SmallPtrSet<BasicBlock *, 2> SuccsOfPredBB(succ_begin(PredBB),
263 for (BasicBlock *SuccOfBB : successors(BB))
269 for (BasicBlock *SuccOfBB : successors(BB))
340 SmallPtrSetImpl<BasicBlock *> &MergeBlocks, Loop *L, DomTreeUpdater *DTU,
346 BasicBlock *BB = *MergeBlocks.begin();
347 BasicBlock *Dest = BB->getSingleSuccessor();
349 BasicBlock *Fold = Dest->getUniquePredecessor();
386 DbgVariableRecordsRemoveRedundantDbgInstrsUsingBackwardScan(BasicBlock *BB) {
442 static bool removeRedundantDbgInstrsUsingBackwardScan(BasicBlock *BB) {
504 DbgVariableRecordsRemoveRedundantDbgInstrsUsingForwardScan(BasicBlock *BB) {
546 DbgVariableRecordsRemoveUndefDbgAssignsFromEntryBlock(BasicBlock *BB) {
582 static bool removeRedundantDbgInstrsUsingForwardScan(BasicBlock *BB) {
646 static bool removeUndefDbgAssignsFromEntryBlock(BasicBlock *BB) {
684 bool llvm::RemoveRedundantDbgInstrs(BasicBlock *BB) {
709 void llvm::ReplaceInstWithValue(BasicBlock::iterator &BI, Value *V) {
722 void llvm::ReplaceInstWithInst(BasicBlock *BB, BasicBlock::iterator &BI,
733 BasicBlock::iterator New = I->insertInto(BB, BI);
742 bool llvm::IsBlockFollowedByDeoptOrUnreachable(const BasicBlock *BB) {
744 SmallPtrSet<const BasicBlock *, 8> VisitedBlocks;
757 BasicBlock::iterator BI(From);
761 BasicBlock *llvm::SplitEdge(BasicBlock *BB, BasicBlock *Succ, DominatorTree *DT,
783 if (BasicBlock *SP = Succ->getSinglePredecessor()) {
799 void llvm::setUnwindEdgeTo(Instruction *TI, BasicBlock *Succ) {
810 void llvm::updatePhiNodes(BasicBlock *DestBB, BasicBlock *OldPred,
811 BasicBlock *NewPred, PHINode *Until) {
832 BasicBlock *llvm::ehAwareSplitEdge(BasicBlock *BB, BasicBlock *Succ,
843 SmallVector<BasicBlock *, 4> LoopPreds;
859 for (BasicBlock *P : predecessors(Succ)) {
872 if (any_of(LoopPreds, [](BasicBlock *Pred) {
881 BasicBlock::Create(BB->getContext(), BBName, BB->getParent(), Succ);
968 BasicBlock *NewExitBB = SplitBlockPredecessors(
980 void llvm::createPHIsForSplitLoopExit(ArrayRef<BasicBlock *> Preds,
981 BasicBlock *SplitBB, BasicBlock *DestBB) {
1001 BasicBlock::iterator InsertPos =
1005 for (BasicBlock *BB : Preds)
1017 for (BasicBlock &BB : F) {
1027 static BasicBlock *SplitBlockImpl(BasicBlock *Old, BasicBlock::iterator SplitPt,
1037 BasicBlock::iterator SplitIt = SplitPt;
1043 BasicBlock *New = Old->splitBasicBlock(
1055 SmallPtrSet<BasicBlock *, 8> UniqueSuccessorsOfOld;
1058 for (BasicBlock *SuccessorOfOld : successors(New))
1083 BasicBlock *llvm::SplitBlock(BasicBlock *Old, BasicBlock::iterator SplitPt,
1090 BasicBlock *llvm::SplitBlock(BasicBlock *Old, BasicBlock::iterator SplitPt,
1098 BasicBlock *llvm::splitBlockBefore(BasicBlock *Old, BasicBlock::iterator SplitPt,
1103 BasicBlock::iterator SplitIt = SplitPt;
1107 BasicBlock *New = Old->splitBasicBlock(
1121 SmallPtrSet<BasicBlock *, 8> UniquePredecessorsOfOld;
1124 for (BasicBlock *PredecessorOfOld : predecessors(New))
1145 static void UpdateAnalysisInformation(BasicBlock *OldBB, BasicBlock *NewBB,
1146 ArrayRef<BasicBlock *> Preds,
1162 SmallPtrSet<BasicBlock *, 8> UniquePreds;
1199 for (BasicBlock *Pred : Preds) {
1233 for (BasicBlock *Pred : Preds) {
1259 static void UpdatePHINodes(BasicBlock *OrigBB, BasicBlock *NewBB,
1260 ArrayRef<BasicBlock *> Preds, BranchInst *BI,
1263 SmallPtrSet<BasicBlock *, 16> PredSet(Preds.begin(), Preds.end());
1264 for (BasicBlock::iterator I = OrigBB->begin(); isa<PHINode>(I); ) {
1311 BasicBlock *IncomingBB = PN->getIncomingBlock(i);
1323 BasicBlock *OrigBB, ArrayRef<BasicBlock *> Preds, const char *Suffix1,
1324 const char *Suffix2, SmallVectorImpl<BasicBlock *> &NewBBs,
1328 static BasicBlock *
1329 SplitBlockPredecessorsImpl(BasicBlock *BB, ArrayRef<BasicBlock *> Preds,
1340 SmallVector<BasicBlock*, 2> NewBBs;
1349 BasicBlock *NewBB = BasicBlock::Create(
1356 BasicBlock *OldLatch = nullptr;
1373 for (BasicBlock *Pred : Preds) {
1388 for (BasicBlock::iterator I = BB->begin(); isa<PHINode>(I); ++I)
1403 BasicBlock *NewLatch = L->getLoopLatch();
1418 BasicBlock *llvm::SplitBlockPredecessors(BasicBlock *BB,
1419 ArrayRef<BasicBlock *> Preds,
1426 BasicBlock *llvm::SplitBlockPredecessors(BasicBlock *BB,
1427 ArrayRef<BasicBlock *> Preds,
1437 BasicBlock *OrigBB, ArrayRef<BasicBlock *> Preds, const char *Suffix1,
1438 const char *Suffix2, SmallVectorImpl<BasicBlock *> &NewBBs,
1445 BasicBlock *NewBB1 = BasicBlock::Create(OrigBB->getContext(),
1455 for (BasicBlock *Pred : Preds) {
1472 SmallVector<BasicBlock*, 8> NewBB2Preds;
1475 BasicBlock *Pred = *i++;
1483 BasicBlock *NewBB2 = nullptr;
1486 NewBB2 = BasicBlock::Create(OrigBB->getContext(),
1496 for (BasicBlock *NewBB2Pred : NewBB2Preds)
1538 void llvm::SplitLandingPadPredecessors(BasicBlock *OrigBB,
1539 ArrayRef<BasicBlock *> Preds,
1541 SmallVectorImpl<BasicBlock *> &NewBBs,
1550 ReturnInst *llvm::FoldReturnIntoUncondBranch(ReturnInst *RI, BasicBlock *BB,
1551 BasicBlock *Pred,
1609 BasicBlock::iterator SplitBefore,
1613 BasicBlock *ThenBlock) {
1622 BasicBlock::iterator SplitBefore,
1626 BasicBlock *ElseBlock) {
1634 void llvm::SplitBlockAndInsertIfThenElse(Value *Cond, BasicBlock::iterator SplitBefore,
1639 BasicBlock *ThenBlock = nullptr;
1640 BasicBlock *ElseBlock = nullptr;
1650 Value *Cond, BasicBlock::iterator SplitBefore, BasicBlock **ThenBlock,
1651 BasicBlock **ElseBlock, bool UnreachableThen, bool UnreachableElse,
1659 SmallPtrSet<BasicBlock *, 8> UniqueOrigSuccessors;
1660 BasicBlock *Head = SplitBefore->getParent();
1667 BasicBlock *Tail = Head->splitBasicBlock(SplitBefore);
1668 BasicBlock *TrueBlock = Tail;
1669 BasicBlock *FalseBlock = Tail;
1674 auto handleBlock = [&](BasicBlock **PBB, bool Unreachable, BasicBlock *&BB,
1683 BB = BasicBlock::Create(C, "", Head->getParent(), Tail);
1712 for (BasicBlock *UniqueOrigSuccessor : UniqueOrigSuccessors)
1714 for (BasicBlock *UniqueOrigSuccessor : UniqueOrigSuccessors)
1732 BasicBlock *LoopPred = SplitBefore->getParent();
1733 BasicBlock *LoopBody = SplitBlock(SplitBefore->getParent(), SplitBefore);
1734 BasicBlock *LoopExit = SplitBlock(SplitBefore->getParent(), SplitBefore);
1802 BranchInst *llvm::GetIfCondition(BasicBlock *BB, BasicBlock *&IfTrue,
1803 BasicBlock *&IfFalse) {
1805 BasicBlock *Pred1 = nullptr;
1806 BasicBlock *Pred2 = nullptr;
1875 BasicBlock *CommonPred = Pred1->getSinglePredecessor();
1903 static void reconnectPhis(BasicBlock *Out, BasicBlock *GuardBlock,
1904 const SetVector<BasicBlock *> &Incoming,
1905 BasicBlock *FirstGuardBlock) {
1932 using BBPredicates = DenseMap<BasicBlock *, Instruction *>;
1933 using BBSetVector = SetVector<BasicBlock *>;
1945 static std::tuple<Value *, BasicBlock *, BasicBlock *>
1946 redirectToHub(BasicBlock *BB, BasicBlock *FirstGuardBlock,
1953 BasicBlock *Succ0 = Branch->getSuccessor(0);
1954 BasicBlock *Succ1 = nullptr;
1985 static void setupBranchForGuard(SmallVectorImpl<BasicBlock *> &GuardBlocks,
2007 SmallVectorImpl<BasicBlock *> &GuardBlocks, BBPredicates &GuardPredicates) {
2016 BasicBlock *Succ0;
2017 BasicBlock *Succ1;
2052 SmallVectorImpl<BasicBlock *> &GuardBlocks, BBPredicates &GuardPredicates,
2073 BasicBlock *Succ0;
2074 BasicBlock *Succ1;
2120 convertToGuardPredicates(SmallVectorImpl<BasicBlock *> &GuardBlocks,
2130 BasicBlock::Create(F->getContext(), Prefix + ".guard", F));
2146 BasicBlock *llvm::CreateControlFlowHub(
2147 DomTreeUpdater *DTU, SmallVectorImpl<BasicBlock *> &GuardBlocks,
2225 bool llvm::isPresplitCoroSuspendExitEdge(const BasicBlock &Src,
2226 const BasicBlock &Dest) {