Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===- Transform/Utils/BasicBlockUtils.h - BasicBlock Utils -----*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This family of functions perform manipulations on basic blocks, and
  10. // instructions contained within basic blocks.
  11. //
  12. //===----------------------------------------------------------------------===//
  13.  
  14. #ifndef LLVM_TRANSFORMS_UTILS_BASICBLOCKUTILS_H
  15. #define LLVM_TRANSFORMS_UTILS_BASICBLOCKUTILS_H
  16.  
  17. // FIXME: Move to this file: BasicBlock::removePredecessor, BB::splitBasicBlock
  18.  
  19. #include "llvm/ADT/ArrayRef.h"
  20. #include "llvm/ADT/SetVector.h"
  21. #include "llvm/IR/BasicBlock.h"
  22. #include "llvm/IR/Dominators.h"
  23. #include <cassert>
  24.  
  25. namespace llvm {
  26. class BranchInst;
  27. class LandingPadInst;
  28. class Loop;
  29. class PHINode;
  30. template <typename PtrType> class SmallPtrSetImpl;
  31. class BlockFrequencyInfo;
  32. class BranchProbabilityInfo;
  33. class DomTreeUpdater;
  34. class Function;
  35. class LoopInfo;
  36. class MDNode;
  37. class MemoryDependenceResults;
  38. class MemorySSAUpdater;
  39. class PostDominatorTree;
  40. class ReturnInst;
  41. class TargetLibraryInfo;
  42. class Value;
  43.  
  44. /// Replace contents of every block in \p BBs with single unreachable
  45. /// instruction. If \p Updates is specified, collect all necessary DT updates
  46. /// into this vector. If \p KeepOneInputPHIs is true, one-input Phis in
  47. /// successors of blocks being deleted will be preserved.
  48. void detachDeadBlocks(ArrayRef <BasicBlock *> BBs,
  49.                       SmallVectorImpl<DominatorTree::UpdateType> *Updates,
  50.                       bool KeepOneInputPHIs = false);
  51.  
  52. /// Delete the specified block, which must have no predecessors.
  53. void DeleteDeadBlock(BasicBlock *BB, DomTreeUpdater *DTU = nullptr,
  54.                      bool KeepOneInputPHIs = false);
  55.  
  56. /// Delete the specified blocks from \p BB. The set of deleted blocks must have
  57. /// no predecessors that are not being deleted themselves. \p BBs must have no
  58. /// duplicating blocks. If there are loops among this set of blocks, all
  59. /// relevant loop info updates should be done before this function is called.
  60. /// If \p KeepOneInputPHIs is true, one-input Phis in successors of blocks
  61. /// being deleted will be preserved.
  62. void DeleteDeadBlocks(ArrayRef <BasicBlock *> BBs,
  63.                       DomTreeUpdater *DTU = nullptr,
  64.                       bool KeepOneInputPHIs = false);
  65.  
  66. /// Delete all basic blocks from \p F that are not reachable from its entry
  67. /// node. If \p KeepOneInputPHIs is true, one-input Phis in successors of
  68. /// blocks being deleted will be preserved.
  69. bool EliminateUnreachableBlocks(Function &F, DomTreeUpdater *DTU = nullptr,
  70.                                 bool KeepOneInputPHIs = false);
  71.  
  72. /// We know that BB has one predecessor. If there are any single-entry PHI nodes
  73. /// in it, fold them away. This handles the case when all entries to the PHI
  74. /// nodes in a block are guaranteed equal, such as when the block has exactly
  75. /// one predecessor.
  76. bool FoldSingleEntryPHINodes(BasicBlock *BB,
  77.                              MemoryDependenceResults *MemDep = nullptr);
  78.  
  79. /// Examine each PHI in the given block and delete it if it is dead. Also
  80. /// recursively delete any operands that become dead as a result. This includes
  81. /// tracing the def-use list from the PHI to see if it is ultimately unused or
  82. /// if it reaches an unused cycle. Return true if any PHIs were deleted.
  83. bool DeleteDeadPHIs(BasicBlock *BB, const TargetLibraryInfo *TLI = nullptr,
  84.                     MemorySSAUpdater *MSSAU = nullptr);
  85.  
  86. /// Attempts to merge a block into its predecessor, if possible. The return
  87. /// value indicates success or failure.
  88. /// By default do not merge blocks if BB's predecessor has multiple successors.
  89. /// If PredecessorWithTwoSuccessors = true, the blocks can only be merged
  90. /// if BB's Pred has a branch to BB and to AnotherBB, and BB has a single
  91. /// successor Sing. In this case the branch will be updated with Sing instead of
  92. /// BB, and BB will still be merged into its predecessor and removed.
  93. /// If \p DT is not nullptr, update it directly; in that case, DTU must be
  94. /// nullptr.
  95. bool MergeBlockIntoPredecessor(BasicBlock *BB, DomTreeUpdater *DTU = nullptr,
  96.                                LoopInfo *LI = nullptr,
  97.                                MemorySSAUpdater *MSSAU = nullptr,
  98.                                MemoryDependenceResults *MemDep = nullptr,
  99.                                bool PredecessorWithTwoSuccessors = false,
  100.                                DominatorTree *DT = nullptr);
  101.  
  102. /// Merge block(s) sucessors, if possible. Return true if at least two
  103. /// of the blocks were merged together.
  104. /// In order to merge, each block must be terminated by an unconditional
  105. /// branch. If L is provided, then the blocks merged into their predecessors
  106. /// must be in L. In addition, This utility calls on another utility:
  107. /// MergeBlockIntoPredecessor. Blocks are successfully merged when the call to
  108. /// MergeBlockIntoPredecessor returns true.
  109. bool MergeBlockSuccessorsIntoGivenBlocks(
  110.     SmallPtrSetImpl<BasicBlock *> &MergeBlocks, Loop *L = nullptr,
  111.     DomTreeUpdater *DTU = nullptr, LoopInfo *LI = nullptr);
  112.  
  113. /// Try to remove redundant dbg.value instructions from given basic block.
  114. /// Returns true if at least one instruction was removed. Remove redundant
  115. /// pseudo ops when RemovePseudoOp is true.
  116. bool RemoveRedundantDbgInstrs(BasicBlock *BB);
  117.  
  118. /// Replace all uses of an instruction (specified by BI) with a value, then
  119. /// remove and delete the original instruction.
  120. void ReplaceInstWithValue(BasicBlock::iterator &BI, Value *V);
  121.  
  122. /// Replace the instruction specified by BI with the instruction specified by I.
  123. /// Copies DebugLoc from BI to I, if I doesn't already have a DebugLoc. The
  124. /// original instruction is deleted and BI is updated to point to the new
  125. /// instruction.
  126. void ReplaceInstWithInst(BasicBlock *BB, BasicBlock::iterator &BI,
  127.                          Instruction *I);
  128.  
  129. /// Replace the instruction specified by From with the instruction specified by
  130. /// To. Copies DebugLoc from BI to I, if I doesn't already have a DebugLoc.
  131. void ReplaceInstWithInst(Instruction *From, Instruction *To);
  132.  
  133. /// Check if we can prove that all paths starting from this block converge
  134. /// to a block that either has a @llvm.experimental.deoptimize call
  135. /// prior to its terminating return instruction or is terminated by unreachable.
  136. /// All blocks in the traversed sequence must have an unique successor, maybe
  137. /// except for the last one.
  138. bool IsBlockFollowedByDeoptOrUnreachable(const BasicBlock *BB);
  139.  
  140. /// Option class for critical edge splitting.
  141. ///
  142. /// This provides a builder interface for overriding the default options used
  143. /// during critical edge splitting.
  144. struct CriticalEdgeSplittingOptions {
  145.   DominatorTree *DT;
  146.   PostDominatorTree *PDT;
  147.   LoopInfo *LI;
  148.   MemorySSAUpdater *MSSAU;
  149.   bool MergeIdenticalEdges = false;
  150.   bool KeepOneInputPHIs = false;
  151.   bool PreserveLCSSA = false;
  152.   bool IgnoreUnreachableDests = false;
  153.   /// SplitCriticalEdge is guaranteed to preserve loop-simplify form if LI is
  154.   /// provided. If it cannot be preserved, no splitting will take place. If it
  155.   /// is not set, preserve loop-simplify form if possible.
  156.   bool PreserveLoopSimplify = true;
  157.  
  158.   CriticalEdgeSplittingOptions(DominatorTree *DT = nullptr,
  159.                                LoopInfo *LI = nullptr,
  160.                                MemorySSAUpdater *MSSAU = nullptr,
  161.                                PostDominatorTree *PDT = nullptr)
  162.       : DT(DT), PDT(PDT), LI(LI), MSSAU(MSSAU) {}
  163.  
  164.   CriticalEdgeSplittingOptions &setMergeIdenticalEdges() {
  165.     MergeIdenticalEdges = true;
  166.     return *this;
  167.   }
  168.  
  169.   CriticalEdgeSplittingOptions &setKeepOneInputPHIs() {
  170.     KeepOneInputPHIs = true;
  171.     return *this;
  172.   }
  173.  
  174.   CriticalEdgeSplittingOptions &setPreserveLCSSA() {
  175.     PreserveLCSSA = true;
  176.     return *this;
  177.   }
  178.  
  179.   CriticalEdgeSplittingOptions &setIgnoreUnreachableDests() {
  180.     IgnoreUnreachableDests = true;
  181.     return *this;
  182.   }
  183.  
  184.   CriticalEdgeSplittingOptions &unsetPreserveLoopSimplify() {
  185.     PreserveLoopSimplify = false;
  186.     return *this;
  187.   }
  188. };
  189.  
  190. /// When a loop exit edge is split, LCSSA form may require new PHIs in the new
  191. /// exit block. This function inserts the new PHIs, as needed. Preds is a list
  192. /// of preds inside the loop, SplitBB is the new loop exit block, and DestBB is
  193. /// the old loop exit, now the successor of SplitBB.
  194. void createPHIsForSplitLoopExit(ArrayRef<BasicBlock *> Preds,
  195.                                 BasicBlock *SplitBB, BasicBlock *DestBB);
  196.  
  197. /// If this edge is a critical edge, insert a new node to split the critical
  198. /// edge. This will update the analyses passed in through the option struct.
  199. /// This returns the new block if the edge was split, null otherwise.
  200. ///
  201. /// If MergeIdenticalEdges in the options struct is true (not the default),
  202. /// *all* edges from TI to the specified successor will be merged into the same
  203. /// critical edge block. This is most commonly interesting with switch
  204. /// instructions, which may have many edges to any one destination.  This
  205. /// ensures that all edges to that dest go to one block instead of each going
  206. /// to a different block, but isn't the standard definition of a "critical
  207. /// edge".
  208. ///
  209. /// It is invalid to call this function on a critical edge that starts at an
  210. /// IndirectBrInst.  Splitting these edges will almost always create an invalid
  211. /// program because the address of the new block won't be the one that is jumped
  212. /// to.
  213. BasicBlock *SplitCriticalEdge(Instruction *TI, unsigned SuccNum,
  214.                               const CriticalEdgeSplittingOptions &Options =
  215.                                   CriticalEdgeSplittingOptions(),
  216.                               const Twine &BBName = "");
  217.  
  218. /// If it is known that an edge is critical, SplitKnownCriticalEdge can be
  219. /// called directly, rather than calling SplitCriticalEdge first.
  220. BasicBlock *SplitKnownCriticalEdge(Instruction *TI, unsigned SuccNum,
  221.                                    const CriticalEdgeSplittingOptions &Options =
  222.                                        CriticalEdgeSplittingOptions(),
  223.                                    const Twine &BBName = "");
  224.  
  225. /// If an edge from Src to Dst is critical, split the edge and return true,
  226. /// otherwise return false. This method requires that there be an edge between
  227. /// the two blocks. It updates the analyses passed in the options struct
  228. inline BasicBlock *
  229. SplitCriticalEdge(BasicBlock *Src, BasicBlock *Dst,
  230.                   const CriticalEdgeSplittingOptions &Options =
  231.                       CriticalEdgeSplittingOptions()) {
  232.   Instruction *TI = Src->getTerminator();
  233.   unsigned i = 0;
  234.   while (true) {
  235.     assert(i != TI->getNumSuccessors() && "Edge doesn't exist!");
  236.     if (TI->getSuccessor(i) == Dst)
  237.       return SplitCriticalEdge(TI, i, Options);
  238.     ++i;
  239.   }
  240. }
  241.  
  242. /// Loop over all of the edges in the CFG, breaking critical edges as they are
  243. /// found. Returns the number of broken edges.
  244. unsigned SplitAllCriticalEdges(Function &F,
  245.                                const CriticalEdgeSplittingOptions &Options =
  246.                                    CriticalEdgeSplittingOptions());
  247.  
  248. /// Split the edge connecting the specified blocks, and return the newly created
  249. /// basic block between \p From and \p To.
  250. BasicBlock *SplitEdge(BasicBlock *From, BasicBlock *To,
  251.                       DominatorTree *DT = nullptr, LoopInfo *LI = nullptr,
  252.                       MemorySSAUpdater *MSSAU = nullptr,
  253.                       const Twine &BBName = "");
  254.  
  255. /// Sets the unwind edge of an instruction to a particular successor.
  256. void setUnwindEdgeTo(Instruction *TI, BasicBlock *Succ);
  257.  
  258. /// Replaces all uses of OldPred with the NewPred block in all PHINodes in a
  259. /// block.
  260. void updatePhiNodes(BasicBlock *DestBB, BasicBlock *OldPred,
  261.                     BasicBlock *NewPred, PHINode *Until = nullptr);
  262.  
  263. /// Split the edge connect the specficed blocks in the case that \p Succ is an
  264. /// Exception Handling Block
  265. BasicBlock *ehAwareSplitEdge(BasicBlock *BB, BasicBlock *Succ,
  266.                              LandingPadInst *OriginalPad = nullptr,
  267.                              PHINode *LandingPadReplacement = nullptr,
  268.                              const CriticalEdgeSplittingOptions &Options =
  269.                                  CriticalEdgeSplittingOptions(),
  270.                              const Twine &BBName = "");
  271.  
  272. /// Split the specified block at the specified instruction.
  273. ///
  274. /// If \p Before is true, splitBlockBefore handles the block
  275. /// splitting. Otherwise, execution proceeds as described below.
  276. ///
  277. /// Everything before \p SplitPt stays in \p Old and everything starting with \p
  278. /// SplitPt moves to a new block. The two blocks are joined by an unconditional
  279. /// branch. The new block with name \p BBName is returned.
  280. ///
  281. /// FIXME: deprecated, switch to the DomTreeUpdater-based one.
  282. BasicBlock *SplitBlock(BasicBlock *Old, Instruction *SplitPt, DominatorTree *DT,
  283.                        LoopInfo *LI = nullptr,
  284.                        MemorySSAUpdater *MSSAU = nullptr,
  285.                        const Twine &BBName = "", bool Before = false);
  286.  
  287. /// Split the specified block at the specified instruction.
  288. ///
  289. /// If \p Before is true, splitBlockBefore handles the block
  290. /// splitting. Otherwise, execution proceeds as described below.
  291. ///
  292. /// Everything before \p SplitPt stays in \p Old and everything starting with \p
  293. /// SplitPt moves to a new block. The two blocks are joined by an unconditional
  294. /// branch. The new block with name \p BBName is returned.
  295. BasicBlock *SplitBlock(BasicBlock *Old, Instruction *SplitPt,
  296.                        DomTreeUpdater *DTU = nullptr, LoopInfo *LI = nullptr,
  297.                        MemorySSAUpdater *MSSAU = nullptr,
  298.                        const Twine &BBName = "", bool Before = false);
  299.  
  300. /// Split the specified block at the specified instruction \p SplitPt.
  301. /// All instructions before \p SplitPt are moved to a new block and all
  302. /// instructions after \p SplitPt stay in the old block. The new block and the
  303. /// old block are joined by inserting an unconditional branch to the end of the
  304. /// new block. The new block with name \p BBName is returned.
  305. BasicBlock *splitBlockBefore(BasicBlock *Old, Instruction *SplitPt,
  306.                              DomTreeUpdater *DTU, LoopInfo *LI,
  307.                              MemorySSAUpdater *MSSAU, const Twine &BBName = "");
  308.  
  309. /// This method introduces at least one new basic block into the function and
  310. /// moves some of the predecessors of BB to be predecessors of the new block.
  311. /// The new predecessors are indicated by the Preds array. The new block is
  312. /// given a suffix of 'Suffix'. Returns new basic block to which predecessors
  313. /// from Preds are now pointing.
  314. ///
  315. /// If BB is a landingpad block then additional basicblock might be introduced.
  316. /// It will have Suffix+".split_lp". See SplitLandingPadPredecessors for more
  317. /// details on this case.
  318. ///
  319. /// This currently updates the LLVM IR, DominatorTree, LoopInfo, and LCCSA but
  320. /// no other analyses. In particular, it does not preserve LoopSimplify
  321. /// (because it's complicated to handle the case where one of the edges being
  322. /// split is an exit of a loop with other exits).
  323. ///
  324. /// FIXME: deprecated, switch to the DomTreeUpdater-based one.
  325. BasicBlock *SplitBlockPredecessors(BasicBlock *BB, ArrayRef<BasicBlock *> Preds,
  326.                                    const char *Suffix, DominatorTree *DT,
  327.                                    LoopInfo *LI = nullptr,
  328.                                    MemorySSAUpdater *MSSAU = nullptr,
  329.                                    bool PreserveLCSSA = false);
  330.  
  331. /// This method introduces at least one new basic block into the function and
  332. /// moves some of the predecessors of BB to be predecessors of the new block.
  333. /// The new predecessors are indicated by the Preds array. The new block is
  334. /// given a suffix of 'Suffix'. Returns new basic block to which predecessors
  335. /// from Preds are now pointing.
  336. ///
  337. /// If BB is a landingpad block then additional basicblock might be introduced.
  338. /// It will have Suffix+".split_lp". See SplitLandingPadPredecessors for more
  339. /// details on this case.
  340. ///
  341. /// This currently updates the LLVM IR, DominatorTree, LoopInfo, and LCCSA but
  342. /// no other analyses. In particular, it does not preserve LoopSimplify
  343. /// (because it's complicated to handle the case where one of the edges being
  344. /// split is an exit of a loop with other exits).
  345. BasicBlock *SplitBlockPredecessors(BasicBlock *BB, ArrayRef<BasicBlock *> Preds,
  346.                                    const char *Suffix,
  347.                                    DomTreeUpdater *DTU = nullptr,
  348.                                    LoopInfo *LI = nullptr,
  349.                                    MemorySSAUpdater *MSSAU = nullptr,
  350.                                    bool PreserveLCSSA = false);
  351.  
  352. /// This method transforms the landing pad, OrigBB, by introducing two new basic
  353. /// blocks into the function. One of those new basic blocks gets the
  354. /// predecessors listed in Preds. The other basic block gets the remaining
  355. /// predecessors of OrigBB. The landingpad instruction OrigBB is clone into both
  356. /// of the new basic blocks. The new blocks are given the suffixes 'Suffix1' and
  357. /// 'Suffix2', and are returned in the NewBBs vector.
  358. ///
  359. /// This currently updates the LLVM IR, DominatorTree, LoopInfo, and LCCSA but
  360. /// no other analyses. In particular, it does not preserve LoopSimplify
  361. /// (because it's complicated to handle the case where one of the edges being
  362. /// split is an exit of a loop with other exits).
  363. ///
  364. /// FIXME: deprecated, switch to the DomTreeUpdater-based one.
  365. void SplitLandingPadPredecessors(BasicBlock *OrigBB,
  366.                                  ArrayRef<BasicBlock *> Preds,
  367.                                  const char *Suffix, const char *Suffix2,
  368.                                  SmallVectorImpl<BasicBlock *> &NewBBs,
  369.                                  DominatorTree *DT, LoopInfo *LI = nullptr,
  370.                                  MemorySSAUpdater *MSSAU = nullptr,
  371.                                  bool PreserveLCSSA = false);
  372.  
  373. /// This method transforms the landing pad, OrigBB, by introducing two new basic
  374. /// blocks into the function. One of those new basic blocks gets the
  375. /// predecessors listed in Preds. The other basic block gets the remaining
  376. /// predecessors of OrigBB. The landingpad instruction OrigBB is clone into both
  377. /// of the new basic blocks. The new blocks are given the suffixes 'Suffix1' and
  378. /// 'Suffix2', and are returned in the NewBBs vector.
  379. ///
  380. /// This currently updates the LLVM IR, DominatorTree, LoopInfo, and LCCSA but
  381. /// no other analyses. In particular, it does not preserve LoopSimplify
  382. /// (because it's complicated to handle the case where one of the edges being
  383. /// split is an exit of a loop with other exits).
  384. void SplitLandingPadPredecessors(
  385.     BasicBlock *OrigBB, ArrayRef<BasicBlock *> Preds, const char *Suffix,
  386.     const char *Suffix2, SmallVectorImpl<BasicBlock *> &NewBBs,
  387.     DomTreeUpdater *DTU = nullptr, LoopInfo *LI = nullptr,
  388.     MemorySSAUpdater *MSSAU = nullptr, bool PreserveLCSSA = false);
  389.  
  390. /// This method duplicates the specified return instruction into a predecessor
  391. /// which ends in an unconditional branch. If the return instruction returns a
  392. /// value defined by a PHI, propagate the right value into the return. It
  393. /// returns the new return instruction in the predecessor.
  394. ReturnInst *FoldReturnIntoUncondBranch(ReturnInst *RI, BasicBlock *BB,
  395.                                        BasicBlock *Pred,
  396.                                        DomTreeUpdater *DTU = nullptr);
  397.  
  398. /// Split the containing block at the specified instruction - everything before
  399. /// SplitBefore stays in the old basic block, and the rest of the instructions
  400. /// in the BB are moved to a new block. The two blocks are connected by a
  401. /// conditional branch (with value of Cmp being the condition).
  402. /// Before:
  403. ///   Head
  404. ///   SplitBefore
  405. ///   Tail
  406. /// After:
  407. ///   Head
  408. ///   if (Cond)
  409. ///     ThenBlock
  410. ///   SplitBefore
  411. ///   Tail
  412. ///
  413. /// If \p ThenBlock is not specified, a new block will be created for it.
  414. /// If \p Unreachable is true, the newly created block will end with
  415. /// UnreachableInst, otherwise it branches to Tail.
  416. /// Returns the NewBasicBlock's terminator.
  417. ///
  418. /// Updates DT and LI if given.
  419. ///
  420. /// FIXME: deprecated, switch to the DomTreeUpdater-based one.
  421. Instruction *SplitBlockAndInsertIfThen(Value *Cond, Instruction *SplitBefore,
  422.                                        bool Unreachable, MDNode *BranchWeights,
  423.                                        DominatorTree *DT,
  424.                                        LoopInfo *LI = nullptr,
  425.                                        BasicBlock *ThenBlock = nullptr);
  426.  
  427. /// Split the containing block at the specified instruction - everything before
  428. /// SplitBefore stays in the old basic block, and the rest of the instructions
  429. /// in the BB are moved to a new block. The two blocks are connected by a
  430. /// conditional branch (with value of Cmp being the condition).
  431. /// Before:
  432. ///   Head
  433. ///   SplitBefore
  434. ///   Tail
  435. /// After:
  436. ///   Head
  437. ///   if (Cond)
  438. ///     ThenBlock
  439. ///   SplitBefore
  440. ///   Tail
  441. ///
  442. /// If \p ThenBlock is not specified, a new block will be created for it.
  443. /// If \p Unreachable is true, the newly created block will end with
  444. /// UnreachableInst, otherwise it branches to Tail.
  445. /// Returns the NewBasicBlock's terminator.
  446. ///
  447. /// Updates DT and LI if given.
  448. Instruction *SplitBlockAndInsertIfThen(Value *Cond, Instruction *SplitBefore,
  449.                                        bool Unreachable,
  450.                                        MDNode *BranchWeights = nullptr,
  451.                                        DomTreeUpdater *DTU = nullptr,
  452.                                        LoopInfo *LI = nullptr,
  453.                                        BasicBlock *ThenBlock = nullptr);
  454.  
  455. /// SplitBlockAndInsertIfThenElse is similar to SplitBlockAndInsertIfThen,
  456. /// but also creates the ElseBlock.
  457. /// Before:
  458. ///   Head
  459. ///   SplitBefore
  460. ///   Tail
  461. /// After:
  462. ///   Head
  463. ///   if (Cond)
  464. ///     ThenBlock
  465. ///   else
  466. ///     ElseBlock
  467. ///   SplitBefore
  468. ///   Tail
  469. ///
  470. /// Updates DT if given.
  471. void SplitBlockAndInsertIfThenElse(Value *Cond, Instruction *SplitBefore,
  472.                                    Instruction **ThenTerm,
  473.                                    Instruction **ElseTerm,
  474.                                    MDNode *BranchWeights = nullptr,
  475.                                    DomTreeUpdater *DTU = nullptr);
  476.  
  477. /// Check whether BB is the merge point of a if-region.
  478. /// If so, return the branch instruction that determines which entry into
  479. /// BB will be taken.  Also, return by references the block that will be
  480. /// entered from if the condition is true, and the block that will be
  481. /// entered if the condition is false.
  482. ///
  483. /// This does no checking to see if the true/false blocks have large or unsavory
  484. /// instructions in them.
  485. BranchInst *GetIfCondition(BasicBlock *BB, BasicBlock *&IfTrue,
  486.                            BasicBlock *&IfFalse);
  487.  
  488. // Split critical edges where the source of the edge is an indirectbr
  489. // instruction. This isn't always possible, but we can handle some easy cases.
  490. // This is useful because MI is unable to split such critical edges,
  491. // which means it will not be able to sink instructions along those edges.
  492. // This is especially painful for indirect branches with many successors, where
  493. // we end up having to prepare all outgoing values in the origin block.
  494. //
  495. // Our normal algorithm for splitting critical edges requires us to update
  496. // the outgoing edges of the edge origin block, but for an indirectbr this
  497. // is hard, since it would require finding and updating the block addresses
  498. // the indirect branch uses. But if a block only has a single indirectbr
  499. // predecessor, with the others being regular branches, we can do it in a
  500. // different way.
  501. // Say we have A -> D, B -> D, I -> D where only I -> D is an indirectbr.
  502. // We can split D into D0 and D1, where D0 contains only the PHIs from D,
  503. // and D1 is the D block body. We can then duplicate D0 as D0A and D0B, and
  504. // create the following structure:
  505. // A -> D0A, B -> D0A, I -> D0B, D0A -> D1, D0B -> D1
  506. // If BPI and BFI aren't non-null, BPI/BFI will be updated accordingly.
  507. // When `IgnoreBlocksWithoutPHI` is set to `true` critical edges leading to a
  508. // block without phi-instructions will not be split.
  509. bool SplitIndirectBrCriticalEdges(Function &F, bool IgnoreBlocksWithoutPHI,
  510.                                   BranchProbabilityInfo *BPI = nullptr,
  511.                                   BlockFrequencyInfo *BFI = nullptr);
  512.  
  513. /// Given a set of incoming and outgoing blocks, create a "hub" such that every
  514. /// edge from an incoming block InBB to an outgoing block OutBB is now split
  515. /// into two edges, one from InBB to the hub and another from the hub to
  516. /// OutBB. The hub consists of a series of guard blocks, one for each outgoing
  517. /// block. Each guard block conditionally branches to the corresponding outgoing
  518. /// block, or the next guard block in the chain. These guard blocks are returned
  519. /// in the argument vector.
  520. ///
  521. /// Since the control flow edges from InBB to OutBB have now been replaced, the
  522. /// function also updates any PHINodes in OutBB. For each such PHINode, the
  523. /// operands corresponding to incoming blocks are moved to a new PHINode in the
  524. /// hub, and the hub is made an operand of the original PHINode.
  525. ///
  526. /// Input CFG:
  527. /// ----------
  528. ///
  529. ///                    Def
  530. ///                     |
  531. ///                     v
  532. ///           In1      In2
  533. ///            |        |
  534. ///            |        |
  535. ///            v        v
  536. ///  Foo ---> Out1     Out2
  537. ///                     |
  538. ///                     v
  539. ///                    Use
  540. ///
  541. ///
  542. /// Create hub: Incoming = {In1, In2}, Outgoing = {Out1, Out2}
  543. /// ----------------------------------------------------------
  544. ///
  545. ///             Def
  546. ///              |
  547. ///              v
  548. ///  In1        In2          Foo
  549. ///   |    Hub   |            |
  550. ///   |    + - - | - - +      |
  551. ///   |    '     v     '      V
  552. ///   +------> Guard1 -----> Out1
  553. ///        '     |     '
  554. ///        '     v     '
  555. ///        '   Guard2 -----> Out2
  556. ///        '           '      |
  557. ///        + - - - - - +      |
  558. ///                           v
  559. ///                          Use
  560. ///
  561. /// Limitations:
  562. /// -----------
  563. /// 1. This assumes that all terminators in the CFG are direct branches (the
  564. ///    "br" instruction). The presence of any other control flow such as
  565. ///    indirectbr, switch or callbr will cause an assert.
  566. ///
  567. /// 2. The updates to the PHINodes are not sufficient to restore SSA
  568. ///    form. Consider a definition Def, its use Use, incoming block In2 and
  569. ///    outgoing block Out2, such that:
  570. ///    a. In2 is reachable from D or contains D.
  571. ///    b. U is reachable from Out2 or is contained in Out2.
  572. ///    c. U is not a PHINode if U is contained in Out2.
  573. ///
  574. ///    Clearly, Def dominates Out2 since the program is valid SSA. But when the
  575. ///    hub is introduced, there is a new path through the hub along which Use is
  576. ///    reachable from entry without passing through Def, and SSA is no longer
  577. ///    valid. To fix this, we need to look at all the blocks post-dominated by
  578. ///    the hub on the one hand, and dominated by Out2 on the other. This is left
  579. ///    for the caller to accomplish, since each specific use of this function
  580. ///    may have additional information which simplifies this fixup. For example,
  581. ///    see restoreSSA() in the UnifyLoopExits pass.
  582. BasicBlock *CreateControlFlowHub(
  583.     DomTreeUpdater *DTU, SmallVectorImpl<BasicBlock *> &GuardBlocks,
  584.     const SetVector<BasicBlock *> &Predecessors,
  585.     const SetVector<BasicBlock *> &Successors, const StringRef Prefix,
  586.     std::optional<unsigned> MaxControlFlowBooleans = std::nullopt);
  587.  
  588. } // end namespace llvm
  589.  
  590. #endif // LLVM_TRANSFORMS_UTILS_BASICBLOCKUTILS_H
  591.