43 "llvm.OpenCL.sampler.get.resource.id";
50 "kernel_arg_addr_space",
51 "kernel_arg_access_qual",
53 "kernel_arg_base_type",
54 "kernel_arg_type_qual"};
68 return TypeString ==
"image2d_t" || TypeString ==
"image3d_t";
73 return TypeString ==
"sampler_t";
81 size_t NumOps =
Node->getNumOperands();
85 auto F = mdconst::dyn_extract<Function>(
Node->getOperand(0));
90 size_t ExpectNumArgNodeOps =
F->arg_size() + 1;
92 MDNode *ArgNode = dyn_cast_or_null<MDNode>(
Node->getOperand(i + 1));
111 return cast<MDString>(ArgAQNode->
getOperand(ArgIdx + 1))->getString();
117 return cast<MDString>(ArgTypeNode->
getOperand(ArgIdx + 1))->getString();
125 Res.push_back(
Node->getOperand(OpIdx));
134 MD.ArgVector[i].push_back(V[i]);
140class R600OpenCLImageTypeLoweringPass :
public ModulePass {
146 Type *ImageFormatType;
154 for (
auto &
Use : ImageArg.
uses()) {
155 auto Inst = dyn_cast<CallInst>(
Use.
getUser());
164 Value *Replacement =
nullptr;
169 Replacement = &ImageSizeArg;
171 Replacement = &ImageFormatArg;
187 for (
const auto &
Use : SamplerArg.
uses()) {
188 auto Inst = dyn_cast<CallInst>(
Use.
getUser());
197 Value *Replacement =
nullptr;
205 Inst->replaceAllUsesWith(Replacement);
219 InstsToErase.
clear();
220 for (
auto ArgI =
F->arg_begin(); ArgI !=
F->arg_end(); ++ArgI) {
228 if (AccessQual ==
"read_only") {
229 ResourceID = NumReadOnlyImageArgs++;
230 }
else if (AccessQual ==
"write_only") {
231 ResourceID = NumWriteOnlyImageArgs++;
238 Modified |= replaceImageUses(Arg, ResourceID, SizeArg, FormatArg);
242 uint32_t ResourceID = NumSamplerArgs++;
243 Modified |= replaceSamplerUses(Arg, ResourceID);
246 for (
unsigned i = 0; i < InstsToErase.
size(); ++i) {
247 InstsToErase[i]->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);
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...
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 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 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.