diff options
| -rw-r--r-- | llvm/include/llvm/Analysis/DXILResource.h | 40 | ||||
| -rw-r--r-- | llvm/lib/Target/DirectX/DXILMetadata.cpp | 5 | ||||
| -rw-r--r-- | llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp | 40 | ||||
| -rw-r--r-- | llvm/test/CodeGen/DirectX/CreateHandle.ll | 10 | ||||
| -rw-r--r-- | llvm/test/CodeGen/DirectX/CreateHandleFromBinding.ll | 10 |
5 files changed, 95 insertions, 10 deletions
diff --git a/llvm/include/llvm/Analysis/DXILResource.h b/llvm/include/llvm/Analysis/DXILResource.h index d9b4e96..58db0a9 100644 --- a/llvm/include/llvm/Analysis/DXILResource.h +++ b/llvm/include/llvm/Analysis/DXILResource.h @@ -280,6 +280,46 @@ public: : (Resources.begin() + Pos->second); } + iterator srv_begin() { return begin(); } + const_iterator srv_begin() const { return begin(); } + iterator srv_end() { return begin() + FirstUAV; } + const_iterator srv_end() const { return begin() + FirstUAV; } + iterator_range<iterator> srvs() { return make_range(srv_begin(), srv_end()); } + iterator_range<const_iterator> srvs() const { + return make_range(srv_begin(), srv_end()); + } + + iterator uav_begin() { return begin() + FirstUAV; } + const_iterator uav_begin() const { return begin() + FirstUAV; } + iterator uav_end() { return begin() + FirstCBuffer; } + const_iterator uav_end() const { return begin() + FirstCBuffer; } + iterator_range<iterator> uavs() { return make_range(uav_begin(), uav_end()); } + iterator_range<const_iterator> uavs() const { + return make_range(uav_begin(), uav_end()); + } + + iterator cbuffer_begin() { return begin() + FirstCBuffer; } + const_iterator cbuffer_begin() const { return begin() + FirstCBuffer; } + iterator cbuffer_end() { return begin() + FirstSampler; } + const_iterator cbuffer_end() const { return begin() + FirstSampler; } + iterator_range<iterator> cbuffers() { + return make_range(cbuffer_begin(), cbuffer_end()); + } + iterator_range<const_iterator> cbuffers() const { + return make_range(cbuffer_begin(), cbuffer_end()); + } + + iterator sampler_begin() { return begin() + FirstSampler; } + const_iterator sampler_begin() const { return begin() + FirstSampler; } + iterator sampler_end() { return end(); } + const_iterator sampler_end() const { return end(); } + iterator_range<iterator> samplers() { + return make_range(sampler_begin(), sampler_end()); + } + iterator_range<const_iterator> samplers() const { + return make_range(sampler_begin(), sampler_end()); + } + void print(raw_ostream &OS) const; }; diff --git a/llvm/lib/Target/DirectX/DXILMetadata.cpp b/llvm/lib/Target/DirectX/DXILMetadata.cpp index ed0434a..1f5759c 100644 --- a/llvm/lib/Target/DirectX/DXILMetadata.cpp +++ b/llvm/lib/Target/DirectX/DXILMetadata.cpp @@ -284,6 +284,11 @@ void dxil::createEntryMD(Module &M, const uint64_t ShaderFlags) { EntryList.emplace_back(&F); } + // If there are no entries, do nothing. This is mostly to allow for writing + // tests with no actual entry functions. + if (EntryList.empty()) + return; + auto &Ctx = M.getContext(); // FIXME: generate metadata for resource. // See https://github.com/llvm/llvm-project/issues/57926. diff --git a/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp b/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp index 007af0b4..2c6d201 100644 --- a/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp +++ b/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp @@ -13,27 +13,45 @@ #include "DXILShaderFlags.h" #include "DirectX.h" #include "llvm/ADT/StringSet.h" +#include "llvm/Analysis/DXILResource.h" #include "llvm/IR/Constants.h" #include "llvm/IR/Metadata.h" #include "llvm/IR/Module.h" +#include "llvm/InitializePasses.h" #include "llvm/Pass.h" #include "llvm/TargetParser/Triple.h" using namespace llvm; using namespace llvm::dxil; -static void emitResourceMetadata(Module &M, +static void emitResourceMetadata(Module &M, const DXILResourceMap &DRM, const dxil::Resources &MDResources) { - Metadata *SRVMD = nullptr, *UAVMD = nullptr, *CBufMD = nullptr, - *SmpMD = nullptr; - bool HasResources = false; + LLVMContext &Context = M.getContext(); + + SmallVector<Metadata *> SRVs, UAVs, CBufs, Smps; + for (const ResourceInfo &RI : DRM.srvs()) + SRVs.push_back(RI.getAsMetadata(Context)); + for (const ResourceInfo &RI : DRM.uavs()) + UAVs.push_back(RI.getAsMetadata(Context)); + for (const ResourceInfo &RI : DRM.cbuffers()) + CBufs.push_back(RI.getAsMetadata(Context)); + for (const ResourceInfo &RI : DRM.samplers()) + Smps.push_back(RI.getAsMetadata(Context)); + + Metadata *SRVMD = SRVs.empty() ? nullptr : MDNode::get(Context, SRVs); + Metadata *UAVMD = UAVs.empty() ? nullptr : MDNode::get(Context, UAVs); + Metadata *CBufMD = CBufs.empty() ? nullptr : MDNode::get(Context, CBufs); + Metadata *SmpMD = Smps.empty() ? nullptr : MDNode::get(Context, Smps); + bool HasResources = !DRM.empty(); if (MDResources.hasUAVs()) { + assert(!UAVMD && "Old and new UAV representations can't coexist"); UAVMD = MDResources.writeUAVs(M); HasResources = true; } if (MDResources.hasCBuffers()) { + assert(!CBufMD && "Old and new cbuffer representations can't coexist"); CBufMD = MDResources.writeCBuffers(M); HasResources = true; } @@ -46,7 +64,8 @@ static void emitResourceMetadata(Module &M, MDNode::get(M.getContext(), {SRVMD, UAVMD, CBufMD, SmpMD})); } -static void translateMetadata(Module &M, const dxil::Resources &MDResources, +static void translateMetadata(Module &M, const DXILResourceMap &DRM, + const dxil::Resources &MDResources, const ComputedShaderFlags &ShaderFlags) { dxil::ValidatorVersionMD ValVerMD(M); if (ValVerMD.isEmpty()) @@ -54,18 +73,19 @@ static void translateMetadata(Module &M, const dxil::Resources &MDResources, dxil::createShaderModelMD(M); dxil::createDXILVersionMD(M); - emitResourceMetadata(M, MDResources); + emitResourceMetadata(M, DRM, MDResources); dxil::createEntryMD(M, static_cast<uint64_t>(ShaderFlags)); } PreservedAnalyses DXILTranslateMetadata::run(Module &M, ModuleAnalysisManager &MAM) { + const DXILResourceMap &DRM = MAM.getResult<DXILResourceAnalysis>(M); const dxil::Resources &MDResources = MAM.getResult<DXILResourceMDAnalysis>(M); const ComputedShaderFlags &ShaderFlags = MAM.getResult<ShaderFlagsAnalysis>(M); - translateMetadata(M, MDResources, ShaderFlags); + translateMetadata(M, DRM, MDResources, ShaderFlags); return PreservedAnalyses::all(); } @@ -80,17 +100,20 @@ public: void getAnalysisUsage(AnalysisUsage &AU) const override { AU.setPreservesAll(); + AU.addRequired<DXILResourceWrapperPass>(); AU.addRequired<DXILResourceMDWrapper>(); AU.addRequired<ShaderFlagsAnalysisWrapper>(); } bool runOnModule(Module &M) override { + const DXILResourceMap &DRM = + getAnalysis<DXILResourceWrapperPass>().getResourceMap(); const dxil::Resources &MDResources = getAnalysis<DXILResourceMDWrapper>().getDXILResource(); const ComputedShaderFlags &ShaderFlags = getAnalysis<ShaderFlagsAnalysisWrapper>().getShaderFlags(); - translateMetadata(M, MDResources, ShaderFlags); + translateMetadata(M, DRM, MDResources, ShaderFlags); return true; } }; @@ -105,6 +128,7 @@ ModulePass *llvm::createDXILTranslateMetadataLegacyPass() { INITIALIZE_PASS_BEGIN(DXILTranslateMetadataLegacy, "dxil-translate-metadata", "DXIL Translate Metadata", false, false) +INITIALIZE_PASS_DEPENDENCY(DXILResourceWrapperPass) INITIALIZE_PASS_DEPENDENCY(DXILResourceMDWrapper) INITIALIZE_PASS_DEPENDENCY(ShaderFlagsAnalysisWrapper) INITIALIZE_PASS_END(DXILTranslateMetadataLegacy, "dxil-translate-metadata", diff --git a/llvm/test/CodeGen/DirectX/CreateHandle.ll b/llvm/test/CodeGen/DirectX/CreateHandle.ll index 13d59c6..55e72e1 100644 --- a/llvm/test/CodeGen/DirectX/CreateHandle.ll +++ b/llvm/test/CodeGen/DirectX/CreateHandle.ll @@ -1,4 +1,4 @@ -; RUN: opt -S -dxil-op-lower %s | FileCheck %s +; RUN: opt -S -passes=dxil-op-lower,dxil-translate-metadata %s | FileCheck %s target triple = "dxil-pc-shadermodel6.0-compute" @@ -50,4 +50,12 @@ define void @test_buffers() { ret void } +; Just check that we have the right types and number of metadata nodes, the +; contents of the metadata are tested elsewhere. +; +; CHECK: !dx.resources = !{[[RESMD:![0-9]+]]} +; CHECK: [[RESMD]] = !{[[SRVMD:![0-9]+]], [[UAVMD:![0-9]+]], null, null} +; CHECK-DAG: [[SRVMD]] = !{!{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}} +; CHECK-DAG: [[UAVMD]] = !{!{{[0-9]+}}, !{{[0-9]+}}} + attributes #0 = { nocallback nofree nosync nounwind willreturn memory(none) } diff --git a/llvm/test/CodeGen/DirectX/CreateHandleFromBinding.ll b/llvm/test/CodeGen/DirectX/CreateHandleFromBinding.ll index e78a0bf..c8f9f05 100644 --- a/llvm/test/CodeGen/DirectX/CreateHandleFromBinding.ll +++ b/llvm/test/CodeGen/DirectX/CreateHandleFromBinding.ll @@ -1,4 +1,4 @@ -; RUN: opt -S -dxil-op-lower %s | FileCheck %s +; RUN: opt -S -passes=dxil-op-lower,dxil-translate-metadata %s | FileCheck %s target triple = "dxil-pc-shadermodel6.6-compute" @@ -55,4 +55,12 @@ define void @test_bindings() { ret void } +; Just check that we have the right types and number of metadata nodes, the +; contents of the metadata are tested elsewhere. +; +; CHECK: !dx.resources = !{[[RESMD:![0-9]+]]} +; CHECK: [[RESMD]] = !{[[SRVMD:![0-9]+]], [[UAVMD:![0-9]+]], null, null} +; CHECK-DAG: [[SRVMD]] = !{!{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}} +; CHECK-DAG: [[UAVMD]] = !{!{{[0-9]+}}, !{{[0-9]+}}} + attributes #0 = { nocallback nofree nosync nounwind willreturn memory(none) } |
