59 "llvm.OpenCL.sampler.get.resource.id";
66 "kernel_arg_addr_space",
67 "kernel_arg_access_qual",
69 "kernel_arg_base_type",
70 "kernel_arg_type_qual"};
84 return TypeString ==
"image2d_t" || TypeString ==
"image3d_t";
89 return TypeString ==
"sampler_t";
98 if (NumOps != NumKernelArgMDNodes + 1)
101 auto F = mdconst::dyn_extract<Function>(Node->
getOperand(0));
106 size_t ExpectNumArgNodeOps =
F->arg_size() + 1;
117 if (!StringNode || StringNode->
getString() != KernelArgMDNodeNames[i])
127 return cast<MDString>(ArgAQNode->
getOperand(ArgIdx + 1))->getString();
133 return cast<MDString>(ArgTypeNode->
getOperand(ArgIdx + 1))->getString();
150 MD.ArgVector[i].push_back(V[i]);
156 class R600OpenCLImageTypeLoweringPass :
public ModulePass {
162 Type *ImageFormatType;
170 for (
auto &
Use : ImageArg.
uses()) {
180 Value *Replacement =
nullptr;
182 if (Name.
startswith(GetImageResourceIDFunc)) {
184 }
else if (Name.
startswith(GetImageSizeFunc)) {
185 Replacement = &ImageSizeArg;
186 }
else if (Name.
startswith(GetImageFormatFunc)) {
187 Replacement = &ImageFormatArg;
203 for (
const auto &
Use : SamplerArg.
uses()) {
213 Value *Replacement =
nullptr;
215 if (Name == GetSamplerResourceIDFunc) {
221 Inst->replaceAllUsesWith(Replacement);
235 InstsToErase.
clear();
244 if (AccessQual ==
"read_only") {
245 ResourceID = NumReadOnlyImageArgs++;
246 }
else if (AccessQual ==
"write_only") {
247 ResourceID = NumWriteOnlyImageArgs++;
254 Modified |= replaceImageUses(Arg, ResourceID, SizeArg, FormatArg);
258 uint32_t ResourceID = NumSamplerArgs++;
259 Modified |= replaceSamplerUses(Arg, ResourceID);
262 for (
unsigned i = 0; i < InstsToErase.
size(); ++i) {
263 InstsToErase[i]->eraseFromParent();
269 std::tuple<Function *, MDNode *>
277 KernelArgMD NewArgMDs;
283 MDVector ArgMD =
GetArgMD(KernelMDNode, i + 1);
291 ArgMD[2] = ArgMD[3] =
MDString::get(*Context, ImageSizeArgMDType);
296 ArgMD[2] = ArgMD[3] =
MDString::get(*Context, ImageFormatArgMDType);
302 return std::make_tuple(
nullptr,
nullptr);
309 auto NewFArgIt = NewF->arg_begin();
312 NewFArgIt->setName(ArgName);
313 VMap[&
Arg] = &(*NewFArgIt++);
315 (NewFArgIt++)->setName(
Twine(
"__size_") + ArgName);
316 (NewFArgIt++)->setName(
Twine(
"__format_") + ArgName);
329 return std::make_tuple(NewF, NewMDNode);
332 bool transformKernels(
Module &M) {
346 std::tie(NewF, NewMDNode) = addImplicitArgs(F, KernelMDNode);
356 KernelMDNode = NewMDNode;
360 Modified |= replaceImageAndSamplerUses(F, KernelMDNode);
367 R600OpenCLImageTypeLoweringPass() :
ModulePass(ID) {}
369 bool runOnModule(
Module &M)
override {
375 return transformKernels(M);
379 return "R600 OpenCL Image Type Pass";
388 return new R600OpenCLImageTypeLoweringPass();
iterator_range< use_iterator > uses()
This class represents an incoming formal argument to a Function.
MDNode * getOperand(unsigned i) const
static StringRef AccessQualFromMD(MDNode *KernelMDNode, unsigned ArgIdx)
This class represents lattice values for constants.
Type * getParamType(unsigned i) const
Parameter type accessors.
Constant * getOrInsertFunction(StringRef Name, FunctionType *T, AttributeList AttributeList)
Look up the specified function in the module symbol table.
static StringRef GetImageFormatFunc
A Module instance is used to store all the information related to an LLVM module. ...
ModulePass * createR600OpenCLImageTypeLoweringPass()
static MDString * get(LLVMContext &Context, StringRef Str)
void push_back(const T &Elt)
This class represents a function call, abstracting a target machine's calling convention.
const MDOperand & getOperand(unsigned I) const
This defines the Use class.
static StringRef ImageFormatArgMDType
void setOperand(unsigned I, MDNode *New)
static StringRef KernelsMDNodeName
static StringRef GetSamplerResourceIDFunc
void CloneFunctionInto(Function *NewFunc, const Function *OldFunc, ValueToValueMapTy &VMap, bool ModuleLevelChanges, SmallVectorImpl< ReturnInst *> &Returns, const char *NameSuffix="", ClonedCodeInfo *CodeInfo=nullptr, ValueMapTypeRemapper *TypeMapper=nullptr, ValueMaterializer *Materializer=nullptr)
Clone OldFunc into NewFunc, transforming the old arguments into references to VMap values...
amdgpu Simplify well known AMD library false Value Value const Twine & Name
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
LLVMContext & getContext() const
Get the global data context.
A Use represents the edge between a Value definition and its users.
static bool IsImageType(StringRef TypeString)
unsigned getNumOperands() const
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE bool startswith(StringRef Prefix) const
Check if this string starts with the given Prefix.
User * getUser() const LLVM_READONLY
Returns the User that contains this Use.
Class to represent function types.
NamedMDNode * getNamedMetadata(const Twine &Name) const
Return the first NamedMDNode in the module with the specified name.
static StringRef ImageSizeArgMDType
AttributeList getAttributes() const
Return the attribute list for this Function.
LinkageTypes getLinkage() const
void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
StringRef getString() const
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata *> MDs)
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
const FunctionListType & getFunctionList() const
Get the Module's list of functions (constant).
The instances of the Type class are immutable: once they are created, they are never changed...
This is an important class for using LLVM in a threaded context.
static MDVector GetArgMD(MDNode *KernelMDNode, unsigned OpIdx)
This file contains the declarations for the subclasses of Constant, which represent the different fla...
unsigned getNumParams() const
Return the number of fixed parameters this function type requires.
static FunctionType * get(Type *Result, ArrayRef< Type *> Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
static void PushArgMD(KernelArgMD &MD, const MDVector &V)
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small...
Module.h This file contains the declarations for the Module class.
Type * getReturnType() const
static Constant * get(Type *Ty, uint64_t V, bool isSigned=false)
If Ty is a vector type, return a Constant with a splat of the given value.
static StringRef KernelArgMDNodeNames[]
FunctionType * getFunctionType() const
Returns the FunctionType for me.
void push_back(pointer val)
static const unsigned NumKernelArgMDNodes
static StringRef GetImageResourceIDFunc
unsigned getArgNo() const
Return the index of this formal argument in its containing function.
amdgpu Simplify well known AMD library false Value Value * Arg
static IntegerType * getInt32Ty(LLVMContext &C)
StringRef getName() const
Return a constant reference to the value's name.
ModulePass class - This class is used to implement unstructured interprocedural optimizations and ana...
static ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
LLVM_NODISCARD std::enable_if<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
static Function * GetFunctionFromMDNode(MDNode *Node)
void eraseFromParent()
eraseFromParent - This method unlinks 'this' from the containing module and deletes it...
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
LLVM Value Representation.
StringRef - Represent a constant reference to a string, i.e.
static bool IsSamplerType(StringRef TypeString)
static StringRef GetImageSizeFunc
unsigned getNumOperands() const
Return number of MDNode operands.
static StringRef ArgTypeFromMD(MDNode *KernelMDNode, unsigned ArgIdx)
iterator_range< arg_iterator > args()