[llvm-branch-commits] [DirectX] Implement metadata lowering for resources (PR #104447)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Aug 15 07:52:18 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-directx
Author: Justin Bogner (bogner)
<details>
<summary>Changes</summary>
Generate metadata from target extension type based resources.
Part of #<!-- -->91366
---
Full diff: https://github.com/llvm/llvm-project/pull/104447.diff
3 Files Affected:
- (modified) llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp (+39-8)
- (modified) llvm/test/CodeGen/DirectX/CreateHandle.ll (+9-1)
- (modified) llvm/test/CodeGen/DirectX/CreateHandleFromBinding.ll (+9-1)
``````````diff
diff --git a/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp b/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp
index 007af0b46b9f3..f8621eea23448 100644
--- a/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp
+++ b/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp
@@ -13,27 +13,52 @@
#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 (auto [_, RI] : DRM) {
+ switch (RI.getResourceClass()) {
+ case dxil::ResourceClass::SRV:
+ SRVs.push_back(RI.getAsMetadata(Context));
+ break;
+ case dxil::ResourceClass::UAV:
+ UAVs.push_back(RI.getAsMetadata(Context));
+ break;
+ case dxil::ResourceClass::CBuffer:
+ CBufs.push_back(RI.getAsMetadata(Context));
+ break;
+ case dxil::ResourceClass::Sampler:
+ Smps.push_back(RI.getAsMetadata(Context));
+ break;
+ }
+ }
+ 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 +71,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 +80,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 +107,20 @@ class DXILTranslateMetadataLegacy : public ModulePass {
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 +135,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 1fad869ab4305..f0d1c8da5a425 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"
@@ -40,6 +40,14 @@ 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]+}}}
+; CHECK-DAG: [[UAVMD]] = !{!{{[0-9]+}}, !{{[0-9]+}}}
+
; Note: We need declarations for each handle.fromBinding in the same order as
; they appear in source to force a deterministic ordering of record IDs.
declare target("dx.TypedBuffer", <4 x float>, 1, 0, 0)
diff --git a/llvm/test/CodeGen/DirectX/CreateHandleFromBinding.ll b/llvm/test/CodeGen/DirectX/CreateHandleFromBinding.ll
index e8bd8fe89132d..345459a60c5ab 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"
@@ -44,6 +44,14 @@ 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]+}}}
+; CHECK-DAG: [[UAVMD]] = !{!{{[0-9]+}}, !{{[0-9]+}}}
+
; Note: We need declarations for each handle.fromBinding in the same order as
; they appear in source to force a deterministic ordering of record IDs.
declare target("dx.TypedBuffer", <4 x float>, 1, 0, 0)
``````````
</details>
https://github.com/llvm/llvm-project/pull/104447
More information about the llvm-branch-commits
mailing list