1 //===- llvm/Analysis/AliasAnalysis.h - Alias Analysis Interface -*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines the generic AliasAnalysis interface, which is used as the 11 // common interface used by all clients of alias analysis information, and 12 // implemented by all alias analysis implementations. Mod/Ref information is 13 // also captured by this interface. 14 // 15 // Implementations of this interface must implement the various virtual methods, 16 // which automatically provides functionality for the entire suite of client 17 // APIs. 18 // 19 // This API identifies memory regions with the MemoryLocation class. The pointer 20 // component specifies the base memory address of the region. The Size specifies 21 // the maximum size (in address units) of the memory region, or 22 // MemoryLocation::UnknownSize if the size is not known. The TBAA tag 23 // identifies the "type" of the memory reference; see the 24 // TypeBasedAliasAnalysis class for details. 25 // 26 // Some non-obvious details include: 27 // - Pointers that point to two completely different objects in memory never 28 // alias, regardless of the value of the Size component. 29 // - NoAlias doesn't imply inequal pointers. The most obvious example of this 30 // is two pointers to constant memory. Even if they are equal, constant 31 // memory is never stored to, so there will never be any dependencies. 32 // In this and other situations, the pointers may be both NoAlias and 33 // MustAlias at the same time. The current API can only return one result, 34 // though this is rarely a problem in practice. 35 // 36 //===----------------------------------------------------------------------===// 37 38 #ifndef LLVM_ANALYSIS_ALIASANALYSIS_H 39 #define LLVM_ANALYSIS_ALIASANALYSIS_H 40 41 #include "llvm/ADT/DenseMap.h" 42 #include "llvm/IR/CallSite.h" 43 #include "llvm/IR/Metadata.h" 44 #include "llvm/IR/PassManager.h" 45 #include "llvm/Analysis/MemoryLocation.h" 46 47 namespace llvm { 48 class BasicAAResult; 49 class LoadInst; 50 class StoreInst; 51 class VAArgInst; 52 class DataLayout; 53 class TargetLibraryInfo; 54 class Pass; 55 class AnalysisUsage; 56 class MemTransferInst; 57 class MemIntrinsic; 58 class DominatorTree; 59 class OrderedBasicBlock; 60 61 /// The possible results of an alias query. 62 /// 63 /// These results are always computed between two MemoryLocation objects as 64 /// a query to some alias analysis. 65 /// 66 /// Note that these are unscoped enumerations because we would like to support 67 /// implicitly testing a result for the existence of any possible aliasing with 68 /// a conversion to bool, but an "enum class" doesn't support this. The 69 /// canonical names from the literature are suffixed and unique anyways, and so 70 /// they serve as global constants in LLVM for these results. 71 /// 72 /// See docs/AliasAnalysis.html for more information on the specific meanings 73 /// of these values. 74 enum AliasResult { 75 /// The two locations do not alias at all. 76 /// 77 /// This value is arranged to convert to false, while all other values 78 /// convert to true. This allows a boolean context to convert the result to 79 /// a binary flag indicating whether there is the possibility of aliasing. 80 NoAlias = 0, 81 /// The two locations may or may not alias. This is the least precise result. 82 MayAlias, 83 /// The two locations alias, but only due to a partial overlap. 84 PartialAlias, 85 /// The two locations precisely alias each other. 86 MustAlias, 87 }; 88 89 /// Flags indicating whether a memory access modifies or references memory. 90 /// 91 /// This is no access at all, a modification, a reference, or both 92 /// a modification and a reference. These are specifically structured such that 93 /// they form a two bit matrix and bit-tests for 'mod' or 'ref' work with any 94 /// of the possible values. 95 enum ModRefInfo { 96 /// The access neither references nor modifies the value stored in memory. 97 MRI_NoModRef = 0, 98 /// The access references the value stored in memory. 99 MRI_Ref = 1, 100 /// The access modifies the value stored in memory. 101 MRI_Mod = 2, 102 /// The access both references and modifies the value stored in memory. 103 MRI_ModRef = MRI_Ref | MRI_Mod 104 }; 105 106 /// The locations at which a function might access memory. 107 /// 108 /// These are primarily used in conjunction with the \c AccessKind bits to 109 /// describe both the nature of access and the locations of access for a 110 /// function call. 111 enum FunctionModRefLocation { 112 /// Base case is no access to memory. 113 FMRL_Nowhere = 0, 114 /// Access to memory via argument pointers. 115 FMRL_ArgumentPointees = 4, 116 /// Access to any memory. 117 FMRL_Anywhere = 8 | FMRL_ArgumentPointees 118 }; 119 120 /// Summary of how a function affects memory in the program. 121 /// 122 /// Loads from constant globals are not considered memory accesses for this 123 /// interface. Also, functions may freely modify stack space local to their 124 /// invocation without having to report it through these interfaces. 125 enum FunctionModRefBehavior { 126 /// This function does not perform any non-local loads or stores to memory. 127 /// 128 /// This property corresponds to the GCC 'const' attribute. 129 /// This property corresponds to the LLVM IR 'readnone' attribute. 130 /// This property corresponds to the IntrNoMem LLVM intrinsic flag. 131 FMRB_DoesNotAccessMemory = FMRL_Nowhere | MRI_NoModRef, 132 133 /// The only memory references in this function (if it has any) are 134 /// non-volatile loads from objects pointed to by its pointer-typed 135 /// arguments, with arbitrary offsets. 136 /// 137 /// This property corresponds to the IntrReadArgMem LLVM intrinsic flag. 138 FMRB_OnlyReadsArgumentPointees = FMRL_ArgumentPointees | MRI_Ref, 139 140 /// The only memory references in this function (if it has any) are 141 /// non-volatile loads and stores from objects pointed to by its 142 /// pointer-typed arguments, with arbitrary offsets. 143 /// 144 /// This property corresponds to the IntrReadWriteArgMem LLVM intrinsic flag. 145 FMRB_OnlyAccessesArgumentPointees = FMRL_ArgumentPointees | MRI_ModRef, 146 147 /// This function does not perform any non-local stores or volatile loads, 148 /// but may read from any memory location. 149 /// 150 /// This property corresponds to the GCC 'pure' attribute. 151 /// This property corresponds to the LLVM IR 'readonly' attribute. 152 /// This property corresponds to the IntrReadMem LLVM intrinsic flag. 153 FMRB_OnlyReadsMemory = FMRL_Anywhere | MRI_Ref, 154 155 /// This indicates that the function could not be classified into one of the 156 /// behaviors above. 157 FMRB_UnknownModRefBehavior = FMRL_Anywhere | MRI_ModRef 158 }; 159 160 class AAResults { 161 public: 162 // Make these results default constructable and movable. We have to spell 163 // these out because MSVC won't synthesize them. 164 AAResults() {} 165 AAResults(AAResults &&Arg); 166 AAResults &operator=(AAResults &&Arg); 167 ~AAResults(); 168 169 /// Register a specific AA result. 170 template <typename AAResultT> void addAAResult(AAResultT &AAResult) { 171 // FIXME: We should use a much lighter weight system than the usual 172 // polymorphic pattern because we don't own AAResult. It should 173 // ideally involve two pointers and no separate allocation. 174 AAs.emplace_back(new Model<AAResultT>(AAResult, *this)); 175 } 176 177 //===--------------------------------------------------------------------===// 178 /// \name Alias Queries 179 /// @{ 180 181 /// The main low level interface to the alias analysis implementation. 182 /// Returns an AliasResult indicating whether the two pointers are aliased to 183 /// each other. This is the interface that must be implemented by specific 184 /// alias analysis implementations. 185 AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB); 186 187 /// A convenience wrapper around the primary \c alias interface. 188 AliasResult alias(const Value *V1, uint64_t V1Size, const Value *V2, 189 uint64_t V2Size) { 190 return alias(MemoryLocation(V1, V1Size), MemoryLocation(V2, V2Size)); 191 } 192 193 /// A convenience wrapper around the primary \c alias interface. 194 AliasResult alias(const Value *V1, const Value *V2) { 195 return alias(V1, MemoryLocation::UnknownSize, V2, 196 MemoryLocation::UnknownSize); 197 } 198 199 /// A trivial helper function to check to see if the specified pointers are 200 /// no-alias. 201 bool isNoAlias(const MemoryLocation &LocA, const MemoryLocation &LocB) { 202 return alias(LocA, LocB) == NoAlias; 203 } 204 205 /// A convenience wrapper around the \c isNoAlias helper interface. 206 bool isNoAlias(const Value *V1, uint64_t V1Size, const Value *V2, 207 uint64_t V2Size) { 208 return isNoAlias(MemoryLocation(V1, V1Size), MemoryLocation(V2, V2Size)); 209 } 210 211 /// A convenience wrapper around the \c isNoAlias helper interface. 212 bool isNoAlias(const Value *V1, const Value *V2) { 213 return isNoAlias(MemoryLocation(V1), MemoryLocation(V2)); 214 } 215 216 /// A trivial helper function to check to see if the specified pointers are 217 /// must-alias. 218 bool isMustAlias(const MemoryLocation &LocA, const MemoryLocation &LocB) { 219 return alias(LocA, LocB) == MustAlias; 220 } 221 222 /// A convenience wrapper around the \c isMustAlias helper interface. 223 bool isMustAlias(const Value *V1, const Value *V2) { 224 return alias(V1, 1, V2, 1) == MustAlias; 225 } 226 227 /// Checks whether the given location points to constant memory, or if 228 /// \p OrLocal is true whether it points to a local alloca. 229 bool pointsToConstantMemory(const MemoryLocation &Loc, bool OrLocal = false); 230 231 /// A convenience wrapper around the primary \c pointsToConstantMemory 232 /// interface. 233 bool pointsToConstantMemory(const Value *P, bool OrLocal = false) { 234 return pointsToConstantMemory(MemoryLocation(P), OrLocal); 235 } 236 237 /// @} 238 //===--------------------------------------------------------------------===// 239 /// \name Simple mod/ref information 240 /// @{ 241 242 /// Get the ModRef info associated with a pointer argument of a callsite. The 243 /// result's bits are set to indicate the allowed aliasing ModRef kinds. Note 244 /// that these bits do not necessarily account for the overall behavior of 245 /// the function, but rather only provide additional per-argument 246 /// information. 247 ModRefInfo getArgModRefInfo(ImmutableCallSite CS, unsigned ArgIdx); 248 249 /// Return the behavior of the given call site. 250 FunctionModRefBehavior getModRefBehavior(ImmutableCallSite CS); 251 252 /// Return the behavior when calling the given function. 253 FunctionModRefBehavior getModRefBehavior(const Function *F); 254 255 /// Checks if the specified call is known to never read or write memory. 256 /// 257 /// Note that if the call only reads from known-constant memory, it is also 258 /// legal to return true. Also, calls that unwind the stack are legal for 259 /// this predicate. 260 /// 261 /// Many optimizations (such as CSE and LICM) can be performed on such calls 262 /// without worrying about aliasing properties, and many calls have this 263 /// property (e.g. calls to 'sin' and 'cos'). 264 /// 265 /// This property corresponds to the GCC 'const' attribute. 266 bool doesNotAccessMemory(ImmutableCallSite CS) { 267 return getModRefBehavior(CS) == FMRB_DoesNotAccessMemory; 268 } 269 270 /// Checks if the specified function is known to never read or write memory. 271 /// 272 /// Note that if the function only reads from known-constant memory, it is 273 /// also legal to return true. Also, function that unwind the stack are legal 274 /// for this predicate. 275 /// 276 /// Many optimizations (such as CSE and LICM) can be performed on such calls 277 /// to such functions without worrying about aliasing properties, and many 278 /// functions have this property (e.g. 'sin' and 'cos'). 279 /// 280 /// This property corresponds to the GCC 'const' attribute. 281 bool doesNotAccessMemory(const Function *F) { 282 return getModRefBehavior(F) == FMRB_DoesNotAccessMemory; 283 } 284 285 /// Checks if the specified call is known to only read from non-volatile 286 /// memory (or not access memory at all). 287 /// 288 /// Calls that unwind the stack are legal for this predicate. 289 /// 290 /// This property allows many common optimizations to be performed in the 291 /// absence of interfering store instructions, such as CSE of strlen calls. 292 /// 293 /// This property corresponds to the GCC 'pure' attribute. 294 bool onlyReadsMemory(ImmutableCallSite CS) { 295 return onlyReadsMemory(getModRefBehavior(CS)); 296 } 297 298 /// Checks if the specified function is known to only read from non-volatile 299 /// memory (or not access memory at all). 300 /// 301 /// Functions that unwind the stack are legal for this predicate. 302 /// 303 /// This property allows many common optimizations to be performed in the 304 /// absence of interfering store instructions, such as CSE of strlen calls. 305 /// 306 /// This property corresponds to the GCC 'pure' attribute. 307 bool onlyReadsMemory(const Function *F) { 308 return onlyReadsMemory(getModRefBehavior(F)); 309 } 310 311 /// Checks if functions with the specified behavior are known to only read 312 /// from non-volatile memory (or not access memory at all). 313 static bool onlyReadsMemory(FunctionModRefBehavior MRB) { 314 return !(MRB & MRI_Mod); 315 } 316 317 /// Checks if functions with the specified behavior are known to read and 318 /// write at most from objects pointed to by their pointer-typed arguments 319 /// (with arbitrary offsets). 320 static bool onlyAccessesArgPointees(FunctionModRefBehavior MRB) { 321 return !(MRB & FMRL_Anywhere & ~FMRL_ArgumentPointees); 322 } 323 324 /// Checks if functions with the specified behavior are known to potentially 325 /// read or write from objects pointed to be their pointer-typed arguments 326 /// (with arbitrary offsets). 327 static bool doesAccessArgPointees(FunctionModRefBehavior MRB) { 328 return (MRB & MRI_ModRef) && (MRB & FMRL_ArgumentPointees); 329 } 330 331 /// getModRefInfo (for call sites) - Return information about whether 332 /// a particular call site modifies or reads the specified memory location. 333 ModRefInfo getModRefInfo(ImmutableCallSite CS, const MemoryLocation &Loc); 334 335 /// getModRefInfo (for call sites) - A convenience wrapper. 336 ModRefInfo getModRefInfo(ImmutableCallSite CS, const Value *P, 337 uint64_t Size) { 338 return getModRefInfo(CS, MemoryLocation(P, Size)); 339 } 340 341 /// getModRefInfo (for calls) - Return information about whether 342 /// a particular call modifies or reads the specified memory location. 343 ModRefInfo getModRefInfo(const CallInst *C, const MemoryLocation &Loc) { 344 return getModRefInfo(ImmutableCallSite(C), Loc); 345 } 346 347 /// getModRefInfo (for calls) - A convenience wrapper. 348 ModRefInfo getModRefInfo(const CallInst *C, const Value *P, uint64_t Size) { 349 return getModRefInfo(C, MemoryLocation(P, Size)); 350 } 351 352 /// getModRefInfo (for invokes) - Return information about whether 353 /// a particular invoke modifies or reads the specified memory location. 354 ModRefInfo getModRefInfo(const InvokeInst *I, const MemoryLocation &Loc) { 355 return getModRefInfo(ImmutableCallSite(I), Loc); 356 } 357 358 /// getModRefInfo (for invokes) - A convenience wrapper. 359 ModRefInfo getModRefInfo(const InvokeInst *I, const Value *P, uint64_t Size) { 360 return getModRefInfo(I, MemoryLocation(P, Size)); 361 } 362 363 /// getModRefInfo (for loads) - Return information about whether 364 /// a particular load modifies or reads the specified memory location. 365 ModRefInfo getModRefInfo(const LoadInst *L, const MemoryLocation &Loc); 366 367 /// getModRefInfo (for loads) - A convenience wrapper. 368 ModRefInfo getModRefInfo(const LoadInst *L, const Value *P, uint64_t Size) { 369 return getModRefInfo(L, MemoryLocation(P, Size)); 370 } 371 372 /// getModRefInfo (for stores) - Return information about whether 373 /// a particular store modifies or reads the specified memory location. 374 ModRefInfo getModRefInfo(const StoreInst *S, const MemoryLocation &Loc); 375 376 /// getModRefInfo (for stores) - A convenience wrapper. 377 ModRefInfo getModRefInfo(const StoreInst *S, const Value *P, uint64_t Size) { 378 return getModRefInfo(S, MemoryLocation(P, Size)); 379 } 380 381 /// getModRefInfo (for fences) - Return information about whether 382 /// a particular store modifies or reads the specified memory location. 383 ModRefInfo getModRefInfo(const FenceInst *S, const MemoryLocation &Loc) { 384 // Conservatively correct. (We could possibly be a bit smarter if 385 // Loc is a alloca that doesn't escape.) 386 return MRI_ModRef; 387 } 388 389 /// getModRefInfo (for fences) - A convenience wrapper. 390 ModRefInfo getModRefInfo(const FenceInst *S, const Value *P, uint64_t Size) { 391 return getModRefInfo(S, MemoryLocation(P, Size)); 392 } 393 394 /// getModRefInfo (for cmpxchges) - Return information about whether 395 /// a particular cmpxchg modifies or reads the specified memory location. 396 ModRefInfo getModRefInfo(const AtomicCmpXchgInst *CX, 397 const MemoryLocation &Loc); 398 399 /// getModRefInfo (for cmpxchges) - A convenience wrapper. 400 ModRefInfo getModRefInfo(const AtomicCmpXchgInst *CX, const Value *P, 401 unsigned Size) { 402 return getModRefInfo(CX, MemoryLocation(P, Size)); 403 } 404 405 /// getModRefInfo (for atomicrmws) - Return information about whether 406 /// a particular atomicrmw modifies or reads the specified memory location. 407 ModRefInfo getModRefInfo(const AtomicRMWInst *RMW, const MemoryLocation &Loc); 408 409 /// getModRefInfo (for atomicrmws) - A convenience wrapper. 410 ModRefInfo getModRefInfo(const AtomicRMWInst *RMW, const Value *P, 411 unsigned Size) { 412 return getModRefInfo(RMW, MemoryLocation(P, Size)); 413 } 414 415 /// getModRefInfo (for va_args) - Return information about whether 416 /// a particular va_arg modifies or reads the specified memory location. 417 ModRefInfo getModRefInfo(const VAArgInst *I, const MemoryLocation &Loc); 418 419 /// getModRefInfo (for va_args) - A convenience wrapper. 420 ModRefInfo getModRefInfo(const VAArgInst *I, const Value *P, uint64_t Size) { 421 return getModRefInfo(I, MemoryLocation(P, Size)); 422 } 423 424 /// getModRefInfo (for catchpads) - Return information about whether 425 /// a particular catchpad modifies or reads the specified memory location. 426 ModRefInfo getModRefInfo(const CatchPadInst *I, const MemoryLocation &Loc); 427 428 /// getModRefInfo (for catchpads) - A convenience wrapper. 429 ModRefInfo getModRefInfo(const CatchPadInst *I, const Value *P, 430 uint64_t Size) { 431 return getModRefInfo(I, MemoryLocation(P, Size)); 432 } 433 434 /// getModRefInfo (for catchrets) - Return information about whether 435 /// a particular catchret modifies or reads the specified memory location. 436 ModRefInfo getModRefInfo(const CatchReturnInst *I, const MemoryLocation &Loc); 437 438 /// getModRefInfo (for catchrets) - A convenience wrapper. 439 ModRefInfo getModRefInfo(const CatchReturnInst *I, const Value *P, 440 uint64_t Size) { 441 return getModRefInfo(I, MemoryLocation(P, Size)); 442 } 443 444 /// Check whether or not an instruction may read or write memory (without 445 /// regard to a specific location). 446 /// 447 /// For function calls, this delegates to the alias-analysis specific 448 /// call-site mod-ref behavior queries. Otherwise it delegates to the generic 449 /// mod ref information query without a location. 450 ModRefInfo getModRefInfo(const Instruction *I) { 451 if (auto CS = ImmutableCallSite(I)) { 452 auto MRB = getModRefBehavior(CS); 453 if (MRB & MRI_ModRef) 454 return MRI_ModRef; 455 else if (MRB & MRI_Ref) 456 return MRI_Ref; 457 else if (MRB & MRI_Mod) 458 return MRI_Mod; 459 return MRI_NoModRef; 460 } 461 462 return getModRefInfo(I, MemoryLocation()); 463 } 464 465 /// Check whether or not an instruction may read or write the specified 466 /// memory location. 467 /// 468 /// An instruction that doesn't read or write memory may be trivially LICM'd 469 /// for example. 470 /// 471 /// This primarily delegates to specific helpers above. 472 ModRefInfo getModRefInfo(const Instruction *I, const MemoryLocation &Loc) { 473 switch (I->getOpcode()) { 474 case Instruction::VAArg: return getModRefInfo((const VAArgInst*)I, Loc); 475 case Instruction::Load: return getModRefInfo((const LoadInst*)I, Loc); 476 case Instruction::Store: return getModRefInfo((const StoreInst*)I, Loc); 477 case Instruction::Fence: return getModRefInfo((const FenceInst*)I, Loc); 478 case Instruction::AtomicCmpXchg: 479 return getModRefInfo((const AtomicCmpXchgInst*)I, Loc); 480 case Instruction::AtomicRMW: 481 return getModRefInfo((const AtomicRMWInst*)I, Loc); 482 case Instruction::Call: return getModRefInfo((const CallInst*)I, Loc); 483 case Instruction::Invoke: return getModRefInfo((const InvokeInst*)I,Loc); 484 case Instruction::CatchPad: 485 return getModRefInfo((const CatchPadInst *)I, Loc); 486 case Instruction::CatchRet: 487 return getModRefInfo((const CatchReturnInst *)I, Loc); 488 default: 489 return MRI_NoModRef; 490 } 491 } 492 493 /// A convenience wrapper for constructing the memory location. 494 ModRefInfo getModRefInfo(const Instruction *I, const Value *P, 495 uint64_t Size) { 496 return getModRefInfo(I, MemoryLocation(P, Size)); 497 } 498 499 /// Return information about whether a call and an instruction may refer to 500 /// the same memory locations. 501 ModRefInfo getModRefInfo(Instruction *I, ImmutableCallSite Call); 502 503 /// Return information about whether two call sites may refer to the same set 504 /// of memory locations. See the AA documentation for details: 505 /// http://llvm.org/docs/AliasAnalysis.html#ModRefInfo 506 ModRefInfo getModRefInfo(ImmutableCallSite CS1, ImmutableCallSite CS2); 507 508 /// \brief Return information about whether a particular call site modifies 509 /// or reads the specified memory location \p MemLoc before instruction \p I 510 /// in a BasicBlock. A ordered basic block \p OBB can be used to speed up 511 /// instruction ordering queries inside the BasicBlock containing \p I. 512 ModRefInfo callCapturesBefore(const Instruction *I, 513 const MemoryLocation &MemLoc, DominatorTree *DT, 514 OrderedBasicBlock *OBB = nullptr); 515 516 /// \brief A convenience wrapper to synthesize a memory location. 517 ModRefInfo callCapturesBefore(const Instruction *I, const Value *P, 518 uint64_t Size, DominatorTree *DT, 519 OrderedBasicBlock *OBB = nullptr) { 520 return callCapturesBefore(I, MemoryLocation(P, Size), DT, OBB); 521 } 522 523 /// @} 524 //===--------------------------------------------------------------------===// 525 /// \name Higher level methods for querying mod/ref information. 526 /// @{ 527 528 /// Check if it is possible for execution of the specified basic block to 529 /// modify the location Loc. 530 bool canBasicBlockModify(const BasicBlock &BB, const MemoryLocation &Loc); 531 532 /// A convenience wrapper synthesizing a memory location. 533 bool canBasicBlockModify(const BasicBlock &BB, const Value *P, 534 uint64_t Size) { 535 return canBasicBlockModify(BB, MemoryLocation(P, Size)); 536 } 537 538 /// Check if it is possible for the execution of the specified instructions 539 /// to mod\ref (according to the mode) the location Loc. 540 /// 541 /// The instructions to consider are all of the instructions in the range of 542 /// [I1,I2] INCLUSIVE. I1 and I2 must be in the same basic block. 543 bool canInstructionRangeModRef(const Instruction &I1, const Instruction &I2, 544 const MemoryLocation &Loc, 545 const ModRefInfo Mode); 546 547 /// A convenience wrapper synthesizing a memory location. 548 bool canInstructionRangeModRef(const Instruction &I1, const Instruction &I2, 549 const Value *Ptr, uint64_t Size, 550 const ModRefInfo Mode) { 551 return canInstructionRangeModRef(I1, I2, MemoryLocation(Ptr, Size), Mode); 552 } 553 554 private: 555 class Concept; 556 template <typename T> class Model; 557 558 template <typename T> friend class AAResultBase; 559 560 std::vector<std::unique_ptr<Concept>> AAs; 561 }; 562 563 /// Temporary typedef for legacy code that uses a generic \c AliasAnalysis 564 /// pointer or reference. 565 typedef AAResults AliasAnalysis; 566 567 /// A private abstract base class describing the concept of an individual alias 568 /// analysis implementation. 569 /// 570 /// This interface is implemented by any \c Model instantiation. It is also the 571 /// interface which a type used to instantiate the model must provide. 572 /// 573 /// All of these methods model methods by the same name in the \c 574 /// AAResults class. Only differences and specifics to how the 575 /// implementations are called are documented here. 576 class AAResults::Concept { 577 public: 578 virtual ~Concept() = 0; 579 580 /// An update API used internally by the AAResults to provide 581 /// a handle back to the top level aggregation. 582 virtual void setAAResults(AAResults *NewAAR) = 0; 583 584 //===--------------------------------------------------------------------===// 585 /// \name Alias Queries 586 /// @{ 587 588 /// The main low level interface to the alias analysis implementation. 589 /// Returns an AliasResult indicating whether the two pointers are aliased to 590 /// each other. This is the interface that must be implemented by specific 591 /// alias analysis implementations. 592 virtual AliasResult alias(const MemoryLocation &LocA, 593 const MemoryLocation &LocB) = 0; 594 595 /// Checks whether the given location points to constant memory, or if 596 /// \p OrLocal is true whether it points to a local alloca. 597 virtual bool pointsToConstantMemory(const MemoryLocation &Loc, 598 bool OrLocal) = 0; 599 600 /// @} 601 //===--------------------------------------------------------------------===// 602 /// \name Simple mod/ref information 603 /// @{ 604 605 /// Get the ModRef info associated with a pointer argument of a callsite. The 606 /// result's bits are set to indicate the allowed aliasing ModRef kinds. Note 607 /// that these bits do not necessarily account for the overall behavior of 608 /// the function, but rather only provide additional per-argument 609 /// information. 610 virtual ModRefInfo getArgModRefInfo(ImmutableCallSite CS, 611 unsigned ArgIdx) = 0; 612 613 /// Return the behavior of the given call site. 614 virtual FunctionModRefBehavior getModRefBehavior(ImmutableCallSite CS) = 0; 615 616 /// Return the behavior when calling the given function. 617 virtual FunctionModRefBehavior getModRefBehavior(const Function *F) = 0; 618 619 /// getModRefInfo (for call sites) - Return information about whether 620 /// a particular call site modifies or reads the specified memory location. 621 virtual ModRefInfo getModRefInfo(ImmutableCallSite CS, 622 const MemoryLocation &Loc) = 0; 623 624 /// Return information about whether two call sites may refer to the same set 625 /// of memory locations. See the AA documentation for details: 626 /// http://llvm.org/docs/AliasAnalysis.html#ModRefInfo 627 virtual ModRefInfo getModRefInfo(ImmutableCallSite CS1, 628 ImmutableCallSite CS2) = 0; 629 630 /// @} 631 }; 632 633 /// A private class template which derives from \c Concept and wraps some other 634 /// type. 635 /// 636 /// This models the concept by directly forwarding each interface point to the 637 /// wrapped type which must implement a compatible interface. This provides 638 /// a type erased binding. 639 template <typename AAResultT> class AAResults::Model final : public Concept { 640 AAResultT &Result; 641 642 public: 643 explicit Model(AAResultT &Result, AAResults &AAR) : Result(Result) { 644 Result.setAAResults(&AAR); 645 } 646 ~Model() override {} 647 648 void setAAResults(AAResults *NewAAR) override { Result.setAAResults(NewAAR); } 649 650 AliasResult alias(const MemoryLocation &LocA, 651 const MemoryLocation &LocB) override { 652 return Result.alias(LocA, LocB); 653 } 654 655 bool pointsToConstantMemory(const MemoryLocation &Loc, 656 bool OrLocal) override { 657 return Result.pointsToConstantMemory(Loc, OrLocal); 658 } 659 660 ModRefInfo getArgModRefInfo(ImmutableCallSite CS, unsigned ArgIdx) override { 661 return Result.getArgModRefInfo(CS, ArgIdx); 662 } 663 664 FunctionModRefBehavior getModRefBehavior(ImmutableCallSite CS) override { 665 return Result.getModRefBehavior(CS); 666 } 667 668 FunctionModRefBehavior getModRefBehavior(const Function *F) override { 669 return Result.getModRefBehavior(F); 670 } 671 672 ModRefInfo getModRefInfo(ImmutableCallSite CS, 673 const MemoryLocation &Loc) override { 674 return Result.getModRefInfo(CS, Loc); 675 } 676 677 ModRefInfo getModRefInfo(ImmutableCallSite CS1, 678 ImmutableCallSite CS2) override { 679 return Result.getModRefInfo(CS1, CS2); 680 } 681 }; 682 683 /// A CRTP-driven "mixin" base class to help implement the function alias 684 /// analysis results concept. 685 /// 686 /// Because of the nature of many alias analysis implementations, they often 687 /// only implement a subset of the interface. This base class will attempt to 688 /// implement the remaining portions of the interface in terms of simpler forms 689 /// of the interface where possible, and otherwise provide conservatively 690 /// correct fallback implementations. 691 /// 692 /// Implementors of an alias analysis should derive from this CRTP, and then 693 /// override specific methods that they wish to customize. There is no need to 694 /// use virtual anywhere, the CRTP base class does static dispatch to the 695 /// derived type passed into it. 696 template <typename DerivedT> class AAResultBase { 697 // Expose some parts of the interface only to the AAResults::Model 698 // for wrapping. Specifically, this allows the model to call our 699 // setAAResults method without exposing it as a fully public API. 700 friend class AAResults::Model<DerivedT>; 701 702 /// A pointer to the AAResults object that this AAResult is 703 /// aggregated within. May be null if not aggregated. 704 AAResults *AAR; 705 706 /// Helper to dispatch calls back through the derived type. 707 DerivedT &derived() { return static_cast<DerivedT &>(*this); } 708 709 /// A setter for the AAResults pointer, which is used to satisfy the 710 /// AAResults::Model contract. 711 void setAAResults(AAResults *NewAAR) { AAR = NewAAR; } 712 713 protected: 714 /// This proxy class models a common pattern where we delegate to either the 715 /// top-level \c AAResults aggregation if one is registered, or to the 716 /// current result if none are registered. 717 class AAResultsProxy { 718 AAResults *AAR; 719 DerivedT &CurrentResult; 720 721 public: 722 AAResultsProxy(AAResults *AAR, DerivedT &CurrentResult) 723 : AAR(AAR), CurrentResult(CurrentResult) {} 724 725 AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB) { 726 return AAR ? AAR->alias(LocA, LocB) : CurrentResult.alias(LocA, LocB); 727 } 728 729 bool pointsToConstantMemory(const MemoryLocation &Loc, bool OrLocal) { 730 return AAR ? AAR->pointsToConstantMemory(Loc, OrLocal) 731 : CurrentResult.pointsToConstantMemory(Loc, OrLocal); 732 } 733 734 ModRefInfo getArgModRefInfo(ImmutableCallSite CS, unsigned ArgIdx) { 735 return AAR ? AAR->getArgModRefInfo(CS, ArgIdx) : CurrentResult.getArgModRefInfo(CS, ArgIdx); 736 } 737 738 FunctionModRefBehavior getModRefBehavior(ImmutableCallSite CS) { 739 return AAR ? AAR->getModRefBehavior(CS) : CurrentResult.getModRefBehavior(CS); 740 } 741 742 FunctionModRefBehavior getModRefBehavior(const Function *F) { 743 return AAR ? AAR->getModRefBehavior(F) : CurrentResult.getModRefBehavior(F); 744 } 745 746 ModRefInfo getModRefInfo(ImmutableCallSite CS, const MemoryLocation &Loc) { 747 return AAR ? AAR->getModRefInfo(CS, Loc) 748 : CurrentResult.getModRefInfo(CS, Loc); 749 } 750 751 ModRefInfo getModRefInfo(ImmutableCallSite CS1, ImmutableCallSite CS2) { 752 return AAR ? AAR->getModRefInfo(CS1, CS2) : CurrentResult.getModRefInfo(CS1, CS2); 753 } 754 }; 755 756 const TargetLibraryInfo &TLI; 757 758 explicit AAResultBase(const TargetLibraryInfo &TLI) : TLI(TLI) {} 759 760 // Provide all the copy and move constructors so that derived types aren't 761 // constrained. 762 AAResultBase(const AAResultBase &Arg) : TLI(Arg.TLI) {} 763 AAResultBase(AAResultBase &&Arg) : TLI(Arg.TLI) {} 764 765 /// Get a proxy for the best AA result set to query at this time. 766 /// 767 /// When this result is part of a larger aggregation, this will proxy to that 768 /// aggregation. When this result is used in isolation, it will just delegate 769 /// back to the derived class's implementation. 770 AAResultsProxy getBestAAResults() { return AAResultsProxy(AAR, derived()); } 771 772 public: 773 AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB) { 774 return MayAlias; 775 } 776 777 bool pointsToConstantMemory(const MemoryLocation &Loc, bool OrLocal) { 778 return false; 779 } 780 781 ModRefInfo getArgModRefInfo(ImmutableCallSite CS, unsigned ArgIdx) { 782 return MRI_ModRef; 783 } 784 785 FunctionModRefBehavior getModRefBehavior(ImmutableCallSite CS) { 786 if (!CS.hasOperandBundles()) 787 // If CS has operand bundles then aliasing attributes from the function it 788 // calls do not directly apply to the CallSite. This can be made more 789 // precise in the future. 790 if (const Function *F = CS.getCalledFunction()) 791 return getBestAAResults().getModRefBehavior(F); 792 793 return FMRB_UnknownModRefBehavior; 794 } 795 796 FunctionModRefBehavior getModRefBehavior(const Function *F) { 797 return FMRB_UnknownModRefBehavior; 798 } 799 800 ModRefInfo getModRefInfo(ImmutableCallSite CS, const MemoryLocation &Loc); 801 802 ModRefInfo getModRefInfo(ImmutableCallSite CS1, ImmutableCallSite CS2); 803 }; 804 805 /// Synthesize \c ModRefInfo for a call site and memory location by examining 806 /// the general behavior of the call site and any specific information for its 807 /// arguments. 808 /// 809 /// This essentially, delegates across the alias analysis interface to collect 810 /// information which may be enough to (conservatively) fulfill the query. 811 template <typename DerivedT> 812 ModRefInfo AAResultBase<DerivedT>::getModRefInfo(ImmutableCallSite CS, 813 const MemoryLocation &Loc) { 814 auto MRB = getBestAAResults().getModRefBehavior(CS); 815 if (MRB == FMRB_DoesNotAccessMemory) 816 return MRI_NoModRef; 817 818 ModRefInfo Mask = MRI_ModRef; 819 if (AAResults::onlyReadsMemory(MRB)) 820 Mask = MRI_Ref; 821 822 if (AAResults::onlyAccessesArgPointees(MRB)) { 823 bool DoesAlias = false; 824 ModRefInfo AllArgsMask = MRI_NoModRef; 825 if (AAResults::doesAccessArgPointees(MRB)) { 826 for (ImmutableCallSite::arg_iterator AI = CS.arg_begin(), 827 AE = CS.arg_end(); 828 AI != AE; ++AI) { 829 const Value *Arg = *AI; 830 if (!Arg->getType()->isPointerTy()) 831 continue; 832 unsigned ArgIdx = std::distance(CS.arg_begin(), AI); 833 MemoryLocation ArgLoc = MemoryLocation::getForArgument(CS, ArgIdx, TLI); 834 AliasResult ArgAlias = getBestAAResults().alias(ArgLoc, Loc); 835 if (ArgAlias != NoAlias) { 836 ModRefInfo ArgMask = getBestAAResults().getArgModRefInfo(CS, ArgIdx); 837 DoesAlias = true; 838 AllArgsMask = ModRefInfo(AllArgsMask | ArgMask); 839 } 840 } 841 } 842 if (!DoesAlias) 843 return MRI_NoModRef; 844 Mask = ModRefInfo(Mask & AllArgsMask); 845 } 846 847 // If Loc is a constant memory location, the call definitely could not 848 // modify the memory location. 849 if ((Mask & MRI_Mod) && 850 getBestAAResults().pointsToConstantMemory(Loc, /*OrLocal*/ false)) 851 Mask = ModRefInfo(Mask & ~MRI_Mod); 852 853 return Mask; 854 } 855 856 /// Synthesize \c ModRefInfo for two call sites by examining the general 857 /// behavior of the call site and any specific information for its arguments. 858 /// 859 /// This essentially, delegates across the alias analysis interface to collect 860 /// information which may be enough to (conservatively) fulfill the query. 861 template <typename DerivedT> 862 ModRefInfo AAResultBase<DerivedT>::getModRefInfo(ImmutableCallSite CS1, 863 ImmutableCallSite CS2) { 864 // If CS1 or CS2 are readnone, they don't interact. 865 auto CS1B = getBestAAResults().getModRefBehavior(CS1); 866 if (CS1B == FMRB_DoesNotAccessMemory) 867 return MRI_NoModRef; 868 869 auto CS2B = getBestAAResults().getModRefBehavior(CS2); 870 if (CS2B == FMRB_DoesNotAccessMemory) 871 return MRI_NoModRef; 872 873 // If they both only read from memory, there is no dependence. 874 if (AAResults::onlyReadsMemory(CS1B) && AAResults::onlyReadsMemory(CS2B)) 875 return MRI_NoModRef; 876 877 ModRefInfo Mask = MRI_ModRef; 878 879 // If CS1 only reads memory, the only dependence on CS2 can be 880 // from CS1 reading memory written by CS2. 881 if (AAResults::onlyReadsMemory(CS1B)) 882 Mask = ModRefInfo(Mask & MRI_Ref); 883 884 // If CS2 only access memory through arguments, accumulate the mod/ref 885 // information from CS1's references to the memory referenced by 886 // CS2's arguments. 887 if (AAResults::onlyAccessesArgPointees(CS2B)) { 888 ModRefInfo R = MRI_NoModRef; 889 if (AAResults::doesAccessArgPointees(CS2B)) { 890 for (ImmutableCallSite::arg_iterator I = CS2.arg_begin(), 891 E = CS2.arg_end(); 892 I != E; ++I) { 893 const Value *Arg = *I; 894 if (!Arg->getType()->isPointerTy()) 895 continue; 896 unsigned CS2ArgIdx = std::distance(CS2.arg_begin(), I); 897 auto CS2ArgLoc = MemoryLocation::getForArgument(CS2, CS2ArgIdx, TLI); 898 899 // ArgMask indicates what CS2 might do to CS2ArgLoc, and the dependence 900 // of CS1 on that location is the inverse. 901 ModRefInfo ArgMask = 902 getBestAAResults().getArgModRefInfo(CS2, CS2ArgIdx); 903 if (ArgMask == MRI_Mod) 904 ArgMask = MRI_ModRef; 905 else if (ArgMask == MRI_Ref) 906 ArgMask = MRI_Mod; 907 908 ArgMask = ModRefInfo(ArgMask & 909 getBestAAResults().getModRefInfo(CS1, CS2ArgLoc)); 910 911 R = ModRefInfo((R | ArgMask) & Mask); 912 if (R == Mask) 913 break; 914 } 915 } 916 return R; 917 } 918 919 // If CS1 only accesses memory through arguments, check if CS2 references 920 // any of the memory referenced by CS1's arguments. If not, return NoModRef. 921 if (AAResults::onlyAccessesArgPointees(CS1B)) { 922 ModRefInfo R = MRI_NoModRef; 923 if (AAResults::doesAccessArgPointees(CS1B)) { 924 for (ImmutableCallSite::arg_iterator I = CS1.arg_begin(), 925 E = CS1.arg_end(); 926 I != E; ++I) { 927 const Value *Arg = *I; 928 if (!Arg->getType()->isPointerTy()) 929 continue; 930 unsigned CS1ArgIdx = std::distance(CS1.arg_begin(), I); 931 auto CS1ArgLoc = MemoryLocation::getForArgument(CS1, CS1ArgIdx, TLI); 932 933 // ArgMask indicates what CS1 might do to CS1ArgLoc; if CS1 might Mod 934 // CS1ArgLoc, then we care about either a Mod or a Ref by CS2. If CS1 935 // might Ref, then we care only about a Mod by CS2. 936 ModRefInfo ArgMask = getBestAAResults().getArgModRefInfo(CS1, CS1ArgIdx); 937 ModRefInfo ArgR = getBestAAResults().getModRefInfo(CS2, CS1ArgLoc); 938 if (((ArgMask & MRI_Mod) != MRI_NoModRef && 939 (ArgR & MRI_ModRef) != MRI_NoModRef) || 940 ((ArgMask & MRI_Ref) != MRI_NoModRef && 941 (ArgR & MRI_Mod) != MRI_NoModRef)) 942 R = ModRefInfo((R | ArgMask) & Mask); 943 944 if (R == Mask) 945 break; 946 } 947 } 948 return R; 949 } 950 951 return Mask; 952 } 953 954 /// isNoAliasCall - Return true if this pointer is returned by a noalias 955 /// function. 956 bool isNoAliasCall(const Value *V); 957 958 /// isNoAliasArgument - Return true if this is an argument with the noalias 959 /// attribute. 960 bool isNoAliasArgument(const Value *V); 961 962 /// isIdentifiedObject - Return true if this pointer refers to a distinct and 963 /// identifiable object. This returns true for: 964 /// Global Variables and Functions (but not Global Aliases) 965 /// Allocas 966 /// ByVal and NoAlias Arguments 967 /// NoAlias returns (e.g. calls to malloc) 968 /// 969 bool isIdentifiedObject(const Value *V); 970 971 /// isIdentifiedFunctionLocal - Return true if V is umabigously identified 972 /// at the function-level. Different IdentifiedFunctionLocals can't alias. 973 /// Further, an IdentifiedFunctionLocal can not alias with any function 974 /// arguments other than itself, which is not necessarily true for 975 /// IdentifiedObjects. 976 bool isIdentifiedFunctionLocal(const Value *V); 977 978 /// A manager for alias analyses. 979 /// 980 /// This class can have analyses registered with it and when run, it will run 981 /// all of them and aggregate their results into single AA results interface 982 /// that dispatches across all of the alias analysis results available. 983 /// 984 /// Note that the order in which analyses are registered is very significant. 985 /// That is the order in which the results will be aggregated and queried. 986 /// 987 /// This manager effectively wraps the AnalysisManager for registering alias 988 /// analyses. When you register your alias analysis with this manager, it will 989 /// ensure the analysis itself is registered with its AnalysisManager. 990 class AAManager { 991 public: 992 typedef AAResults Result; 993 994 // This type hase value semantics. We have to spell these out because MSVC 995 // won't synthesize them. 996 AAManager() {} 997 AAManager(AAManager &&Arg) 998 : FunctionResultGetters(std::move(Arg.FunctionResultGetters)) {} 999 AAManager(const AAManager &Arg) 1000 : FunctionResultGetters(Arg.FunctionResultGetters) {} 1001 AAManager &operator=(AAManager &&RHS) { 1002 FunctionResultGetters = std::move(RHS.FunctionResultGetters); 1003 return *this; 1004 } 1005 AAManager &operator=(const AAManager &RHS) { 1006 FunctionResultGetters = RHS.FunctionResultGetters; 1007 return *this; 1008 } 1009 1010 /// Register a specific AA result. 1011 template <typename AnalysisT> void registerFunctionAnalysis() { 1012 FunctionResultGetters.push_back(&getFunctionAAResultImpl<AnalysisT>); 1013 } 1014 1015 Result run(Function &F, AnalysisManager<Function> &AM) { 1016 Result R; 1017 for (auto &Getter : FunctionResultGetters) 1018 (*Getter)(F, AM, R); 1019 return R; 1020 } 1021 1022 private: 1023 SmallVector<void (*)(Function &F, AnalysisManager<Function> &AM, 1024 AAResults &AAResults), 1025 4> FunctionResultGetters; 1026 1027 template <typename AnalysisT> 1028 static void getFunctionAAResultImpl(Function &F, 1029 AnalysisManager<Function> &AM, 1030 AAResults &AAResults) { 1031 AAResults.addAAResult(AM.template getResult<AnalysisT>(F)); 1032 } 1033 }; 1034 1035 /// A wrapper pass to provide the legacy pass manager access to a suitably 1036 /// prepared AAResults object. 1037 class AAResultsWrapperPass : public FunctionPass { 1038 std::unique_ptr<AAResults> AAR; 1039 1040 public: 1041 static char ID; 1042 1043 AAResultsWrapperPass(); 1044 1045 AAResults &getAAResults() { return *AAR; } 1046 const AAResults &getAAResults() const { return *AAR; } 1047 1048 bool runOnFunction(Function &F) override; 1049 1050 void getAnalysisUsage(AnalysisUsage &AU) const override; 1051 }; 1052 1053 FunctionPass *createAAResultsWrapperPass(); 1054 1055 /// A wrapper pass around a callback which can be used to populate the 1056 /// AAResults in the AAResultsWrapperPass from an external AA. 1057 /// 1058 /// The callback provided here will be used each time we prepare an AAResults 1059 /// object, and will receive a reference to the function wrapper pass, the 1060 /// function, and the AAResults object to populate. This should be used when 1061 /// setting up a custom pass pipeline to inject a hook into the AA results. 1062 ImmutablePass *createExternalAAWrapperPass( 1063 std::function<void(Pass &, Function &, AAResults &)> Callback); 1064 1065 /// A helper for the legacy pass manager to create a \c AAResults 1066 /// object populated to the best of our ability for a particular function when 1067 /// inside of a \c ModulePass or a \c CallGraphSCCPass. 1068 AAResults createLegacyPMAAResults(Pass &P, Function &F, BasicAAResult &BAR); 1069 1070 } // End llvm namespace 1071 1072 #endif 1073