44 "llvm.OpenCL.sampler.get.resource.id";
51 "kernel_arg_addr_space",
52 "kernel_arg_access_qual",
54 "kernel_arg_base_type",
55 "kernel_arg_type_qual"};
69 return TypeString ==
"image2d_t" || TypeString ==
"image3d_t";
74 return TypeString ==
"sampler_t";
82 size_t NumOps =
Node->getNumOperands();
86 auto *
F = mdconst::dyn_extract<Function>(
Node->getOperand(0));
91 size_t ExpectNumArgNodeOps =
F->arg_size() + 1;
93 MDNode *ArgNode = dyn_cast_or_null<MDNode>(
Node->getOperand(i + 1));
112 return cast<MDString>(ArgAQNode->
getOperand(ArgIdx + 1))->getString();
118 return cast<MDString>(ArgTypeNode->
getOperand(ArgIdx + 1))->getString();
126 Res.push_back(
Node->getOperand(OpIdx));
135 MD.ArgVector[i].push_back(V[i]);
141class R600OpenCLImageTypeLoweringPass :
public ModulePass {
147 Type *ImageFormatType;
155 for (
auto &
Use : ImageArg.
uses()) {
156 auto *Inst = dyn_cast<CallInst>(
Use.
getUser());
165 Value *Replacement =
nullptr;
168 Replacement = ConstantInt::get(Int32Type, ResourceID);
170 Replacement = &ImageSizeArg;
172 Replacement = &ImageFormatArg;
188 for (
const auto &
Use : SamplerArg.
uses()) {
189 auto *Inst = dyn_cast<CallInst>(
Use.
getUser());
198 Value *Replacement =
nullptr;
201 Replacement = ConstantInt::get(Int32Type, ResourceID);
206 Inst->replaceAllUsesWith(Replacement);
220 InstsToErase.
clear();
221 for (
auto *ArgI =
F->arg_begin(); ArgI !=
F->arg_end(); ++ArgI) {
229 if (AccessQual ==
"read_only") {
230 ResourceID = NumReadOnlyImageArgs++;
231 }
else if (AccessQual ==
"write_only") {
232 ResourceID = NumWriteOnlyImageArgs++;
239 Modified |= replaceImageUses(Arg, ResourceID, SizeArg, FormatArg);
243 uint32_t ResourceID = NumSamplerArgs++;
244 Modified |= replaceSamplerUses(Arg, ResourceID);
247 for (
auto *Inst : InstsToErase)
248 Inst->eraseFromParent();
253 std::tuple<Function *, MDNode *>
261 KernelArgMD NewArgMDs;
265 for (
unsigned i = 0; i < FT->getNumParams(); ++i) {
267 MDVector ArgMD =
GetArgMD(KernelMDNode, i + 1);
286 return std::tuple(
nullptr,
nullptr);
293 auto *NewFArgIt = NewF->arg_begin();
294 for (
auto &Arg:
F->args()) {
296 NewFArgIt->setName(ArgName);
297 VMap[&Arg] = &(*NewFArgIt++);
299 (NewFArgIt++)->setName(
Twine(
"__size_") + ArgName);
300 (NewFArgIt++)->setName(
Twine(
"__format_") + ArgName);
310 for (
const MDVector &MDV : NewArgMDs.ArgVector)
314 return std::tuple(NewF, NewMDNode);
317 bool transformKernels(
Module &M) {
331 std::tie(NewF, NewMDNode) = addImplicitArgs(
F, KernelMDNode);
334 F->eraseFromParent();
335 M.getFunctionList().push_back(NewF);
341 KernelMDNode = NewMDNode;
345 Modified |= replaceImageAndSamplerUses(
F, KernelMDNode);
355 Context = &
M.getContext();
360 return transformKernels(M);
364 return "R600 OpenCL Image Type Pass";
370char R600OpenCLImageTypeLoweringPass::ID = 0;
373 return new R600OpenCLImageTypeLoweringPass();
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Module.h This file contains the declarations for the Module class.
static bool IsImageType(StringRef TypeString)
static StringRef KernelsMDNodeName
static StringRef ArgTypeFromMD(MDNode *KernelMDNode, unsigned ArgIdx)
static StringRef GetImageSizeFunc
static StringRef GetSamplerResourceIDFunc
static const unsigned NumKernelArgMDNodes
static Function * GetFunctionFromMDNode(MDNode *Node)
static bool IsSamplerType(StringRef TypeString)
static void PushArgMD(KernelArgMD &MD, const MDVector &V)
static StringRef AccessQualFromMD(MDNode *KernelMDNode, unsigned ArgIdx)
static StringRef GetImageFormatFunc
static StringRef KernelArgMDNodeNames[]
static StringRef ImageSizeArgMDType
static MDVector GetArgMD(MDNode *KernelMDNode, unsigned OpIdx)
static StringRef GetImageResourceIDFunc
static StringRef ImageFormatArgMDType
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallVector class.
This class represents an incoming formal argument to a Function.
unsigned getArgNo() const
Return the index of this formal argument in its containing function.
static ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
static FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
FunctionType * getFunctionType() const
Returns the FunctionType for me.
AttributeList getAttributes() const
Return the attribute list for this Function.
This is an important class for using LLVM in a threaded context.
const MDOperand & getOperand(unsigned I) const
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
unsigned getNumOperands() const
Return number of MDNode operands.
StringRef getString() const
static MDString * get(LLVMContext &Context, StringRef Str)
ModulePass class - This class is used to implement unstructured interprocedural optimizations and ana...
virtual bool runOnModule(Module &M)=0
runOnModule - Virtual method overriden by subclasses to process the module being operated on.
A Module instance is used to store all the information related to an LLVM module.
void setOperand(unsigned I, MDNode *New)
MDNode * getOperand(unsigned i) const
unsigned getNumOperands() const
virtual StringRef getPassName() const
getPassName - Return a nice clean name for a pass.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
static IntegerType * getInt32Ty(LLVMContext &C)
A Use represents the edge between a Value definition and its users.
User * getUser() const
Returns the User that contains this Use.
LLVM Value Representation.
void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
iterator_range< use_iterator > uses()
StringRef getName() const
Return a constant reference to the value's name.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
This is an optimization pass for GlobalISel generic memory operations.
ModulePass * createR600OpenCLImageTypeLoweringPass()
void CloneFunctionInto(Function *NewFunc, const Function *OldFunc, ValueToValueMapTy &VMap, CloneFunctionChangeType Changes, 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.