[llvm-branch-commits] [llvm] [HLSL] Add support for root constant generation from llvm IR. (PR #127932)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Feb 20 11:36:54 PST 2025
https://github.com/joaosaffran updated https://github.com/llvm/llvm-project/pull/127932
>From 86a52d82e858c24a0f756f583a1b3d8dac3087d8 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 19 Feb 2025 22:53:55 +0000
Subject: [PATCH 1/4] parsing root constant
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 32 +++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 8702f0eecf2aa..6f7e3418782a3 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -40,6 +40,38 @@ static bool reportError(LLVMContext *Ctx, Twine Message,
return true;
}
+static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
+ MDNode *RootConstNode) {
+ if (RootConstNode->getNumOperands() != 5)
+ return reportError(Ctx, "Invalid format for RootFlag Element");
+
+ dxbc::RootParameter NewParam;
+ NewParam.ParameterType = dxbc::RootParameterType::Constants32Bit;
+
+ auto *ShaderVisibility =
+ mdconst::extract<ConstantInt>(RootConstNode->getOperand(1));
+ dxbc::ShaderVisibilityFlag SvFlag =
+ (dxbc::ShaderVisibilityFlag)ShaderVisibility->getZExtValue();
+ if (!dxbc::RootSignatureValidations::isValidShaderVisibility(SvFlag))
+ return reportError(
+ Ctx, "Invalid shader visibility flag value in root constant.");
+ NewParam.ShaderVisibility = SvFlag;
+
+ auto *ShaderRegister =
+ mdconst::extract<ConstantInt>(RootConstNode->getOperand(2));
+ NewParam.Constants.ShaderRegister = ShaderRegister->getZExtValue();
+
+ auto *RegisterSpace =
+ mdconst::extract<ConstantInt>(RootConstNode->getOperand(3));
+ NewParam.Constants.RegisterSpace = RegisterSpace->getZExtValue();
+
+ auto *Num32BitValues =
+ mdconst::extract<ConstantInt>(RootConstNode->getOperand(4));
+ NewParam.Constants.Num32BitValues = Num32BitValues->getZExtValue();
+
+ return false;
+}
+
static bool parseRootFlags(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
MDNode *RootFlagNode) {
>From f181f4dbae982c948e81aff41bcb84f59048fbed Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 20 Feb 2025 00:51:23 +0000
Subject: [PATCH 2/4] add root constant support
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 36 +++++++++++++++++--
llvm/lib/Target/DirectX/DXILRootSignature.h | 7 +++-
...nature-Constants-Error-invalid-metadata.ll | 17 +++++++++
...nstants-Error-invalid-shader-visibility.ll | 17 +++++++++
.../ContainerData/RootSignature-Constants.ll | 33 +++++++++++++++++
5 files changed, 107 insertions(+), 3 deletions(-)
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants-Error-invalid-metadata.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants-Error-invalid-shader-visibility.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants.ll
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 6f7e3418782a3..388a3f5e8af0b 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -43,7 +43,7 @@ static bool reportError(LLVMContext *Ctx, Twine Message,
static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
MDNode *RootConstNode) {
if (RootConstNode->getNumOperands() != 5)
- return reportError(Ctx, "Invalid format for RootFlag Element");
+ return reportError(Ctx, "Invalid format for Root constants element");
dxbc::RootParameter NewParam;
NewParam.ParameterType = dxbc::RootParameterType::Constants32Bit;
@@ -69,6 +69,8 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
mdconst::extract<ConstantInt>(RootConstNode->getOperand(4));
NewParam.Constants.Num32BitValues = Num32BitValues->getZExtValue();
+ RSD.Parameters.push_back(NewParam);
+
return false;
}
@@ -94,10 +96,12 @@ static bool parseRootSignatureElement(LLVMContext *Ctx,
RootSignatureElementKind ElementKind =
StringSwitch<RootSignatureElementKind>(ElementText->getString())
.Case("RootFlags", RootSignatureElementKind::RootFlags)
+ .Case("RootConstants", RootSignatureElementKind::RootConstants)
.Default(RootSignatureElementKind::Error);
switch (ElementKind) {
-
+ case RootSignatureElementKind::RootConstants:
+ return parseRootConstants(Ctx, RSD, Element);
case RootSignatureElementKind::RootFlags:
return parseRootFlags(Ctx, RSD, Element);
case RootSignatureElementKind::Error:
@@ -241,6 +245,34 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
OS << indent(Space) << "NumStaticSamplers: " << 0 << ":\n";
OS << indent(Space) << "StaticSamplersOffset: "
<< sizeof(RS.Header) + RS.Parameters.size_in_bytes() << ":\n";
+
+ OS << indent(Space) << "- Parameters: \n";
+ Space++;
+ for (const auto &Param : RS.Parameters) {
+ OS << indent(Space) << "Type: " << &Param.ParameterType << " \n";
+ OS << indent(Space) << "ShaderVisibility: " << &Param.ShaderVisibility
+ << " \n";
+ Space++;
+
+ switch (Param.ParameterType) {
+
+ case dxbc::RootParameterType::Constants32Bit: {
+ OS << indent(Space) << "- Constants: \n";
+ Space++;
+ OS << indent(Space)
+ << "RegisterSpace: " << &Param.Constants.RegisterSpace << " \n";
+ OS << indent(Space)
+ << "ShaderRegister: " << &Param.Constants.ShaderRegister << " \n";
+ OS << indent(Space)
+ << "Num32BitValues: " << &Param.Constants.Num32BitValues << " \n";
+ Space--;
+ } break;
+ case dxbc::RootParameterType::Empty:
+ break;
+ }
+ Space--;
+ }
+ Space--;
Space--;
// end root signature header
}
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index 8c25b2eb3fadf..10f9b62e65916 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -13,6 +13,7 @@
#include "llvm/ADT/DenseMap.h"
#include "llvm/Analysis/DXILMetadataAnalysis.h"
+#include "llvm/BinaryFormat/DXContainer.h"
#include "llvm/IR/DiagnosticInfo.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
@@ -24,7 +25,11 @@
namespace llvm {
namespace dxil {
-enum class RootSignatureElementKind { Error = 0, RootFlags = 1 };
+enum class RootSignatureElementKind {
+ Error = 0,
+ RootFlags = 1,
+ RootConstants = 2
+};
class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
friend AnalysisInfoMixin<RootSignatureAnalysis>;
static AnalysisKey Key;
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants-Error-invalid-metadata.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants-Error-invalid-metadata.ll
new file mode 100644
index 0000000000000..6272d86835da3
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants-Error-invalid-metadata.ll
@@ -0,0 +1,17 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+; CHECK: error: Invalid format for Root constants element
+; CHECK-NOT: Root Signature Definitions
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !4 } ; list of root signature elements
+!4 = !{ !"RootConstants", i32 0, i32 1, i32 2 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants-Error-invalid-shader-visibility.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants-Error-invalid-shader-visibility.ll
new file mode 100644
index 0000000000000..13a42b583dd9c
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants-Error-invalid-shader-visibility.ll
@@ -0,0 +1,17 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+; CHECK: error: Invalid shader visibility flag value in root constant.
+; CHECK-NOT: Root Signature Definitions
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !4 } ; list of root signature elements
+!4 = !{ !"RootConstants", i32 666, i32 1, i32 2, i32 3 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants.ll
new file mode 100644
index 0000000000000..d60d3e85122a7
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants.ll
@@ -0,0 +1,33 @@
+; 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.rts0 = private constant [48 x i8] c"{{.*}}", section "RTS0", align 4
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !4 } ; list of root signature elements
+!4 = !{ !"RootConstants", i32 0, i32 1, i32 2, i32 3 }
+
+
+; DXC: - Name: RTS0
+; DXC-NEXT: Size: 48
+; DXC-NEXT: RootSignature:
+; DXC-NEXT: Version: 2
+; DXC-NEXT: NumStaticSamplers: 0
+; DXC-NEXT: StaticSamplersOffset: 44
+; DXC-NEXT: Parameters:
+; DXC-NEXT: - ParameterType: Constants32Bit
+; DXC-NEXT: ShaderVisibility: All
+; DXC-NEXT: Constants:
+; DXC-NEXT: Num32BitValues: 3
+; DXC-NEXT: RegisterSpace: 2
+; DXC-NEXT: ShaderRegister: 1
>From 627cdcd086fe760470d447bc4323aaa4f2f9e29a Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 20 Feb 2025 00:53:33 +0000
Subject: [PATCH 3/4] clean up
---
llvm/lib/Target/DirectX/DXILRootSignature.h | 1 -
1 file changed, 1 deletion(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index 10f9b62e65916..93ec614f1ab85 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -13,7 +13,6 @@
#include "llvm/ADT/DenseMap.h"
#include "llvm/Analysis/DXILMetadataAnalysis.h"
-#include "llvm/BinaryFormat/DXContainer.h"
#include "llvm/IR/DiagnosticInfo.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
>From e702752285147177cd4ef69056f5f324f0630890 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 20 Feb 2025 01:13:33 +0000
Subject: [PATCH 4/4] change test
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 22 +++++++-------
.../ContainerData/RootSignature-Constants.ll | 30 ++++++++++---------
2 files changed, 27 insertions(+), 25 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 388a3f5e8af0b..e31d82adf2b1e 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -248,23 +248,23 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
OS << indent(Space) << "- Parameters: \n";
Space++;
- for (const auto &Param : RS.Parameters) {
- OS << indent(Space) << "Type: " << &Param.ParameterType << " \n";
- OS << indent(Space) << "ShaderVisibility: " << &Param.ShaderVisibility
- << " \n";
+ for (const auto &P : RS.Parameters) {
+ OS << indent(Space) << "Type: " << (uint32_t)P.ParameterType << " \n";
+ OS << indent(Space)
+ << "ShaderVisibility: " << (uint32_t)P.ShaderVisibility << " \n";
Space++;
- switch (Param.ParameterType) {
+ switch (P.ParameterType) {
case dxbc::RootParameterType::Constants32Bit: {
OS << indent(Space) << "- Constants: \n";
Space++;
- OS << indent(Space)
- << "RegisterSpace: " << &Param.Constants.RegisterSpace << " \n";
- OS << indent(Space)
- << "ShaderRegister: " << &Param.Constants.ShaderRegister << " \n";
- OS << indent(Space)
- << "Num32BitValues: " << &Param.Constants.Num32BitValues << " \n";
+ OS << indent(Space) << "RegisterSpace: " << P.Constants.RegisterSpace
+ << " \n";
+ OS << indent(Space) << "ShaderRegister: " << P.Constants.ShaderRegister
+ << " \n";
+ OS << indent(Space) << "Num32BitValues: " << P.Constants.Num32BitValues
+ << " \n";
Space--;
} break;
case dxbc::RootParameterType::Empty:
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants.ll
index d60d3e85122a7..54956edd580a6 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants.ll
@@ -1,5 +1,5 @@
; RUN: opt %s -dxil-embed -dxil-globals -S -o - | FileCheck %s
-; RUN: llc %s --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
+; RUN: opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s --check-prefix=DXC
target triple = "dxil-unknown-shadermodel6.0-compute"
@@ -18,16 +18,18 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!4 = !{ !"RootConstants", i32 0, i32 1, i32 2, i32 3 }
-; DXC: - Name: RTS0
-; DXC-NEXT: Size: 48
-; DXC-NEXT: RootSignature:
-; DXC-NEXT: Version: 2
-; DXC-NEXT: NumStaticSamplers: 0
-; DXC-NEXT: StaticSamplersOffset: 44
-; DXC-NEXT: Parameters:
-; DXC-NEXT: - ParameterType: Constants32Bit
-; DXC-NEXT: ShaderVisibility: All
-; DXC-NEXT: Constants:
-; DXC-NEXT: Num32BitValues: 3
-; DXC-NEXT: RegisterSpace: 2
-; DXC-NEXT: ShaderRegister: 1
+; DXC: Root Signature Definitions
+; DXC-NEXT: Definition for 'main':
+; DXC-NEXT: Flags: 0x000000:
+; DXC-NEXT: Version: 2:
+; DXC-NEXT: NumParameters: 1:
+; DXC-NEXT: RootParametersOffset: 20:
+; DXC-NEXT: NumStaticSamplers: 0:
+; DXC-NEXT: StaticSamplersOffset: 28:
+; DXC-NEXT: - Parameters:
+; DXC-NEXT: Type: 1
+; DXC-NEXT: ShaderVisibility: 0
+; DXC-NEXT: - Constants:
+; DXC-NEXT: RegisterSpace: 2
+; DXC-NEXT: ShaderRegister: 1
+; DXC-NEXT: Num32BitValues: 3
More information about the llvm-branch-commits
mailing list