[llvm] [DXIL][Analysis] Collect Function properties in Metadata Analysis (PR #105728)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 22 13:33:29 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-directx
Author: S. Bharadwaj Yadavalli (bharadwajy)
<details>
<summary>Changes</summary>
Basic infrastructure to collect Function properties in Metadata Analysis
- Add a map of function-properties to the metadata information.
- Add a structure to represent function properties. Currently numthreads property of a compute shader entry function is represented.
---
Full diff: https://github.com/llvm/llvm-project/pull/105728.diff
5 Files Affected:
- (modified) llvm/include/llvm/Analysis/DXILMetadataAnalysis.h (+6-1)
- (modified) llvm/lib/Analysis/DXILMetadataAnalysis.cpp (+50)
- (modified) llvm/test/CodeGen/DirectX/Metadata/dxilVer-1.8.ll (+2)
- (modified) llvm/test/CodeGen/DirectX/Metadata/shaderModel-cs-val-ver-0.0.ll (+3-1)
- (modified) llvm/test/CodeGen/DirectX/Metadata/shaderModel-cs.ll (+2)
``````````diff
diff --git a/llvm/include/llvm/Analysis/DXILMetadataAnalysis.h b/llvm/include/llvm/Analysis/DXILMetadataAnalysis.h
index 0515139c01aee6..6195ac08b0e99c 100644
--- a/llvm/include/llvm/Analysis/DXILMetadataAnalysis.h
+++ b/llvm/include/llvm/Analysis/DXILMetadataAnalysis.h
@@ -9,6 +9,7 @@
#ifndef LLVM_ANALYSIS_DXILMETADATA_H
#define LLVM_ANALYSIS_DXILMETADATA_H
+#include "llvm/IR/Function.h"
#include "llvm/IR/PassManager.h"
#include "llvm/Pass.h"
#include "llvm/Support/VersionTuple.h"
@@ -19,12 +20,16 @@ namespace llvm {
namespace dxil {
+struct FunctionProperties {
+ unsigned NumThreads[3];
+};
+
struct ModuleMetadataInfo {
VersionTuple DXILVersion{};
VersionTuple ShaderModelVersion{};
Triple::EnvironmentType ShaderStage = Triple::UnknownEnvironment;
VersionTuple ValidatorVersion{};
-
+ std::unordered_map<Function *, FunctionProperties> FunctionPropertyMap{};
void print(raw_ostream &OS) const;
};
diff --git a/llvm/lib/Analysis/DXILMetadataAnalysis.cpp b/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
index 192e151565370d..39bd750d69649b 100644
--- a/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
+++ b/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
@@ -8,11 +8,16 @@
#include "llvm/Analysis/DXILMetadataAnalysis.h"
#include "llvm/ADT/APInt.h"
+#include "llvm/ADT/StringRef.h"
#include "llvm/IR/Constants.h"
+#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
#include "llvm/InitializePasses.h"
+#include "llvm/Support/ErrorHandling.h"
+#include <memory>
+#include <utility>
#define DEBUG_TYPE "dxil-metadata-analysis"
@@ -33,6 +38,37 @@ static ModuleMetadataInfo collectMetadataInfo(Module &M) {
MMDAI.ValidatorVersion =
VersionTuple(MajorMD->getZExtValue(), MinorMD->getZExtValue());
}
+
+ if (MMDAI.ShaderStage == Triple::EnvironmentType::Compute) {
+ // For all HLSL Shader functions
+ for (auto &F : M.functions()) {
+ if (!F.hasFnAttribute("hlsl.shader"))
+ continue;
+
+ // Get numthreads attribute value
+ StringRef NumThreadsStr =
+ F.getFnAttribute("hlsl.numthreads").getValueAsString();
+ SmallVector<StringRef> NumThreadsVec;
+ NumThreadsStr.split(NumThreadsVec, ',');
+ if (NumThreadsVec.size() != 3) {
+ report_fatal_error(Twine(F.getName()) +
+ ": Invalid numthreads specified",
+ /* gen_crash_diag */ false);
+ }
+ FunctionProperties EFP;
+ auto Zip =
+ llvm::zip(NumThreadsVec, MutableArrayRef<unsigned>(EFP.NumThreads));
+ for (auto It : Zip) {
+ StringRef Str = std::get<0>(It);
+ APInt V;
+ assert(!Str.getAsInteger(10, V) &&
+ "Failed to parse numthreads components as integer values");
+ unsigned &Num = std::get<1>(It);
+ Num = V.getLimitedValue();
+ }
+ MMDAI.FunctionPropertyMap.emplace(std::make_pair(std::addressof(F), EFP));
+ }
+ }
return MMDAI;
}
@@ -42,6 +78,20 @@ void ModuleMetadataInfo::print(raw_ostream &OS) const {
OS << "Shader Stage : " << Triple::getEnvironmentTypeName(ShaderStage)
<< "\n";
OS << "Validator Version : " << ValidatorVersion.getAsString() << "\n";
+ for (auto MapItem : FunctionPropertyMap) {
+ MapItem.first->getReturnType()->print(OS, false, true);
+ OS << " " << MapItem.first->getName() << "(";
+ FunctionType *FT = MapItem.first->getFunctionType();
+ for (unsigned I = 0, Sz = FT->getNumParams(); I < Sz; ++I) {
+ if (I)
+ OS << ",";
+ FT->getParamType(I)->print(OS);
+ }
+ OS << ")\n";
+ OS << " NumThreads: " << MapItem.second.NumThreads[0] << ","
+ << MapItem.second.NumThreads[1] << "," << MapItem.second.NumThreads[2]
+ << "\n";
+ }
}
//===----------------------------------------------------------------------===//
diff --git a/llvm/test/CodeGen/DirectX/Metadata/dxilVer-1.8.ll b/llvm/test/CodeGen/DirectX/Metadata/dxilVer-1.8.ll
index 53edcde24b189f..d429b6534e4253 100644
--- a/llvm/test/CodeGen/DirectX/Metadata/dxilVer-1.8.ll
+++ b/llvm/test/CodeGen/DirectX/Metadata/dxilVer-1.8.ll
@@ -9,6 +9,8 @@ target triple = "dxil-pc-shadermodel6.8-compute"
; ANALYSIS-NEXT: DXIL Version : 1.8
; ANALYSIS-NEXT: Shader Stage : compute
; ANALYSIS-NEXT: Validator Version : 0
+; ANALYSIS-NEXT: void entry()
+; ANALYSIS-NEXT: NumThreads: 1,2,1
; ANALYSIS-EMPTY:
define void @entry() #0 {
diff --git a/llvm/test/CodeGen/DirectX/Metadata/shaderModel-cs-val-ver-0.0.ll b/llvm/test/CodeGen/DirectX/Metadata/shaderModel-cs-val-ver-0.0.ll
index c9ea6c94e36519..b7e6d2fd3cf432 100644
--- a/llvm/test/CodeGen/DirectX/Metadata/shaderModel-cs-val-ver-0.0.ll
+++ b/llvm/test/CodeGen/DirectX/Metadata/shaderModel-cs-val-ver-0.0.ll
@@ -19,5 +19,7 @@ attributes #0 = { noinline nounwind "exp-shader"="cs" "hlsl.numthreads"="1,2,1"
; ANALYSIS: Shader Model Version : 6.6
; ANALYSIS-NEXT: DXIL Version : 1.6
; ANALYSIS-NEXT: Shader Stage : compute
-; ANALYSIS-NEXT: Validator Version : 0
+; ANALYSIS-NEXT: Validator Version : 0.0
+; ANALYSIS-NEXT: void entry()
+; ANALYSIS-NEXT: NumThreads: 1,2,1
; ANALYSIS-EMPTY:
diff --git a/llvm/test/CodeGen/DirectX/Metadata/shaderModel-cs.ll b/llvm/test/CodeGen/DirectX/Metadata/shaderModel-cs.ll
index f5e524562ac1e0..77b52ee3478abe 100644
--- a/llvm/test/CodeGen/DirectX/Metadata/shaderModel-cs.ll
+++ b/llvm/test/CodeGen/DirectX/Metadata/shaderModel-cs.ll
@@ -11,6 +11,8 @@ target triple = "dxil-pc-shadermodel6.6-compute"
; ANALYSIS-NEXT: DXIL Version : 1.6
; ANALYSIS-NEXT: Shader Stage : compute
; ANALYSIS-NEXT: Validator Version : 0
+; ANALYSIS-NEXT: void entry()
+; ANALYSIS-NEXT: NumThreads: 1,2,1
; ANALYSIS-EMPTY:
define void @entry() #0 {
``````````
</details>
https://github.com/llvm/llvm-project/pull/105728
More information about the llvm-commits
mailing list