14#ifndef LLVM_TRANSFORMS_UTILS_BASICBLOCKUTILS_H
15#define LLVM_TRANSFORMS_UTILS_BASICBLOCKUTILS_H
31template <
typename PtrType>
class SmallPtrSetImpl;
32class BlockFrequencyInfo;
33class BranchProbabilityInfo;
39class MemoryDependenceResults;
40class MemorySSAUpdater;
41class PostDominatorTree;
43class TargetLibraryInfo;
52 SmallVectorImpl<DominatorTree::UpdateType> *Updates,
53 bool KeepOneInputPHIs =
false);
57 bool KeepOneInputPHIs =
false);
66 DomTreeUpdater *DTU =
nullptr,
67 bool KeepOneInputPHIs =
false);
73 DomTreeUpdater *DTU =
nullptr,
74 bool KeepOneInputPHIs =
false);
82 MemoryDependenceResults *MemDep =
nullptr);
89 const TargetLibraryInfo *TLI =
nullptr,
90 MemorySSAUpdater *MSSAU =
nullptr);
102 BasicBlock *BB, DomTreeUpdater *DTU =
nullptr, LoopInfo *LI =
nullptr,
103 MemorySSAUpdater *MSSAU =
nullptr,
104 MemoryDependenceResults *MemDep =
nullptr,
105 bool PredecessorWithTwoSuccessors =
false, DominatorTree *DT =
nullptr);
115 SmallPtrSetImpl<BasicBlock *> &MergeBlocks, Loop *L =
nullptr,
116 DomTreeUpdater *DTU =
nullptr, LoopInfo *LI =
nullptr);
221 const CriticalEdgeSplittingOptions &
Options =
222 CriticalEdgeSplittingOptions(),
223 const Twine &BBName =
"");
229 const CriticalEdgeSplittingOptions &
Options =
230 CriticalEdgeSplittingOptions(),
231 const Twine &BBName =
"");
254 CriticalEdgeSplittingOptions());
259 DominatorTree *DT =
nullptr,
260 LoopInfo *LI =
nullptr,
261 MemorySSAUpdater *MSSAU =
nullptr,
262 const Twine &BBName =
"");
270 BasicBlock *NewPred, PHINode *Until =
nullptr);
276 LandingPadInst *OriginalPad =
nullptr,
277 PHINode *LandingPadReplacement =
nullptr,
278 const CriticalEdgeSplittingOptions &
Options =
279 CriticalEdgeSplittingOptions(),
280 const Twine &BBName =
"");
293 DominatorTree *DT, LoopInfo *LI =
nullptr,
294 MemorySSAUpdater *MSSAU =
nullptr,
295 const Twine &BBName =
"",
bool Before =
false);
299 const Twine &BBName =
"",
bool Before =
false) {
312 DomTreeUpdater *DTU =
nullptr,
313 LoopInfo *LI =
nullptr,
314 MemorySSAUpdater *MSSAU =
nullptr,
315 const Twine &BBName =
"",
bool Before =
false);
319 const Twine &BBName =
"",
bool Before =
false) {
330 DomTreeUpdater *DTU, LoopInfo *LI,
331 MemorySSAUpdater *MSSAU,
332 const Twine &BBName =
"");
356 BasicBlock *BB, ArrayRef<BasicBlock *> Preds,
const char *Suffix,
357 DominatorTree *DT, LoopInfo *LI =
nullptr,
358 MemorySSAUpdater *MSSAU =
nullptr,
bool PreserveLCSSA =
false);
375 BasicBlock *BB, ArrayRef<BasicBlock *> Preds,
const char *Suffix,
376 DomTreeUpdater *DTU =
nullptr, LoopInfo *LI =
nullptr,
377 MemorySSAUpdater *MSSAU =
nullptr,
bool PreserveLCSSA =
false);
391 BasicBlock *OrigBB, ArrayRef<BasicBlock *> Preds,
const char *Suffix,
392 const char *Suffix2, SmallVectorImpl<BasicBlock *> &NewBBs,
393 DomTreeUpdater *DTU =
nullptr, LoopInfo *LI =
nullptr,
394 MemorySSAUpdater *MSSAU =
nullptr,
bool PreserveLCSSA =
false);
402 DomTreeUpdater *DTU =
nullptr);
427 bool Unreachable, MDNode *BranchWeights =
nullptr,
428 DomTreeUpdater *DTU =
nullptr, LoopInfo *LI =
nullptr,
429 BasicBlock *ThenBlock =
nullptr);
433 MDNode *BranchWeights =
nullptr,
438 Unreachable, BranchWeights, DTU, LI,
446 bool Unreachable, MDNode *BranchWeights =
nullptr,
447 DomTreeUpdater *DTU =
nullptr, LoopInfo *LI =
nullptr,
448 BasicBlock *ElseBlock =
nullptr);
452 MDNode *BranchWeights =
nullptr,
457 Unreachable, BranchWeights, DTU, LI,
479 Instruction **ElseTerm, MDNode *BranchWeights =
nullptr,
480 DomTreeUpdater *DTU =
nullptr, LoopInfo *LI =
nullptr);
485 MDNode *BranchWeights =
nullptr,
490 ElseTerm, BranchWeights, DTU, LI);
522 BasicBlock **ElseBlock,
bool UnreachableThen =
false,
523 bool UnreachableElse =
false, MDNode *BranchWeights =
nullptr,
524 DomTreeUpdater *DTU =
nullptr, LoopInfo *LI =
nullptr);
529 bool UnreachableThen =
false,
530 bool UnreachableElse =
false,
531 MDNode *BranchWeights =
nullptr,
535 ElseBlock, UnreachableThen, UnreachableElse, BranchWeights, DTU, LI);
542LLVM_ABI std::pair<Instruction *, Value *>
555 std::function<
void(IRBuilderBase &, Value *)> Func);
567 std::function<
void(IRBuilderBase &, Value *)> Func);
578 BasicBlock *&IfFalse);
602 bool IgnoreBlocksWithoutPHI,
603 BranchProbabilityInfo *BPI =
nullptr,
604 BlockFrequencyInfo *BFI =
nullptr);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
BlockVerifier::State From
static cl::opt< bool > SplitAllCriticalEdges("phi-elim-split-all-critical-edges", cl::init(false), cl::Hidden, cl::desc("Split all critical edges during " "PHI elimination"))
const SmallVectorImpl< MachineOperand > & Cond
This file implements a set that has insertion order iteration characteristics.
LLVM Basic Block Representation.
InstListType::iterator iterator
Instruction iterators...
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
LLVM_ABI unsigned getNumSuccessors() const LLVM_READONLY
Return the number of successors that this instruction has.
LLVM_ABI BasicBlock * getSuccessor(unsigned Idx) const LLVM_READONLY
Return the specified successor. This instruction must be a terminator.
PostDominatorTree Class - Concrete subclass of DominatorTree that is used to compute the post-dominat...
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
LLVM Value Representation.
self_iterator getIterator()
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI void ReplaceInstWithInst(BasicBlock *BB, BasicBlock::iterator &BI, Instruction *I)
Replace the instruction specified by BI with the instruction specified by I.
LLVM_ABI bool RemoveRedundantDbgInstrs(BasicBlock *BB)
Try to remove redundant dbg.value instructions from given basic block.
LLVM_ABI bool IsBlockFollowedByDeoptOrUnreachable(const BasicBlock *BB)
Check if we can prove that all paths starting from this block converge to a block that either has a @...
LLVM_ABI BranchInst * GetIfCondition(BasicBlock *BB, BasicBlock *&IfTrue, BasicBlock *&IfFalse)
Check whether BB is the merge point of a if-region.
LLVM_ABI void detachDeadBlocks(ArrayRef< BasicBlock * > BBs, SmallVectorImpl< DominatorTree::UpdateType > *Updates, bool KeepOneInputPHIs=false)
Replace contents of every block in BBs with single unreachable instruction.
LLVM_ABI bool hasOnlySimpleTerminator(const Function &F)
LLVM_ABI ReturnInst * FoldReturnIntoUncondBranch(ReturnInst *RI, BasicBlock *BB, BasicBlock *Pred, DomTreeUpdater *DTU=nullptr)
This method duplicates the specified return instruction into a predecessor which ends in an unconditi...
LLVM_ABI std::pair< Instruction *, Value * > SplitBlockAndInsertSimpleForLoop(Value *End, BasicBlock::iterator SplitBefore)
Insert a for (int i = 0; i < End; i++) loop structure (with the exception that End is assumed > 0,...
LLVM_ABI BasicBlock * splitBlockBefore(BasicBlock *Old, BasicBlock::iterator SplitPt, DomTreeUpdater *DTU, LoopInfo *LI, MemorySSAUpdater *MSSAU, const Twine &BBName="")
Split the specified block at the specified instruction SplitPt.
LLVM_ABI Instruction * SplitBlockAndInsertIfElse(Value *Cond, BasicBlock::iterator SplitBefore, bool Unreachable, MDNode *BranchWeights=nullptr, DomTreeUpdater *DTU=nullptr, LoopInfo *LI=nullptr, BasicBlock *ElseBlock=nullptr)
Similar to SplitBlockAndInsertIfThen, but the inserted block is on the false path of the branch.
LLVM_ABI void DeleteDeadBlock(BasicBlock *BB, DomTreeUpdater *DTU=nullptr, bool KeepOneInputPHIs=false)
Delete the specified block, which must have no predecessors.
LLVM_ABI void ReplaceInstWithValue(BasicBlock::iterator &BI, Value *V)
Replace all uses of an instruction (specified by BI) with a value, then remove and delete the origina...
LLVM_ABI BasicBlock * SplitKnownCriticalEdge(Instruction *TI, unsigned SuccNum, const CriticalEdgeSplittingOptions &Options=CriticalEdgeSplittingOptions(), const Twine &BBName="")
If it is known that an edge is critical, SplitKnownCriticalEdge can be called directly,...
LLVM_ABI bool SplitIndirectBrCriticalEdges(Function &F, bool IgnoreBlocksWithoutPHI, BranchProbabilityInfo *BPI=nullptr, BlockFrequencyInfo *BFI=nullptr)
LLVM_ABI bool DeleteDeadPHIs(BasicBlock *BB, const TargetLibraryInfo *TLI=nullptr, MemorySSAUpdater *MSSAU=nullptr)
Examine each PHI in the given block and delete it if it is dead.
LLVM_ABI void InvertBranch(BranchInst *PBI, IRBuilderBase &Builder)
LLVM_ABI bool EliminateUnreachableBlocks(Function &F, DomTreeUpdater *DTU=nullptr, bool KeepOneInputPHIs=false)
Delete all basic blocks from F that are not reachable from its entry node.
LLVM_ABI bool MergeBlockSuccessorsIntoGivenBlocks(SmallPtrSetImpl< BasicBlock * > &MergeBlocks, Loop *L=nullptr, DomTreeUpdater *DTU=nullptr, LoopInfo *LI=nullptr)
Merge block(s) sucessors, if possible.
LLVM_ABI void SplitBlockAndInsertIfThenElse(Value *Cond, BasicBlock::iterator SplitBefore, Instruction **ThenTerm, Instruction **ElseTerm, MDNode *BranchWeights=nullptr, DomTreeUpdater *DTU=nullptr, LoopInfo *LI=nullptr)
SplitBlockAndInsertIfThenElse is similar to SplitBlockAndInsertIfThen, but also creates the ElseBlock...
LLVM_ABI BasicBlock * ehAwareSplitEdge(BasicBlock *BB, BasicBlock *Succ, LandingPadInst *OriginalPad=nullptr, PHINode *LandingPadReplacement=nullptr, const CriticalEdgeSplittingOptions &Options=CriticalEdgeSplittingOptions(), const Twine &BBName="")
Split the edge connect the specficed blocks in the case that Succ is an Exception Handling Block.
LLVM_ABI void SplitLandingPadPredecessors(BasicBlock *OrigBB, ArrayRef< BasicBlock * > Preds, const char *Suffix, const char *Suffix2, SmallVectorImpl< BasicBlock * > &NewBBs, DomTreeUpdater *DTU=nullptr, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, bool PreserveLCSSA=false)
This method transforms the landing pad, OrigBB, by introducing two new basic blocks into the function...
LLVM_ABI BasicBlock * SplitBlockPredecessors(BasicBlock *BB, ArrayRef< BasicBlock * > Preds, const char *Suffix, DominatorTree *DT, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, bool PreserveLCSSA=false)
This method introduces at least one new basic block into the function and moves some of the predecess...
LLVM_ABI void createPHIsForSplitLoopExit(ArrayRef< BasicBlock * > Preds, BasicBlock *SplitBB, BasicBlock *DestBB)
When a loop exit edge is split, LCSSA form may require new PHIs in the new exit block.
LLVM_ABI bool MergeBlockIntoPredecessor(BasicBlock *BB, DomTreeUpdater *DTU=nullptr, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, MemoryDependenceResults *MemDep=nullptr, bool PredecessorWithTwoSuccessors=false, DominatorTree *DT=nullptr)
Attempts to merge a block into its predecessor, if possible.
LLVM_ABI BasicBlock * SplitCriticalEdge(Instruction *TI, unsigned SuccNum, const CriticalEdgeSplittingOptions &Options=CriticalEdgeSplittingOptions(), const Twine &BBName="")
If this edge is a critical edge, insert a new node to split the critical edge.
LLVM_ABI bool FoldSingleEntryPHINodes(BasicBlock *BB, MemoryDependenceResults *MemDep=nullptr)
We know that BB has one predecessor.
LLVM_ABI void updatePhiNodes(BasicBlock *DestBB, BasicBlock *OldPred, BasicBlock *NewPred, PHINode *Until=nullptr)
Replaces all uses of OldPred with the NewPred block in all PHINodes in a block.
LLVM_ABI BasicBlock * SplitBlock(BasicBlock *Old, BasicBlock::iterator SplitPt, DominatorTree *DT, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, const Twine &BBName="", bool Before=false)
Split the specified block at the specified instruction.
LLVM_ABI Instruction * SplitBlockAndInsertIfThen(Value *Cond, BasicBlock::iterator SplitBefore, bool Unreachable, MDNode *BranchWeights=nullptr, DomTreeUpdater *DTU=nullptr, LoopInfo *LI=nullptr, BasicBlock *ThenBlock=nullptr)
Split the containing block at the specified instruction - everything before SplitBefore stays in the ...
LLVM_ABI void DeleteDeadBlocks(ArrayRef< BasicBlock * > BBs, DomTreeUpdater *DTU=nullptr, bool KeepOneInputPHIs=false)
Delete the specified blocks from BB.
LLVM_ABI BasicBlock * SplitEdge(BasicBlock *From, BasicBlock *To, DominatorTree *DT=nullptr, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, const Twine &BBName="")
Split the edge connecting the specified blocks, and return the newly created basic block between From...
LLVM_ABI void setUnwindEdgeTo(Instruction *TI, BasicBlock *Succ)
Sets the unwind edge of an instruction to a particular successor.
LLVM_ABI void SplitBlockAndInsertForEachLane(ElementCount EC, Type *IndexTy, BasicBlock::iterator InsertBefore, std::function< void(IRBuilderBase &, Value *)> Func)
Utility function for performing a given action on each lane of a vector with EC elements.
Option class for critical edge splitting.
CriticalEdgeSplittingOptions(DominatorTree *DT=nullptr, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, PostDominatorTree *PDT=nullptr)
CriticalEdgeSplittingOptions & setMergeIdenticalEdges()
bool IgnoreUnreachableDests
CriticalEdgeSplittingOptions & setKeepOneInputPHIs()
bool PreserveLoopSimplify
SplitCriticalEdge is guaranteed to preserve loop-simplify form if LI is provided.
CriticalEdgeSplittingOptions & unsetPreserveLoopSimplify()
CriticalEdgeSplittingOptions & setPreserveLCSSA()
CriticalEdgeSplittingOptions & setIgnoreUnreachableDests()