1//===- AMDGPUAliasAnalysis ------------------------------------------------===//
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
7//===----------------------------------------------------------------------===//
9/// This is the AMGPU address space based alias analysis pass.
10//===----------------------------------------------------------------------===//
19 #define DEBUG_TYPE "amdgpu-aa"
23// Register this pass...
28 "AMDGPU Address space based Alias Analysis",
false,
true)
31 "AMDGPU Address space based Alias Analysis Wrapper",
false,
true)
56 // In general, FLAT (generic) pointers could be aliased to LOCAL or PRIVATE
57 // pointers. However, as LOCAL or PRIVATE pointers point to local objects, in
58 // certain cases, it's still viable to check whether a FLAT pointer won't
59 // alias to a LOCAL or PRIVATE pointer.
62 // Canonicalize the location order to simplify the following alias check.
72 // If a generic pointer is loaded from the constant address space, it
73 // could only be a GLOBAL or CONSTANT one as that address space is solely
74 // prepared on the host side, where only GLOBAL or CONSTANT variables are
75 // visible. Note that this even holds for regular functions.
80 switch (
F->getCallingConv()) {
82 // In the kernel function, kernel arguments won't alias to (local)
83 // variables in shared or private address space.
90 // TODO: In the regular function, if that local variable in the
91 // location B is not captured, that argument pointer won't alias to it
104 unsigned AS =
Loc.Ptr->getType()->getPointerAddressSpace();
110 AS =
Base->getType()->getPointerAddressSpace();
This is the AMGPU address space based alias analysis pass.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
This class stores info we want to provide to or retain within an alias query.
AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB, AAQueryInfo &AAQI, const Instruction *CtxI)
ModRefInfo getModRefInfoMask(const MemoryLocation &Loc, AAQueryInfo &AAQI, bool IgnoreLocals)
Legacy wrapper pass to provide the AMDGPUAAResult object.
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
The possible results of an alias query.
@ MayAlias
The two locations may or may not alias.
@ NoAlias
The two locations do not alias at all.
Represent the analysis usage information of a pass.
void setPreservesAll()
Set by analyses that do not transform their input at all.
This class represents an incoming formal argument to a Function.
ImmutablePass class - This class is used to provide information that does not need to be run.
An instruction for reading from memory.
Representation for a specific memory location.
const Value * Ptr
The address of the start of the location.
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
@ CONSTANT_ADDRESS_32BIT
Address space for 32-bit constant memory.
@ LOCAL_ADDRESS
Address space for local memory.
@ CONSTANT_ADDRESS
Address space for constant memory (VTX2).
@ FLAT_ADDRESS
Address space for flat memory.
@ PRIVATE_ADDRESS
Address space for private memory.
static bool addrspacesMayAlias(unsigned AS1, unsigned AS2)
@ AMDGPU_KERNEL
Used for AMDGPU code object kernels.
This is an optimization pass for GlobalISel generic memory operations.
ImmutablePass * createAMDGPUAAWrapperPass()
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
ModRefInfo
Flags indicating whether a memory access modifies or references memory.
@ ModRef
The access may reference and may modify the value stored in memory.
@ NoModRef
The access neither references nor modifies the value stored in memory.
ImmutablePass * createAMDGPUExternalAAWrapperPass()
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
LLVM_ABI bool isIdentifiedObject(const Value *V)
Return true if this pointer refers to a distinct and identifiable object.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
A special type used by analysis passes to provide an address that identifies that particular analysis...