Lines Matching refs:BasicBlock
38 using BlockSet = std::unordered_set<BasicBlock *>;
39 using Edge = std::pair<BasicBlock *, BasicBlock *>;
43 static void partialOrderVisit(BasicBlock &Start, in partialOrderVisit()
44 std::function<bool(BasicBlock *)> Op) { in partialOrderVisit()
52 getRegionForHeader(const ConvergenceRegion *Node, BasicBlock *BB) { in getRegionForHeader()
66 static BasicBlock *getExitFor(const ConvergenceRegion *CR) { in getExitFor()
67 std::unordered_set<BasicBlock *> ExitTargets; in getExitFor()
68 for (BasicBlock *Exit : CR->Exits) { in getExitFor()
69 for (BasicBlock *Successor : successors(Exit)) { in getExitFor()
84 static BasicBlock *getDesignatedMergeBlock(Instruction *I) { in getDesignatedMergeBlock()
99 static BasicBlock *getDesignatedContinueBlock(Instruction *I) { in getDesignatedContinueBlock()
113 static bool isDefinedAsSelectionMergeBy(BasicBlock &Header, BasicBlock &Merge) { in isDefinedAsSelectionMergeBy()
115 BasicBlock *MB = getDesignatedMergeBlock(&I); in isDefinedAsSelectionMergeBy()
123 static bool hasLoopMergeInstruction(BasicBlock &BB) { in hasLoopMergeInstruction()
138 static SmallPtrSet<BasicBlock *, 2> getHeaderBlocks(Function &F) { in getHeaderBlocks()
139 SmallPtrSet<BasicBlock *, 2> Output; in getHeaderBlocks()
140 for (BasicBlock &BB : F) { in getHeaderBlocks()
151 static SmallPtrSet<BasicBlock *, 2> getMergeBlocks(Function &F) { in getMergeBlocks()
152 SmallPtrSet<BasicBlock *, 2> Output; in getMergeBlocks()
153 for (BasicBlock &BB : F) { in getMergeBlocks()
155 BasicBlock *MB = getDesignatedMergeBlock(&I); in getMergeBlocks()
166 static std::vector<Instruction *> getMergeInstructions(BasicBlock &BB) { in getMergeInstructions()
176 static SmallPtrSet<BasicBlock *, 2> getContinueBlocks(Function &F) { in getContinueBlocks()
177 SmallPtrSet<BasicBlock *, 2> Output; in getContinueBlocks()
178 for (BasicBlock &BB : F) { in getContinueBlocks()
180 BasicBlock *MB = getDesignatedContinueBlock(&I); in getContinueBlocks()
190 static void visit(BasicBlock &Start, std::function<bool(BasicBlock *)> op) { in visit()
191 std::stack<BasicBlock *> ToVisit; in visit()
192 SmallPtrSet<BasicBlock *, 8> Seen; in visit()
197 BasicBlock *BB = ToVisit.top(); in visit()
215 static void replaceIfBranchTargets(BasicBlock *BB, BasicBlock *OldTarget, in replaceIfBranchTargets()
216 BasicBlock *NewTarget) { in replaceIfBranchTargets()
262 static void replaceBranchTargets(BasicBlock *BB, BasicBlock *OldTarget, in replaceBranchTargets()
263 BasicBlock *NewTarget) { in replaceBranchTargets()
297 BasicBlock *Header = nullptr;
298 BasicBlock *Merge = nullptr;
299 BasicBlock *Continue = nullptr;
324 std::vector<BasicBlock *> getLoopConstructBlocks(BasicBlock *Header, in getLoopConstructBlocks()
325 BasicBlock *Merge) { in getLoopConstructBlocks()
327 std::vector<BasicBlock *> Output; in getLoopConstructBlocks()
328 partialOrderVisit(*Header, [&](BasicBlock *BB) { in getLoopConstructBlocks()
340 std::vector<BasicBlock *>
353 std::vector<BasicBlock *> Output; in getSelectionConstructBlocks()
354 partialOrderVisit(*Node->Header, [&](BasicBlock *BB) { in getSelectionConstructBlocks()
366 std::vector<BasicBlock *> getSwitchConstructBlocks(BasicBlock *Header, in getSwitchConstructBlocks()
367 BasicBlock *Merge) { in getSwitchConstructBlocks()
370 std::vector<BasicBlock *> Output; in getSwitchConstructBlocks()
371 partialOrderVisit(*Header, [&](BasicBlock *BB) { in getSwitchConstructBlocks()
386 std::vector<BasicBlock *> getCaseConstructBlocks(BasicBlock *Target, in getCaseConstructBlocks()
387 BasicBlock *Merge) { in getCaseConstructBlocks()
390 std::vector<BasicBlock *> Output; in getCaseConstructBlocks()
391 partialOrderVisit(*Target, [&](BasicBlock *BB) { in getCaseConstructBlocks()
430 std::unordered_set<BasicBlock *> Seen; in createAliasBlocksForComplexEdges()
439 BasicBlock *NewSrc = BasicBlock::Create( in createAliasBlocksForComplexEdges()
454 BasicBlock::iterator Position) { in CreateVariable()
462 BasicBlock *createSingleExitNode(BasicBlock *Header, in createSingleExitNode()
467 std::vector<BasicBlock *> Dsts; in createSingleExitNode()
468 std::unordered_map<BasicBlock *, ConstantInt *> DstToIndex; in createSingleExitNode()
469 auto NewExit = BasicBlock::Create(F.getContext(), in createSingleExitNode()
509 for (BasicBlock *BB : drop_begin(Dsts)) in createSingleExitNode()
518 BasicBlock *BB, in createExitVariable()
519 const DenseMap<BasicBlock *, ConstantInt *> &TargetToValue) { in createExitVariable() argument
529 BasicBlock *LHSTarget = BI->getSuccessor(0); in createExitVariable()
530 BasicBlock *RHSTarget = in createExitVariable()
546 BasicBlock *CreateUnreachable(Function &F) { in CreateUnreachable()
547 BasicBlock *BB = BasicBlock::Create(F.getContext(), "unreachable", &F); in CreateUnreachable()
626 BasicBlock *Header = DT.getNode(&BB)->getIDom()->getBlock(); in addMergeForNodesWithMultiplePredecessors()
648 bool sortSelectionMerge(Function &F, BasicBlock &Block) { in sortSelectionMerge()
664 BasicBlock *RightMerge = getDesignatedMergeBlock(Right); in sortSelectionMerge()
665 BasicBlock *LeftMerge = getDesignatedMergeBlock(Left); in sortSelectionMerge()
682 for (BasicBlock &BB : F) { in sortSelectionMergeHeaders()
691 std::stack<BasicBlock *> Work; in splitBlocksWithMultipleHeaders()
701 BasicBlock *Header = Work.top(); in splitBlocksWithMultipleHeaders()
707 BasicBlock *NewBlock = in splitBlocksWithMultipleHeaders()
711 BasicBlock *Unreachable = CreateUnreachable(F); in splitBlocksWithMultipleHeaders()
741 std::vector<BasicBlock *> Candidates; in addMergeForDivergentBlocks()
742 for (BasicBlock *Successor : successors(&BB)) { in addMergeForDivergentBlocks()
754 BasicBlock *Merge = Candidates[0]; in addMergeForDivergentBlocks()
768 BasicBlock &Header) { in getExitsFrom()
770 visit(Header, [&](BasicBlock *Item) { in getExitsFrom()
774 for (BasicBlock *Successor : successors(Item)) { in getExitsFrom()
787 BasicBlock *BB, DivergentConstruct *Parent) { in constructDivergentConstruct()
794 for (BasicBlock *Successor : successors(BB)) in constructDivergentConstruct()
802 BasicBlock *Merge = getDesignatedMergeBlock(MI); in constructDivergentConstruct()
803 BasicBlock *Continue = getDesignatedContinueBlock(MI); in constructDivergentConstruct()
815 for (BasicBlock *Successor : successors(BB)) in constructDivergentConstruct()
891 BasicBlock *NewExit = S.createSingleExitNode(Node->Header, Edges); in fixupConstruct()
935 for (BasicBlock &BB : F) { in simplifyBranches()
967 for (BasicBlock &BB : F) { in splitSwitchCases()
977 BasicBlock *Target = It->getCaseSuccessor(); in splitSwitchCases()
985 BasicBlock *NewTarget = in splitSwitchCases()
986 BasicBlock::Create(F.getContext(), "new.sw.case", &F); in splitSwitchCases()
1000 std::vector<BasicBlock *> ToRemove; in removeUselessBlocks()
1005 for (BasicBlock &BB : F) { in removeUselessBlocks()
1018 BasicBlock *Successor = BB.getUniqueSuccessor(); in removeUselessBlocks()
1019 std::vector<BasicBlock *> Predecessors(predecessors(&BB).begin(), in removeUselessBlocks()
1021 for (BasicBlock *Predecessor : Predecessors) in removeUselessBlocks()
1026 for (BasicBlock *BB : ToRemove) in removeUselessBlocks()
1044 for (BasicBlock &BB : F) { in addHeaderToRemainingDivergentDAG()
1051 for (BasicBlock *Successor : successors(&BB)) { in addHeaderToRemainingDivergentDAG()
1063 BasicBlock *Header = &BB; in addHeaderToRemainingDivergentDAG()
1064 BasicBlock *Merge = PDT.getNode(&BB)->getIDom()->getBlock(); in addHeaderToRemainingDivergentDAG()
1067 visit(*Header, [&](const BasicBlock *Node) { in addHeaderToRemainingDivergentDAG()
1099 BasicBlock *NewMerge = in addHeaderToRemainingDivergentDAG()