aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/Analysis/DXILResource.h40
-rw-r--r--llvm/lib/Target/DirectX/DXILMetadata.cpp5
-rw-r--r--llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp40
-rw-r--r--llvm/test/CodeGen/DirectX/CreateHandle.ll10
-rw-r--r--llvm/test/CodeGen/DirectX/CreateHandleFromBinding.ll10
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) }