Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 14 | pmbaty | 1 | //===- Local.h - Functions to perform local transformations -----*- 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 various local transformations to the | ||
| 10 | // program. | ||
| 11 | // | ||
| 12 | //===----------------------------------------------------------------------===// | ||
| 13 | |||
| 14 | #ifndef LLVM_TRANSFORMS_UTILS_LOCAL_H | ||
| 15 | #define LLVM_TRANSFORMS_UTILS_LOCAL_H | ||
| 16 | |||
| 17 | #include "llvm/ADT/ArrayRef.h" | ||
| 18 | #include "llvm/IR/Dominators.h" | ||
| 19 | #include "llvm/Support/CommandLine.h" | ||
| 20 | #include "llvm/Transforms/Utils/SimplifyCFGOptions.h" | ||
| 21 | #include <cstdint> | ||
| 22 | |||
| 23 | namespace llvm { | ||
| 24 | |||
| 25 | class DataLayout; | ||
| 26 | class Value; | ||
| 27 | class WeakTrackingVH; | ||
| 28 | class WeakVH; | ||
| 29 | template <typename T> class SmallVectorImpl; | ||
| 30 | class AAResults; | ||
| 31 | class AllocaInst; | ||
| 32 | class AssumptionCache; | ||
| 33 | class BasicBlock; | ||
| 34 | class BranchInst; | ||
| 35 | class CallBase; | ||
| 36 | class CallInst; | ||
| 37 | class DbgVariableIntrinsic; | ||
| 38 | class DIBuilder; | ||
| 39 | class DomTreeUpdater; | ||
| 40 | class Function; | ||
| 41 | class Instruction; | ||
| 42 | class InvokeInst; | ||
| 43 | class LoadInst; | ||
| 44 | class MDNode; | ||
| 45 | class MemorySSAUpdater; | ||
| 46 | class PHINode; | ||
| 47 | class StoreInst; | ||
| 48 | class TargetLibraryInfo; | ||
| 49 | class TargetTransformInfo; | ||
| 50 | |||
| 51 | //===----------------------------------------------------------------------===// | ||
| 52 | //  Local constant propagation. | ||
| 53 | // | ||
| 54 | |||
| 55 | /// If a terminator instruction is predicated on a constant value, convert it | ||
| 56 | /// into an unconditional branch to the constant destination. | ||
| 57 | /// This is a nontrivial operation because the successors of this basic block | ||
| 58 | /// must have their PHI nodes updated. | ||
| 59 | /// Also calls RecursivelyDeleteTriviallyDeadInstructions() on any branch/switch | ||
| 60 | /// conditions and indirectbr addresses this might make dead if | ||
| 61 | /// DeleteDeadConditions is true. | ||
| 62 | bool ConstantFoldTerminator(BasicBlock *BB, bool DeleteDeadConditions = false, | ||
| 63 | const TargetLibraryInfo *TLI = nullptr, | ||
| 64 | DomTreeUpdater *DTU = nullptr); | ||
| 65 | |||
| 66 | //===----------------------------------------------------------------------===// | ||
| 67 | //  Local dead code elimination. | ||
| 68 | // | ||
| 69 | |||
| 70 | /// Return true if the result produced by the instruction is not used, and the | ||
| 71 | /// instruction will return. Certain side-effecting instructions are also | ||
| 72 | /// considered dead if there are no uses of the instruction. | ||
| 73 | bool isInstructionTriviallyDead(Instruction *I, | ||
| 74 | const TargetLibraryInfo *TLI = nullptr); | ||
| 75 | |||
| 76 | /// Return true if the result produced by the instruction would have no side | ||
| 77 | /// effects if it was not used. This is equivalent to checking whether | ||
| 78 | /// isInstructionTriviallyDead would be true if the use count was 0. | ||
| 79 | bool wouldInstructionBeTriviallyDead(Instruction *I, | ||
| 80 | const TargetLibraryInfo *TLI = nullptr); | ||
| 81 | |||
| 82 | /// Return true if the result produced by the instruction has no side effects on | ||
| 83 | /// any paths other than where it is used. This is less conservative than | ||
| 84 | /// wouldInstructionBeTriviallyDead which is based on the assumption | ||
| 85 | /// that the use count will be 0. An example usage of this API is for | ||
| 86 | /// identifying instructions that can be sunk down to use(s). | ||
| 87 | bool wouldInstructionBeTriviallyDeadOnUnusedPaths( | ||
| 88 | Instruction *I, const TargetLibraryInfo *TLI = nullptr); | ||
| 89 | |||
| 90 | /// If the specified value is a trivially dead instruction, delete it. | ||
| 91 | /// If that makes any of its operands trivially dead, delete them too, | ||
| 92 | /// recursively. Return true if any instructions were deleted. | ||
| 93 | bool RecursivelyDeleteTriviallyDeadInstructions( | ||
| 94 | Value *V, const TargetLibraryInfo *TLI = nullptr, | ||
| 95 | MemorySSAUpdater *MSSAU = nullptr, | ||
| 96 | std::function<void(Value *)> AboutToDeleteCallback = | ||
| 97 | std::function<void(Value *)>()); | ||
| 98 | |||
| 99 | /// Delete all of the instructions in `DeadInsts`, and all other instructions | ||
| 100 | /// that deleting these in turn causes to be trivially dead. | ||
| 101 | /// | ||
| 102 | /// The initial instructions in the provided vector must all have empty use | ||
| 103 | /// lists and satisfy `isInstructionTriviallyDead`. | ||
| 104 | /// | ||
| 105 | /// `DeadInsts` will be used as scratch storage for this routine and will be | ||
| 106 | /// empty afterward. | ||
| 107 | void RecursivelyDeleteTriviallyDeadInstructions( | ||
| 108 | SmallVectorImpl<WeakTrackingVH> &DeadInsts, | ||
| 109 | const TargetLibraryInfo *TLI = nullptr, MemorySSAUpdater *MSSAU = nullptr, | ||
| 110 | std::function<void(Value *)> AboutToDeleteCallback = | ||
| 111 | std::function<void(Value *)>()); | ||
| 112 | |||
| 113 | /// Same functionality as RecursivelyDeleteTriviallyDeadInstructions, but allow | ||
| 114 | /// instructions that are not trivially dead. These will be ignored. | ||
| 115 | /// Returns true if any changes were made, i.e. any instructions trivially dead | ||
| 116 | /// were found and deleted. | ||
| 117 | bool RecursivelyDeleteTriviallyDeadInstructionsPermissive( | ||
| 118 | SmallVectorImpl<WeakTrackingVH> &DeadInsts, | ||
| 119 | const TargetLibraryInfo *TLI = nullptr, MemorySSAUpdater *MSSAU = nullptr, | ||
| 120 | std::function<void(Value *)> AboutToDeleteCallback = | ||
| 121 | std::function<void(Value *)>()); | ||
| 122 | |||
| 123 | /// If the specified value is an effectively dead PHI node, due to being a | ||
| 124 | /// def-use chain of single-use nodes that either forms a cycle or is terminated | ||
| 125 | /// by a trivially dead instruction, delete it. If that makes any of its | ||
| 126 | /// operands trivially dead, delete them too, recursively. Return true if a | ||
| 127 | /// change was made. | ||
| 128 | bool RecursivelyDeleteDeadPHINode(PHINode *PN, | ||
| 129 | const TargetLibraryInfo *TLI = nullptr, | ||
| 130 | MemorySSAUpdater *MSSAU = nullptr); | ||
| 131 | |||
| 132 | /// Scan the specified basic block and try to simplify any instructions in it | ||
| 133 | /// and recursively delete dead instructions. | ||
| 134 | /// | ||
| 135 | /// This returns true if it changed the code, note that it can delete | ||
| 136 | /// instructions in other blocks as well in this block. | ||
| 137 | bool SimplifyInstructionsInBlock(BasicBlock *BB, | ||
| 138 | const TargetLibraryInfo *TLI = nullptr); | ||
| 139 | |||
| 140 | /// Replace all the uses of an SSA value in @llvm.dbg intrinsics with | ||
| 141 | /// undef. This is useful for signaling that a variable, e.g. has been | ||
| 142 | /// found dead and hence it's unavailable at a given program point. | ||
| 143 | /// Returns true if the dbg values have been changed. | ||
| 144 | bool replaceDbgUsesWithUndef(Instruction *I); | ||
| 145 | |||
| 146 | //===----------------------------------------------------------------------===// | ||
| 147 | //  Control Flow Graph Restructuring. | ||
| 148 | // | ||
| 149 | |||
| 150 | /// BB is a block with one predecessor and its predecessor is known to have one | ||
| 151 | /// successor (BB!). Eliminate the edge between them, moving the instructions in | ||
| 152 | /// the predecessor into BB. This deletes the predecessor block. | ||
| 153 | void MergeBasicBlockIntoOnlyPred(BasicBlock *BB, DomTreeUpdater *DTU = nullptr); | ||
| 154 | |||
| 155 | /// BB is known to contain an unconditional branch, and contains no instructions | ||
| 156 | /// other than PHI nodes, potential debug intrinsics and the branch. If | ||
| 157 | /// possible, eliminate BB by rewriting all the predecessors to branch to the | ||
| 158 | /// successor block and return true. If we can't transform, return false. | ||
| 159 | bool TryToSimplifyUncondBranchFromEmptyBlock(BasicBlock *BB, | ||
| 160 | DomTreeUpdater *DTU = nullptr); | ||
| 161 | |||
| 162 | /// Check for and eliminate duplicate PHI nodes in this block. This doesn't try | ||
| 163 | /// to be clever about PHI nodes which differ only in the order of the incoming | ||
| 164 | /// values, but instcombine orders them so it usually won't matter. | ||
| 165 | bool EliminateDuplicatePHINodes(BasicBlock *BB); | ||
| 166 | |||
| 167 | /// This function is used to do simplification of a CFG.  For example, it | ||
| 168 | /// adjusts branches to branches to eliminate the extra hop, it eliminates | ||
| 169 | /// unreachable basic blocks, and does other peephole optimization of the CFG. | ||
| 170 | /// It returns true if a modification was made, possibly deleting the basic | ||
| 171 | /// block that was pointed to. LoopHeaders is an optional input parameter | ||
| 172 | /// providing the set of loop headers that SimplifyCFG should not eliminate. | ||
| 173 | extern cl::opt<bool> RequireAndPreserveDomTree; | ||
| 174 | bool simplifyCFG(BasicBlock *BB, const TargetTransformInfo &TTI, | ||
| 175 | DomTreeUpdater *DTU = nullptr, | ||
| 176 | const SimplifyCFGOptions &Options = {}, | ||
| 177 | ArrayRef<WeakVH> LoopHeaders = {}); | ||
| 178 | |||
| 179 | /// This function is used to flatten a CFG. For example, it uses parallel-and | ||
| 180 | /// and parallel-or mode to collapse if-conditions and merge if-regions with | ||
| 181 | /// identical statements. | ||
| 182 | bool FlattenCFG(BasicBlock *BB, AAResults *AA = nullptr); | ||
| 183 | |||
| 184 | /// If this basic block is ONLY a setcc and a branch, and if a predecessor | ||
| 185 | /// branches to us and one of our successors, fold the setcc into the | ||
| 186 | /// predecessor and use logical operations to pick the right destination. | ||
| 187 | bool FoldBranchToCommonDest(BranchInst *BI, llvm::DomTreeUpdater *DTU = nullptr, | ||
| 188 | MemorySSAUpdater *MSSAU = nullptr, | ||
| 189 | const TargetTransformInfo *TTI = nullptr, | ||
| 190 | unsigned BonusInstThreshold = 1); | ||
| 191 | |||
| 192 | /// This function takes a virtual register computed by an Instruction and | ||
| 193 | /// replaces it with a slot in the stack frame, allocated via alloca. | ||
| 194 | /// This allows the CFG to be changed around without fear of invalidating the | ||
| 195 | /// SSA information for the value. It returns the pointer to the alloca inserted | ||
| 196 | /// to create a stack slot for X. | ||
| 197 | AllocaInst *DemoteRegToStack(Instruction &X, | ||
| 198 | bool VolatileLoads = false, | ||
| 199 | Instruction *AllocaPoint = nullptr); | ||
| 200 | |||
| 201 | /// This function takes a virtual register computed by a phi node and replaces | ||
| 202 | /// it with a slot in the stack frame, allocated via alloca. The phi node is | ||
| 203 | /// deleted and it returns the pointer to the alloca inserted. | ||
| 204 | AllocaInst *DemotePHIToStack(PHINode *P, Instruction *AllocaPoint = nullptr); | ||
| 205 | |||
| 206 | /// Try to ensure that the alignment of \p V is at least \p PrefAlign bytes. If | ||
| 207 | /// the owning object can be modified and has an alignment less than \p | ||
| 208 | /// PrefAlign, it will be increased and \p PrefAlign returned. If the alignment | ||
| 209 | /// cannot be increased, the known alignment of the value is returned. | ||
| 210 | /// | ||
| 211 | /// It is not always possible to modify the alignment of the underlying object, | ||
| 212 | /// so if alignment is important, a more reliable approach is to simply align | ||
| 213 | /// all global variables and allocation instructions to their preferred | ||
| 214 | /// alignment from the beginning. | ||
| 215 | Align getOrEnforceKnownAlignment(Value *V, MaybeAlign PrefAlign, | ||
| 216 | const DataLayout &DL, | ||
| 217 | const Instruction *CxtI = nullptr, | ||
| 218 | AssumptionCache *AC = nullptr, | ||
| 219 | const DominatorTree *DT = nullptr); | ||
| 220 | |||
| 221 | /// Try to infer an alignment for the specified pointer. | ||
| 222 | inline Align getKnownAlignment(Value *V, const DataLayout &DL, | ||
| 223 | const Instruction *CxtI = nullptr, | ||
| 224 | AssumptionCache *AC = nullptr, | ||
| 225 | const DominatorTree *DT = nullptr) { | ||
| 226 | return getOrEnforceKnownAlignment(V, MaybeAlign(), DL, CxtI, AC, DT); | ||
| 227 | } | ||
| 228 | |||
| 229 | /// Create a call that matches the invoke \p II in terms of arguments, | ||
| 230 | /// attributes, debug information, etc. The call is not placed in a block and it | ||
| 231 | /// will not have a name. The invoke instruction is not removed, nor are the | ||
| 232 | /// uses replaced by the new call. | ||
| 233 | CallInst *createCallMatchingInvoke(InvokeInst *II); | ||
| 234 | |||
| 235 | /// This function converts the specified invoke into a normal call. | ||
| 236 | CallInst *changeToCall(InvokeInst *II, DomTreeUpdater *DTU = nullptr); | ||
| 237 | |||
| 238 | ///===---------------------------------------------------------------------===// | ||
| 239 | ///  Dbg Intrinsic utilities | ||
| 240 | /// | ||
| 241 | |||
| 242 | /// Inserts a llvm.dbg.value intrinsic before a store to an alloca'd value | ||
| 243 | /// that has an associated llvm.dbg.declare or llvm.dbg.addr intrinsic. | ||
| 244 | void ConvertDebugDeclareToDebugValue(DbgVariableIntrinsic *DII, | ||
| 245 | StoreInst *SI, DIBuilder &Builder); | ||
| 246 | |||
| 247 | /// Inserts a llvm.dbg.value intrinsic before a load of an alloca'd value | ||
| 248 | /// that has an associated llvm.dbg.declare or llvm.dbg.addr intrinsic. | ||
| 249 | void ConvertDebugDeclareToDebugValue(DbgVariableIntrinsic *DII, | ||
| 250 | LoadInst *LI, DIBuilder &Builder); | ||
| 251 | |||
| 252 | /// Inserts a llvm.dbg.value intrinsic after a phi that has an associated | ||
| 253 | /// llvm.dbg.declare or llvm.dbg.addr intrinsic. | ||
| 254 | void ConvertDebugDeclareToDebugValue(DbgVariableIntrinsic *DII, | ||
| 255 | PHINode *LI, DIBuilder &Builder); | ||
| 256 | |||
| 257 | /// Lowers llvm.dbg.declare intrinsics into appropriate set of | ||
| 258 | /// llvm.dbg.value intrinsics. | ||
| 259 | bool LowerDbgDeclare(Function &F); | ||
| 260 | |||
| 261 | /// Propagate dbg.value intrinsics through the newly inserted PHIs. | ||
| 262 | void insertDebugValuesForPHIs(BasicBlock *BB, | ||
| 263 | SmallVectorImpl<PHINode *> &InsertedPHIs); | ||
| 264 | |||
| 265 | /// Replaces llvm.dbg.declare instruction when the address it | ||
| 266 | /// describes is replaced with a new value. If Deref is true, an | ||
| 267 | /// additional DW_OP_deref is prepended to the expression. If Offset | ||
| 268 | /// is non-zero, a constant displacement is added to the expression | ||
| 269 | /// (between the optional Deref operations). Offset can be negative. | ||
| 270 | bool replaceDbgDeclare(Value *Address, Value *NewAddress, DIBuilder &Builder, | ||
| 271 | uint8_t DIExprFlags, int Offset); | ||
| 272 | |||
| 273 | /// Replaces multiple llvm.dbg.value instructions when the alloca it describes | ||
| 274 | /// is replaced with a new value. If Offset is non-zero, a constant displacement | ||
| 275 | /// is added to the expression (after the mandatory Deref). Offset can be | ||
| 276 | /// negative. New llvm.dbg.value instructions are inserted at the locations of | ||
| 277 | /// the instructions they replace. | ||
| 278 | void replaceDbgValueForAlloca(AllocaInst *AI, Value *NewAllocaAddress, | ||
| 279 | DIBuilder &Builder, int Offset = 0); | ||
| 280 | |||
| 281 | /// Assuming the instruction \p I is going to be deleted, attempt to salvage | ||
| 282 | /// debug users of \p I by writing the effect of \p I in a DIExpression. If it | ||
| 283 | /// cannot be salvaged changes its debug uses to undef. | ||
| 284 | void salvageDebugInfo(Instruction &I); | ||
| 285 | |||
| 286 | |||
| 287 | /// Implementation of salvageDebugInfo, applying only to instructions in | ||
| 288 | /// \p Insns, rather than all debug users from findDbgUsers( \p I). | ||
| 289 | /// Mark undef if salvaging cannot be completed. | ||
| 290 | void salvageDebugInfoForDbgValues(Instruction &I, | ||
| 291 | ArrayRef<DbgVariableIntrinsic *> Insns); | ||
| 292 | |||
| 293 | /// Given an instruction \p I and DIExpression \p DIExpr operating on | ||
| 294 | /// it, append the effects of \p I to the DIExpression operand list | ||
| 295 | /// \p Ops, or return \p nullptr if it cannot be salvaged. | ||
| 296 | /// \p CurrentLocOps is the number of SSA values referenced by the | ||
| 297 | /// incoming \p Ops.  \return the first non-constant operand | ||
| 298 | /// implicitly referred to by Ops. If \p I references more than one | ||
| 299 | /// non-constant operand, any additional operands are added to | ||
| 300 | /// \p AdditionalValues. | ||
| 301 | /// | ||
| 302 | /// \example | ||
| 303 | //// | ||
| 304 | ///   I = add %a, i32 1 | ||
| 305 | /// | ||
| 306 | ///   Return = %a | ||
| 307 | ///   Ops = llvm::dwarf::DW_OP_lit1 llvm::dwarf::DW_OP_add | ||
| 308 | /// | ||
| 309 | ///   I = add %a, %b | ||
| 310 | /// | ||
| 311 | ///   Return = %a | ||
| 312 | ///   Ops = llvm::dwarf::DW_OP_LLVM_arg0 llvm::dwarf::DW_OP_add | ||
| 313 | ///   AdditionalValues = %b | ||
| 314 | Value *salvageDebugInfoImpl(Instruction &I, uint64_t CurrentLocOps, | ||
| 315 | SmallVectorImpl<uint64_t> &Ops, | ||
| 316 | SmallVectorImpl<Value *> &AdditionalValues); | ||
| 317 | |||
| 318 | /// Point debug users of \p From to \p To or salvage them. Use this function | ||
| 319 | /// only when replacing all uses of \p From with \p To, with a guarantee that | ||
| 320 | /// \p From is going to be deleted. | ||
| 321 | /// | ||
| 322 | /// Follow these rules to prevent use-before-def of \p To: | ||
| 323 | ///   . If \p To is a linked Instruction, set \p DomPoint to \p To. | ||
| 324 | ///   . If \p To is an unlinked Instruction, set \p DomPoint to the Instruction | ||
| 325 | ///     \p To will be inserted after. | ||
| 326 | ///   . If \p To is not an Instruction (e.g a Constant), the choice of | ||
| 327 | ///     \p DomPoint is arbitrary. Pick \p From for simplicity. | ||
| 328 | /// | ||
| 329 | /// If a debug user cannot be preserved without reordering variable updates or | ||
| 330 | /// introducing a use-before-def, it is either salvaged (\ref salvageDebugInfo) | ||
| 331 | /// or deleted. Returns true if any debug users were updated. | ||
| 332 | bool replaceAllDbgUsesWith(Instruction &From, Value &To, Instruction &DomPoint, | ||
| 333 | DominatorTree &DT); | ||
| 334 | |||
| 335 | /// Remove all instructions from a basic block other than its terminator | ||
| 336 | /// and any present EH pad instructions. Returns a pair where the first element | ||
| 337 | /// is the number of instructions (excluding debug info intrinsics) that have | ||
| 338 | /// been removed, and the second element is the number of debug info intrinsics | ||
| 339 | /// that have been removed. | ||
| 340 | std::pair<unsigned, unsigned> | ||
| 341 | removeAllNonTerminatorAndEHPadInstructions(BasicBlock *BB); | ||
| 342 | |||
| 343 | /// Insert an unreachable instruction before the specified | ||
| 344 | /// instruction, making it and the rest of the code in the block dead. | ||
| 345 | unsigned changeToUnreachable(Instruction *I, bool PreserveLCSSA = false, | ||
| 346 | DomTreeUpdater *DTU = nullptr, | ||
| 347 | MemorySSAUpdater *MSSAU = nullptr); | ||
| 348 | |||
| 349 | /// Convert the CallInst to InvokeInst with the specified unwind edge basic | ||
| 350 | /// block.  This also splits the basic block where CI is located, because | ||
| 351 | /// InvokeInst is a terminator instruction.  Returns the newly split basic | ||
| 352 | /// block. | ||
| 353 | BasicBlock *changeToInvokeAndSplitBasicBlock(CallInst *CI, | ||
| 354 |                                              BasicBlock *UnwindEdge, | ||
| 355 | DomTreeUpdater *DTU = nullptr); | ||
| 356 | |||
| 357 | /// Replace 'BB's terminator with one that does not have an unwind successor | ||
| 358 | /// block. Rewrites `invoke` to `call`, etc. Updates any PHIs in unwind | ||
| 359 | /// successor. Returns the instruction that replaced the original terminator, | ||
| 360 | /// which might be a call in case the original terminator was an invoke. | ||
| 361 | /// | ||
| 362 | /// \param BB  Block whose terminator will be replaced.  Its terminator must | ||
| 363 | ///            have an unwind successor. | ||
| 364 | Instruction *removeUnwindEdge(BasicBlock *BB, DomTreeUpdater *DTU = nullptr); | ||
| 365 | |||
| 366 | /// Remove all blocks that can not be reached from the function's entry. | ||
| 367 | /// | ||
| 368 | /// Returns true if any basic block was removed. | ||
| 369 | bool removeUnreachableBlocks(Function &F, DomTreeUpdater *DTU = nullptr, | ||
| 370 | MemorySSAUpdater *MSSAU = nullptr); | ||
| 371 | |||
| 372 | /// Combine the metadata of two instructions so that K can replace J. Some | ||
| 373 | /// metadata kinds can only be kept if K does not move, meaning it dominated | ||
| 374 | /// J in the original IR. | ||
| 375 | /// | ||
| 376 | /// Metadata not listed as known via KnownIDs is removed | ||
| 377 | void combineMetadata(Instruction *K, const Instruction *J, | ||
| 378 | ArrayRef<unsigned> KnownIDs, bool DoesKMove); | ||
| 379 | |||
| 380 | /// Combine the metadata of two instructions so that K can replace J. This | ||
| 381 | /// specifically handles the case of CSE-like transformations. Some | ||
| 382 | /// metadata can only be kept if K dominates J. For this to be correct, | ||
| 383 | /// K cannot be hoisted. | ||
| 384 | /// | ||
| 385 | /// Unknown metadata is removed. | ||
| 386 | void combineMetadataForCSE(Instruction *K, const Instruction *J, | ||
| 387 | bool DoesKMove); | ||
| 388 | |||
| 389 | /// Copy the metadata from the source instruction to the destination (the | ||
| 390 | /// replacement for the source instruction). | ||
| 391 | void copyMetadataForLoad(LoadInst &Dest, const LoadInst &Source); | ||
| 392 | |||
| 393 | /// Patch the replacement so that it is not more restrictive than the value | ||
| 394 | /// being replaced. It assumes that the replacement does not get moved from | ||
| 395 | /// its original position. | ||
| 396 | void patchReplacementInstruction(Instruction *I, Value *Repl); | ||
| 397 | |||
| 398 | // Replace each use of 'From' with 'To', if that use does not belong to basic | ||
| 399 | // block where 'From' is defined. Returns the number of replacements made. | ||
| 400 | unsigned replaceNonLocalUsesWith(Instruction *From, Value *To); | ||
| 401 | |||
| 402 | /// Replace each use of 'From' with 'To' if that use is dominated by | ||
| 403 | /// the given edge.  Returns the number of replacements made. | ||
| 404 | unsigned replaceDominatedUsesWith(Value *From, Value *To, DominatorTree &DT, | ||
| 405 | const BasicBlockEdge &Edge); | ||
| 406 | /// Replace each use of 'From' with 'To' if that use is dominated by | ||
| 407 | /// the end of the given BasicBlock. Returns the number of replacements made. | ||
| 408 | unsigned replaceDominatedUsesWith(Value *From, Value *To, DominatorTree &DT, | ||
| 409 | const BasicBlock *BB); | ||
| 410 | |||
| 411 | /// Return true if this call calls a gc leaf function. | ||
| 412 | /// | ||
| 413 | /// A leaf function is a function that does not safepoint the thread during its | ||
| 414 | /// execution.  During a call or invoke to such a function, the callers stack | ||
| 415 | /// does not have to be made parseable. | ||
| 416 | /// | ||
| 417 | /// Most passes can and should ignore this information, and it is only used | ||
| 418 | /// during lowering by the GC infrastructure. | ||
| 419 | bool callsGCLeafFunction(const CallBase *Call, const TargetLibraryInfo &TLI); | ||
| 420 | |||
| 421 | /// Copy a nonnull metadata node to a new load instruction. | ||
| 422 | /// | ||
| 423 | /// This handles mapping it to range metadata if the new load is an integer | ||
| 424 | /// load instead of a pointer load. | ||
| 425 | void copyNonnullMetadata(const LoadInst &OldLI, MDNode *N, LoadInst &NewLI); | ||
| 426 | |||
| 427 | /// Copy a range metadata node to a new load instruction. | ||
| 428 | /// | ||
| 429 | /// This handles mapping it to nonnull metadata if the new load is a pointer | ||
| 430 | /// load instead of an integer load and the range doesn't cover null. | ||
| 431 | void copyRangeMetadata(const DataLayout &DL, const LoadInst &OldLI, MDNode *N, | ||
| 432 | LoadInst &NewLI); | ||
| 433 | |||
| 434 | /// Remove the debug intrinsic instructions for the given instruction. | ||
| 435 | void dropDebugUsers(Instruction &I); | ||
| 436 | |||
| 437 | /// Hoist all of the instructions in the \p IfBlock to the dominant block | ||
| 438 | /// \p DomBlock, by moving its instructions to the insertion point \p InsertPt. | ||
| 439 | /// | ||
| 440 | /// The moved instructions receive the insertion point debug location values | ||
| 441 | /// (DILocations) and their debug intrinsic instructions are removed. | ||
| 442 | void hoistAllInstructionsInto(BasicBlock *DomBlock, Instruction *InsertPt, | ||
| 443 | BasicBlock *BB); | ||
| 444 | |||
| 445 | //===----------------------------------------------------------------------===// | ||
| 446 | //  Intrinsic pattern matching | ||
| 447 | // | ||
| 448 | |||
| 449 | /// Try to match a bswap or bitreverse idiom. | ||
| 450 | /// | ||
| 451 | /// If an idiom is matched, an intrinsic call is inserted before \c I. Any added | ||
| 452 | /// instructions are returned in \c InsertedInsts. They will all have been added | ||
| 453 | /// to a basic block. | ||
| 454 | /// | ||
| 455 | /// A bitreverse idiom normally requires around 2*BW nodes to be searched (where | ||
| 456 | /// BW is the bitwidth of the integer type). A bswap idiom requires anywhere up | ||
| 457 | /// to BW / 4 nodes to be searched, so is significantly faster. | ||
| 458 | /// | ||
| 459 | /// This function returns true on a successful match or false otherwise. | ||
| 460 | bool recognizeBSwapOrBitReverseIdiom( | ||
| 461 | Instruction *I, bool MatchBSwaps, bool MatchBitReversals, | ||
| 462 | SmallVectorImpl<Instruction *> &InsertedInsts); | ||
| 463 | |||
| 464 | //===----------------------------------------------------------------------===// | ||
| 465 | //  Sanitizer utilities | ||
| 466 | // | ||
| 467 | |||
| 468 | /// Given a CallInst, check if it calls a string function known to CodeGen, | ||
| 469 | /// and mark it with NoBuiltin if so.  To be used by sanitizers that intend | ||
| 470 | /// to intercept string functions and want to avoid converting them to target | ||
| 471 | /// specific instructions. | ||
| 472 | void maybeMarkSanitizerLibraryCallNoBuiltin(CallInst *CI, | ||
| 473 | const TargetLibraryInfo *TLI); | ||
| 474 | |||
| 475 | //===----------------------------------------------------------------------===// | ||
| 476 | //  Transform predicates | ||
| 477 | // | ||
| 478 | |||
| 479 | /// Given an instruction, is it legal to set operand OpIdx to a non-constant | ||
| 480 | /// value? | ||
| 481 | bool canReplaceOperandWithVariable(const Instruction *I, unsigned OpIdx); | ||
| 482 | |||
| 483 | //===----------------------------------------------------------------------===// | ||
| 484 | //  Value helper functions | ||
| 485 | // | ||
| 486 | |||
| 487 | /// Invert the given true/false value, possibly reusing an existing copy. | ||
| 488 | Value *invertCondition(Value *Condition); | ||
| 489 | |||
| 490 | |||
| 491 | //===----------------------------------------------------------------------===// | ||
| 492 | //  Assorted | ||
| 493 | // | ||
| 494 | |||
| 495 | /// If we can infer one attribute from another on the declaration of a | ||
| 496 | /// function, explicitly materialize the maximal set in the IR. | ||
| 497 | bool inferAttributesFromOthers(Function &F); | ||
| 498 | |||
| 499 | } // end namespace llvm | ||
| 500 | |||
| 501 | #endif // LLVM_TRANSFORMS_UTILS_LOCAL_H |