LLVM API Documentation
00001 //===-- Transform/Utils/BasicBlockUtils.h - BasicBlock Utils ----*- C++ -*-===// 00002 // 00003 // The LLVM Compiler Infrastructure 00004 // 00005 // This file is distributed under the University of Illinois Open Source 00006 // License. See LICENSE.TXT for details. 00007 // 00008 //===----------------------------------------------------------------------===// 00009 // 00010 // This family of functions perform manipulations on basic blocks, and 00011 // instructions contained within basic blocks. 00012 // 00013 //===----------------------------------------------------------------------===// 00014 00015 #ifndef LLVM_TRANSFORMS_UTILS_BASICBLOCK_H 00016 #define LLVM_TRANSFORMS_UTILS_BASICBLOCK_H 00017 00018 // FIXME: Move to this file: BasicBlock::removePredecessor, BB::splitBasicBlock 00019 00020 #include "llvm/BasicBlock.h" 00021 #include "llvm/Support/CFG.h" 00022 00023 namespace llvm { 00024 00025 class Instruction; 00026 class Pass; 00027 class AliasAnalysis; 00028 00029 /// DeleteDeadBlock - Delete the specified block, which must have no 00030 /// predecessors. 00031 void DeleteDeadBlock(BasicBlock *BB); 00032 00033 00034 /// FoldSingleEntryPHINodes - We know that BB has one predecessor. If there are 00035 /// any single-entry PHI nodes in it, fold them away. This handles the case 00036 /// when all entries to the PHI nodes in a block are guaranteed equal, such as 00037 /// when the block has exactly one predecessor. 00038 void FoldSingleEntryPHINodes(BasicBlock *BB); 00039 00040 00041 /// MergeBlockIntoPredecessor - Attempts to merge a block into its predecessor, 00042 /// if possible. The return value indicates success or failure. 00043 bool MergeBlockIntoPredecessor(BasicBlock* BB, Pass* P = 0); 00044 00045 // ReplaceInstWithValue - Replace all uses of an instruction (specified by BI) 00046 // with a value, then remove and delete the original instruction. 00047 // 00048 void ReplaceInstWithValue(BasicBlock::InstListType &BIL, 00049 BasicBlock::iterator &BI, Value *V); 00050 00051 // ReplaceInstWithInst - Replace the instruction specified by BI with the 00052 // instruction specified by I. The original instruction is deleted and BI is 00053 // updated to point to the new instruction. 00054 // 00055 void ReplaceInstWithInst(BasicBlock::InstListType &BIL, 00056 BasicBlock::iterator &BI, Instruction *I); 00057 00058 // ReplaceInstWithInst - Replace the instruction specified by From with the 00059 // instruction specified by To. 00060 // 00061 void ReplaceInstWithInst(Instruction *From, Instruction *To); 00062 00063 /// FindAvailableLoadedValue - Scan the ScanBB block backwards (starting at the 00064 /// instruction before ScanFrom) checking to see if we have the value at the 00065 /// memory address *Ptr locally available within a small number of instructions. 00066 /// If the value is available, return it. 00067 /// 00068 /// If not, return the iterator for the last validated instruction that the 00069 /// value would be live through. If we scanned the entire block and didn't find 00070 /// something that invalidates *Ptr or provides it, ScanFrom would be left at 00071 /// begin() and this returns null. ScanFrom could also be left 00072 /// 00073 /// MaxInstsToScan specifies the maximum instructions to scan in the block. If 00074 /// it is set to 0, it will scan the whole block. You can also optionally 00075 /// specify an alias analysis implementation, which makes this more precise. 00076 Value *FindAvailableLoadedValue(Value *Ptr, BasicBlock *ScanBB, 00077 BasicBlock::iterator &ScanFrom, 00078 unsigned MaxInstsToScan = 6, 00079 AliasAnalysis *AA = 0); 00080 00081 00082 00083 // RemoveSuccessor - Change the specified terminator instruction such that its 00084 // successor #SuccNum no longer exists. Because this reduces the outgoing 00085 // degree of the current basic block, the actual terminator instruction itself 00086 // may have to be changed. In the case where the last successor of the block is 00087 // deleted, a return instruction is inserted in its place which can cause a 00088 // suprising change in program behavior if it is not expected. 00089 // 00090 void RemoveSuccessor(TerminatorInst *TI, unsigned SuccNum); 00091 00092 /// isCriticalEdge - Return true if the specified edge is a critical edge. 00093 /// Critical edges are edges from a block with multiple successors to a block 00094 /// with multiple predecessors. 00095 /// 00096 bool isCriticalEdge(const TerminatorInst *TI, unsigned SuccNum, 00097 bool AllowIdenticalEdges = false); 00098 00099 /// SplitCriticalEdge - If this edge is a critical edge, insert a new node to 00100 /// split the critical edge. This will update DominatorTree and 00101 /// DominatorFrontier information if it is available, thus calling this pass 00102 /// will not invalidate either of them. This returns true if the edge was split, 00103 /// false otherwise. 00104 /// 00105 /// If MergeIdenticalEdges is true (not the default), *all* edges from TI to the 00106 /// specified successor will be merged into the same critical edge block. 00107 /// This is most commonly interesting with switch instructions, which may 00108 /// have many edges to any one destination. This ensures that all edges to that 00109 /// dest go to one block instead of each going to a different block, but isn't 00110 /// the standard definition of a "critical edge". 00111 /// 00112 bool SplitCriticalEdge(TerminatorInst *TI, unsigned SuccNum, Pass *P = 0, 00113 bool MergeIdenticalEdges = false); 00114 00115 inline bool SplitCriticalEdge(BasicBlock *BB, succ_iterator SI, Pass *P = 0) { 00116 return SplitCriticalEdge(BB->getTerminator(), SI.getSuccessorIndex(), P); 00117 } 00118 00119 /// SplitCriticalEdge - If the edge from *PI to BB is not critical, return 00120 /// false. Otherwise, split all edges between the two blocks and return true. 00121 /// This updates all of the same analyses as the other SplitCriticalEdge 00122 /// function. If P is specified, it updates the analyses 00123 /// described above. 00124 inline bool SplitCriticalEdge(BasicBlock *Succ, pred_iterator PI, Pass *P = 0) { 00125 bool MadeChange = false; 00126 TerminatorInst *TI = (*PI)->getTerminator(); 00127 for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i) 00128 if (TI->getSuccessor(i) == Succ) 00129 MadeChange |= SplitCriticalEdge(TI, i, P); 00130 return MadeChange; 00131 } 00132 00133 /// SplitCriticalEdge - If an edge from Src to Dst is critical, split the edge 00134 /// and return true, otherwise return false. This method requires that there be 00135 /// an edge between the two blocks. If P is specified, it updates the analyses 00136 /// described above. 00137 inline bool SplitCriticalEdge(BasicBlock *Src, BasicBlock *Dst, Pass *P = 0, 00138 bool MergeIdenticalEdges = false) { 00139 TerminatorInst *TI = Src->getTerminator(); 00140 unsigned i = 0; 00141 while (1) { 00142 assert(i != TI->getNumSuccessors() && "Edge doesn't exist!"); 00143 if (TI->getSuccessor(i) == Dst) 00144 return SplitCriticalEdge(TI, i, P, MergeIdenticalEdges); 00145 ++i; 00146 } 00147 } 00148 00149 /// SplitEdge - Split the edge connecting specified block. Pass P must 00150 /// not be NULL. 00151 BasicBlock *SplitEdge(BasicBlock *From, BasicBlock *To, Pass *P); 00152 00153 /// SplitBlock - Split the specified block at the specified instruction - every 00154 /// thing before SplitPt stays in Old and everything starting with SplitPt moves 00155 /// to a new block. The two blocks are joined by an unconditional branch and 00156 /// the loop info is updated. 00157 /// 00158 BasicBlock *SplitBlock(BasicBlock *Old, Instruction *SplitPt, Pass *P); 00159 00160 /// SplitBlockPredecessors - This method transforms BB by introducing a new 00161 /// basic block into the function, and moving some of the predecessors of BB to 00162 /// be predecessors of the new block. The new predecessors are indicated by the 00163 /// Preds array, which has NumPreds elements in it. The new block is given a 00164 /// suffix of 'Suffix'. This function returns the new block. 00165 /// 00166 /// This currently updates the LLVM IR, AliasAnalysis, DominatorTree and 00167 /// DominanceFrontier, but no other analyses. 00168 BasicBlock *SplitBlockPredecessors(BasicBlock *BB, BasicBlock *const *Preds, 00169 unsigned NumPreds, const char *Suffix, 00170 Pass *P = 0); 00171 00172 } // End llvm namespace 00173 00174 #endif