[llvm] [DirectX] use DXILMetadataAnalysis to build PSVRuntimeInfo (PR #107101)
Xiang Li via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 3 06:30:16 PDT 2024
https://github.com/python3kgae updated https://github.com/llvm/llvm-project/pull/107101
>From 48cd0449baf79ce7654d44f62ed59edf424bbe11 Mon Sep 17 00:00:00 2001
From: Xiang Li <python3kgae at outlook.com>
Date: Tue, 3 Sep 2024 08:45:30 -0400
Subject: [PATCH 1/2] [DirectX] use DXILMetadataAnalysis to build
PSVRuntimeInfo
Replace the hardcoded values for compute shader in DXContainer::addPipelineStateValidationInfo.
Still missing wave size.
Add preserved for previous passes so the information is not lost.
Fix https://github.com/llvm/wg-hlsl/issues/51
---
.../lib/Target/DirectX/DXContainerGlobals.cpp | 23 +++++++++--
llvm/lib/Target/DirectX/DXILPrepare.cpp | 2 +
.../Target/DirectX/DXILTranslateMetadata.cpp | 2 +
.../DirectX/ContainerData/RuntimeInfoCS.ll | 41 +++++++++++++++++++
4 files changed, 64 insertions(+), 4 deletions(-)
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RuntimeInfoCS.ll
diff --git a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
index d47b9c7a25b8fe..1a9e16f102c007 100644
--- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
+++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
@@ -15,6 +15,7 @@
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringRef.h"
+#include "llvm/Analysis/DXILMetadataAnalysis.h"
#include "llvm/BinaryFormat/DXContainer.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/IR/Constants.h"
@@ -57,6 +58,7 @@ class DXContainerGlobals : public llvm::ModulePass {
void getAnalysisUsage(AnalysisUsage &AU) const override {
AU.setPreservesAll();
AU.addRequired<ShaderFlagsAnalysisWrapper>();
+ AU.addRequired<DXILMetadataAnalysisWrapperPass>();
}
};
@@ -149,15 +151,27 @@ void DXContainerGlobals::addPipelineStateValidationInfo(
PSV.BaseData.ShaderStage =
static_cast<uint8_t>(TT.getEnvironment() - Triple::Pixel);
+ dxil::ModuleMetadataInfo &MMI =
+ getAnalysis<DXILMetadataAnalysisWrapperPass>().getModuleMetadata();
+ assert(MMI.EntryPropertyVec.size() != 0 ||
+ TT.getEnvironment() == Triple::Library);
// Hardcoded values here to unblock loading the shader into D3D.
//
// TODO: Lots more stuff to do here!
//
// See issue https://github.com/llvm/llvm-project/issues/96674.
- PSV.BaseData.NumThreadsX = 1;
- PSV.BaseData.NumThreadsY = 1;
- PSV.BaseData.NumThreadsZ = 1;
- PSV.EntryName = "main";
+ switch (TT.getEnvironment()) {
+ case Triple::Compute:
+ PSV.BaseData.NumThreadsX = MMI.EntryPropertyVec[0].NumThreadsX;
+ PSV.BaseData.NumThreadsY = MMI.EntryPropertyVec[0].NumThreadsY;
+ PSV.BaseData.NumThreadsZ = MMI.EntryPropertyVec[0].NumThreadsZ;
+ break;
+ default:
+ break;
+ }
+
+ if (TT.getEnvironment() != Triple::Library)
+ PSV.EntryName = MMI.EntryPropertyVec[0].Entry->getName();
PSV.finalize(TT.getEnvironment());
PSV.write(OS);
@@ -170,6 +184,7 @@ char DXContainerGlobals::ID = 0;
INITIALIZE_PASS_BEGIN(DXContainerGlobals, "dxil-globals",
"DXContainer Global Emitter", false, true)
INITIALIZE_PASS_DEPENDENCY(ShaderFlagsAnalysisWrapper)
+INITIALIZE_PASS_DEPENDENCY(DXILMetadataAnalysisWrapperPass)
INITIALIZE_PASS_END(DXContainerGlobals, "dxil-globals",
"DXContainer Global Emitter", false, true)
diff --git a/llvm/lib/Target/DirectX/DXILPrepare.cpp b/llvm/lib/Target/DirectX/DXILPrepare.cpp
index 56098864e987fb..f6b7355b936255 100644
--- a/llvm/lib/Target/DirectX/DXILPrepare.cpp
+++ b/llvm/lib/Target/DirectX/DXILPrepare.cpp
@@ -19,6 +19,7 @@
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringSet.h"
+#include "llvm/Analysis/DXILMetadataAnalysis.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/IR/AttributeMask.h"
#include "llvm/IR/IRBuilder.h"
@@ -247,6 +248,7 @@ class DXILPrepareModule : public ModulePass {
void getAnalysisUsage(AnalysisUsage &AU) const override {
AU.addPreserved<ShaderFlagsAnalysisWrapper>();
AU.addPreserved<DXILResourceMDWrapper>();
+ AU.addPreserved<DXILMetadataAnalysisWrapperPass>();
}
static char ID; // Pass identification.
};
diff --git a/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp b/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp
index 2c6d20112060df..701dbc1353dab9 100644
--- a/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp
+++ b/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp
@@ -14,6 +14,7 @@
#include "DirectX.h"
#include "llvm/ADT/StringSet.h"
#include "llvm/Analysis/DXILResource.h"
+#include "llvm/Analysis/DXILMetadataAnalysis.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
@@ -103,6 +104,7 @@ class DXILTranslateMetadataLegacy : public ModulePass {
AU.addRequired<DXILResourceWrapperPass>();
AU.addRequired<DXILResourceMDWrapper>();
AU.addRequired<ShaderFlagsAnalysisWrapper>();
+ AU.addRequired<DXILMetadataAnalysisWrapperPass>();
}
bool runOnModule(Module &M) override {
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RuntimeInfoCS.ll b/llvm/test/CodeGen/DirectX/ContainerData/RuntimeInfoCS.ll
new file mode 100644
index 00000000000000..595e70092bb081
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RuntimeInfoCS.ll
@@ -0,0 +1,41 @@
+; RUN: opt %s -dxil-embed -dxil-globals -S -o - | FileCheck %s
+; RUN: llc %s --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: @dx.psv0 = private constant [80 x i8] c"{{.*}}", section "PSV0", align 4
+
+define void @cs_main() #0 {
+entry:
+ ret void
+}
+
+attributes #0 = { "hlsl.numthreads"="8,8,1" "hlsl.shader"="compute" }
+
+!dx.valver = !{!0}
+
+!0 = !{i32 1, i32 7}
+
+; DXC: - Name: PSV0
+; DXC-NEXT: Size: 80
+; DXC-NEXT: PSVInfo:
+; DXC-NEXT: Version: 3
+; DXC-NEXT: ShaderStage: 5
+; DXC-NEXT: MinimumWaveLaneCount: 0
+; DXC-NEXT: MaximumWaveLaneCount: 4294967295
+; DXC-NEXT: UsesViewID: 0
+; DXC-NEXT: SigInputVectors: 0
+; DXC-NEXT: SigOutputVectors: [ 0, 0, 0, 0 ]
+; DXC-NEXT: NumThreadsX: 8
+; DXC-NEXT: NumThreadsY: 8
+; DXC-NEXT: NumThreadsZ: 1
+; DXC-NEXT: EntryName: cs_main
+; DXC-NEXT: ResourceStride: 24
+; DXC-NEXT: Resources: []
+; DXC-NEXT: SigInputElements: []
+; DXC-NEXT: SigOutputElements: []
+; DXC-NEXT: SigPatchOrPrimElements: []
+; DXC-NEXT: InputOutputMap:
+; DXC-NEXT: - [ ]
+; DXC-NEXT: - [ ]
+; DXC-NEXT: - [ ]
+; DXC-NEXT: - [ ]
>From a93e54e64443948f9e4167c43483b8455a3ad032 Mon Sep 17 00:00:00 2001
From: Xiang Li <python3kgae at outlook.com>
Date: Tue, 3 Sep 2024 09:30:01 -0400
Subject: [PATCH 2/2] clang-format.
---
llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp b/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp
index 701dbc1353dab9..11cd9df1d1dc42 100644
--- a/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp
+++ b/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp
@@ -13,8 +13,8 @@
#include "DXILShaderFlags.h"
#include "DirectX.h"
#include "llvm/ADT/StringSet.h"
-#include "llvm/Analysis/DXILResource.h"
#include "llvm/Analysis/DXILMetadataAnalysis.h"
+#include "llvm/Analysis/DXILResource.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
More information about the llvm-commits
mailing list