[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