[llvm-branch-commits] [llvm] [DirectX] Validating Root flags are denying shader stage (PR #153287)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Wed Sep 24 10:31:51 PDT 2025


https://github.com/joaosaffran updated https://github.com/llvm/llvm-project/pull/153287

>From b1e34ff07fffe96fec438b87027bd2c450b6b36f Mon Sep 17 00:00:00 2001
From: Joao Saffran <{ID}+{username}@users.noreply.github.com>
Date: Tue, 12 Aug 2025 13:07:42 -0700
Subject: [PATCH 01/25] adding validaiton and tests

---
 .../DXILPostOptimizationValidation.cpp        | 95 ++++++++++++++-----
 .../rootsignature-validation-deny-shader.ll   | 16 ++++
 ...re-validation-fail-deny-multiple-shader.ll | 17 ++++
 ...ture-validation-fail-deny-single-shader.ll | 17 ++++
 4 files changed, 122 insertions(+), 23 deletions(-)
 create mode 100644 llvm/test/CodeGen/DirectX/rootsignature-validation-deny-shader.ll
 create mode 100644 llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-multiple-shader.ll
 create mode 100644 llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-single-shader.ll

diff --git a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
index 3721b5f539b8c..251f4a0daf43a 100644
--- a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
+++ b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
@@ -21,6 +21,7 @@
 #include "llvm/InitializePasses.h"
 #include "llvm/MC/DXContainerRootSignature.h"
 #include "llvm/Support/DXILABI.h"
+#include "llvm/TargetParser/Triple.h"
 #include <cstdint>
 
 #define DEBUG_TYPE "dxil-post-optimization-validation"
@@ -169,15 +170,16 @@ reportDescriptorTableMixingTypes(Module &M, uint32_t Location,
   M.getContext().diagnose(DiagnosticInfoGeneric(Message));
 }
 
-static void reportOverlowingRange(Module &M, const dxbc::RTS0::v2::DescriptorRange &Range) {
+static void
+reportOverlowingRange(Module &M, const dxbc::RTS0::v2::DescriptorRange &Range) {
   SmallString<128> Message;
   raw_svector_ostream OS(Message);
-  OS << "Cannot append range with implicit lower " 
-      << "bound after an unbounded range "
-      << getResourceClassName(toResourceClass(static_cast<dxbc::DescriptorRangeType>(Range.RangeType)))
-      << "(register=" << Range.BaseShaderRegister << ", space=" << 
-      Range.RegisterSpace
-      << ") exceeds maximum allowed value.";
+  OS << "Cannot append range with implicit lower "
+     << "bound after an unbounded range "
+     << getResourceClassName(toResourceClass(
+            static_cast<dxbc::DescriptorRangeType>(Range.RangeType)))
+     << "(register=" << Range.BaseShaderRegister
+     << ", space=" << Range.RegisterSpace << ") exceeds maximum allowed value.";
   M.getContext().diagnose(DiagnosticInfoGeneric(Message));
 }
 
@@ -262,12 +264,57 @@ getRootDescriptorsBindingInfo(const mcdxbc::RootSignatureDesc &RSD,
   return RDs;
 }
 
+static void reportIfDeniedShaderStageAccess(Module &M, dxbc::RootFlags Flags,
+                                            dxbc::RootFlags Mask) {
+  if ((Flags & Mask) == Mask) {
+    SmallString<128> Message;
+    raw_svector_ostream OS(Message);
+    OS << "Shader has root bindings but root signature uses a DENY flag to "
+          "disallow root binding access to the shader stage.";
+    M.getContext().diagnose(DiagnosticInfoGeneric(Message));
+  }
+}
+
+static void validateRootFlags(Module &M, const mcdxbc::RootSignatureDesc &RSD,
+                              const dxil::ModuleMetadataInfo &MMI) {
+  dxbc::RootFlags Flags = dxbc::RootFlags(RSD.Flags);
 
+  switch (MMI.ShaderProfile) {
+  case Triple::Pixel:
+    reportIfDeniedShaderStageAccess(M, Flags,
+                                    dxbc::RootFlags::DenyPixelShaderRootAccess);
+    break;
+  case Triple::Vertex:
+    reportIfDeniedShaderStageAccess(
+        M, Flags, dxbc::RootFlags::DenyVertexShaderRootAccess);
+    break;
+  case Triple::Geometry:
+    reportIfDeniedShaderStageAccess(
+        M, Flags, dxbc::RootFlags::DenyGeometryShaderRootAccess);
+    break;
+  case Triple::Hull:
+    reportIfDeniedShaderStageAccess(M, Flags,
+                                    dxbc::RootFlags::DenyHullShaderRootAccess);
+    break;
+  case Triple::Domain:
+    reportIfDeniedShaderStageAccess(
+        M, Flags, dxbc::RootFlags::DenyDomainShaderRootAccess);
+    break;
+  case Triple::Mesh:
+    reportIfDeniedShaderStageAccess(M, Flags,
+                                    dxbc::RootFlags::DenyMeshShaderRootAccess);
+    break;
+  case Triple::Amplification:
+    reportIfDeniedShaderStageAccess(
+        M, Flags, dxbc::RootFlags::DenyAmplificationShaderRootAccess);
+    break;
+  default:
+    break;
+  }
+}
 
 static void validateDescriptorTables(Module &M,
-                                     const mcdxbc::RootSignatureDesc &RSD,
-                                     dxil::ModuleMetadataInfo &MMI,
-                                     DXILResourceMap &DRM) {
+                                     const mcdxbc::RootSignatureDesc &RSD) {
   for (const mcdxbc::RootParameterInfo &ParamInfo : RSD.ParametersContainer) {
     if (static_cast<dxbc::RootParameterType>(ParamInfo.Header.ParameterType) !=
         dxbc::RootParameterType::DescriptorTable)
@@ -283,30 +330,31 @@ static void validateDescriptorTables(Module &M,
 
     uint64_t AppendingOffset = 0;
 
-
     for (const dxbc::RTS0::v2::DescriptorRange &Range : Table.Ranges) {
       dxbc::DescriptorRangeType RangeType =
           static_cast<dxbc::DescriptorRangeType>(Range.RangeType);
-      
+
       uint64_t Offset = AppendingOffset;
-      if(Range.OffsetInDescriptorsFromTableStart != ~0U)
+      if (Range.OffsetInDescriptorsFromTableStart != ~0U)
         Offset = Range.OffsetInDescriptorsFromTableStart;
-      
-      if(Offset > ~0U)
+
+      if (Offset > ~0U)
         reportOverlowingRange(M, Range);
-      if(Range.NumDescriptors == ~0U) {
+      if (Range.NumDescriptors == ~0U) {
         AppendingOffset = (uint64_t)~0U + (uint64_t)1ULL;
-      } else { 
-        uint64_t UpperBound = (uint64_t)Range.BaseShaderRegister + (uint64_t)Range.NumDescriptors - (uint64_t)1U;
-        if(UpperBound > ~0U)
+      } else {
+        uint64_t UpperBound = (uint64_t)Range.BaseShaderRegister +
+                              (uint64_t)Range.NumDescriptors - (uint64_t)1U;
+        if (UpperBound > ~0U)
           reportOverlowingRange(M, Range);
 
-        uint64_t AppendingUpperBound = (uint64_t)Offset + (uint64_t)Range.NumDescriptors - (uint64_t)1U;
-        if(AppendingUpperBound > ~0U)
+        uint64_t AppendingUpperBound =
+            (uint64_t)Offset + (uint64_t)Range.NumDescriptors - (uint64_t)1U;
+        if (AppendingUpperBound > ~0U)
           reportOverlowingRange(M, Range);
         AppendingOffset = Offset + Range.NumDescriptors;
       }
-      
+
       if (RangeType == dxbc::DescriptorRangeType::Sampler) {
         HasSampler = true;
       } else {
@@ -441,7 +489,8 @@ static void reportErrors(Module &M, DXILResourceMap &DRM,
 
   if (mcdxbc::RootSignatureDesc *RSD = getRootSignature(RSBI, MMI)) {
     validateRootSignatureBindings(M, *RSD, MMI, DRM);
-    validateDescriptorTables(M, *RSD, MMI, DRM);
+    validateDescriptorTables(M, *RSD);
+    validateRootFlags(M, *RSD, MMI);
   }
 }
 
diff --git a/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-shader.ll b/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-shader.ll
new file mode 100644
index 0000000000000..234909e82b792
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-shader.ll
@@ -0,0 +1,16 @@
+; RUN: opt -S -passes='dxil-post-optimization-validation' %s 2>&1 
+; expected-no-diagnostics
+target triple = "dxil-pc-shadermodel6.6-geometry"
+
+define void @CSMain() #0 {
+entry:
+  ret void
+}
+attributes #0 = { noinline nounwind "exp-shader"="cs" "hlsl.numthreads"="1,2,1" "hlsl.shader"="geometry" }
+
+!dx.rootsignatures = !{!0}
+
+!0 = !{ptr @CSMain, !1, i32 2}
+!1 = !{!2}
+!2 = !{ !"RootFlags", i32 294 } ; 32 = deny_pixel/hull/vertex/amplification_shader_root_access
+
diff --git a/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-multiple-shader.ll b/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-multiple-shader.ll
new file mode 100644
index 0000000000000..9286c31db2de0
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-multiple-shader.ll
@@ -0,0 +1,17 @@
+; RUN: not opt -S -passes='dxil-post-optimization-validation' %s 2>&1 | FileCheck %s
+
+; CHECK: error: Shader has root bindings but root signature uses a DENY flag to disallow root binding access to the shader stage.
+target triple = "dxil-pc-shadermodel6.6-hull"
+
+define void @CSMain() #0 {
+entry:
+  ret void
+}
+attributes #0 = { noinline nounwind "exp-shader"="cs" "hlsl.numthreads"="1,2,1" "hlsl.shader"="hull" }
+
+!dx.rootsignatures = !{!0}
+
+!0 = !{ptr @CSMain, !1, i32 2}
+!1 = !{!2}
+!2 = !{ !"RootFlags", i32 294 } ; 32 = deny_pixel/hull/vertex/amplification_shader_root_access
+
diff --git a/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-single-shader.ll b/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-single-shader.ll
new file mode 100644
index 0000000000000..7294346900415
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-single-shader.ll
@@ -0,0 +1,17 @@
+; RUN: not opt -S -passes='dxil-post-optimization-validation' %s 2>&1 | FileCheck %s
+
+; CHECK: error: Shader has root bindings but root signature uses a DENY flag to disallow root binding access to the shader stage.
+target triple = "dxil-pc-shadermodel6.6-pixel"
+
+define void @CSMain() #0 {
+entry:
+  ret void
+}
+attributes #0 = { noinline nounwind "exp-shader"="cs" "hlsl.numthreads"="1,2,1" "hlsl.shader"="pixel" }
+
+!dx.rootsignatures = !{!0}
+
+!0 = !{ptr @CSMain, !1, i32 2}
+!1 = !{!2}
+!2 = !{ !"RootFlags", i32 32 } ; 32 = deny_pixel_shader_root_access
+

>From 90c257852a77cf940d8499a125c8aa4808892867 Mon Sep 17 00:00:00 2001
From: Joao Saffran <{ID}+{username}@users.noreply.github.com>
Date: Tue, 12 Aug 2025 13:34:43 -0700
Subject: [PATCH 02/25] fix?

---
 llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp | 2 --
 1 file changed, 2 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
index 251f4a0daf43a..3897056d5081a 100644
--- a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
+++ b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
@@ -21,8 +21,6 @@
 #include "llvm/InitializePasses.h"
 #include "llvm/MC/DXContainerRootSignature.h"
 #include "llvm/Support/DXILABI.h"
-#include "llvm/TargetParser/Triple.h"
-#include <cstdint>
 
 #define DEBUG_TYPE "dxil-post-optimization-validation"
 

>From 84a4c4b02635175fb9c6fa0958103ea97d1d93c3 Mon Sep 17 00:00:00 2001
From: Joao Saffran <{ID}+{username}@users.noreply.github.com>
Date: Tue, 12 Aug 2025 13:46:55 -0700
Subject: [PATCH 03/25] format

---
 llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
index 4a13ebc6e76e8..8513ce80c520a 100644
--- a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
+++ b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
@@ -345,7 +345,7 @@ static void validateDescriptorTables(Module &M,
                               (uint64_t)Range.NumDescriptors - (uint64_t)1U;
         if (UpperBound > ~0U)
           reportOverflowingRange(M, Range);
-        
+
         uint64_t AppendingUpperBound =
             (uint64_t)Offset + (uint64_t)Range.NumDescriptors - (uint64_t)1U;
         if (AppendingUpperBound > ~0U)

>From 4400e2e173db8f10b361ef05d1e5ee01166e1c1f Mon Sep 17 00:00:00 2001
From: Joao Saffran <{ID}+{username}@users.noreply.github.com>
Date: Tue, 12 Aug 2025 14:19:39 -0700
Subject: [PATCH 04/25] format

---
 llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
index 8513ce80c520a..d0679b5ba5739 100644
--- a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
+++ b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
@@ -169,7 +169,8 @@ reportDescriptorTableMixingTypes(Module &M, uint32_t Location,
 }
 
 static void
-reportOverflowingRange(Module &M, const dxbc::RTS0::v2::DescriptorRange &Range) {
+reportOverflowingRange(Module &M,
+                       const dxbc::RTS0::v2::DescriptorRange &Range) {
   SmallString<128> Message;
   raw_svector_ostream OS(Message);
   OS << "Cannot append range with implicit lower "

>From eb425c5664642053eb72411a03c5c1a15065f33b Mon Sep 17 00:00:00 2001
From: Joao Saffran <{ID}+{username}@users.noreply.github.com>
Date: Thu, 14 Aug 2025 15:36:59 -0700
Subject: [PATCH 05/25] making validation function according to spec

---
 .../DXILPostOptimizationValidation.cpp        | 20 +++++++++++++------
 ...ootsignature-validation-deny-no-binding.ll | 15 ++++++++++++++
 .../rootsignature-validation-deny-shader.ll   |  1 -
 ...re-validation-fail-deny-multiple-shader.ll | 16 +++++++++------
 ...ture-validation-fail-deny-single-shader.ll | 14 ++++++++-----
 5 files changed, 48 insertions(+), 18 deletions(-)
 create mode 100644 llvm/test/CodeGen/DirectX/rootsignature-validation-deny-no-binding.ll

diff --git a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
index d0679b5ba5739..d2b6973dad4b3 100644
--- a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
+++ b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
@@ -21,6 +21,7 @@
 #include "llvm/InitializePasses.h"
 #include "llvm/MC/DXContainerRootSignature.h"
 #include "llvm/Support/DXILABI.h"
+#include "llvm/Support/ErrorHandling.h"
 
 #define DEBUG_TYPE "dxil-post-optimization-validation"
 
@@ -274,8 +275,9 @@ static void reportIfDeniedShaderStageAccess(Module &M, dxbc::RootFlags Flags,
   }
 }
 
-static void validateRootFlags(Module &M, const mcdxbc::RootSignatureDesc &RSD,
-                              const dxil::ModuleMetadataInfo &MMI) {
+static void validateDeniedStagedNotInUse(Module &M,
+                                         const mcdxbc::RootSignatureDesc &RSD,
+                                         const dxil::ModuleMetadataInfo &MMI) {
   dxbc::RootFlags Flags = dxbc::RootFlags(RSD.Flags);
 
   switch (MMI.ShaderProfile) {
@@ -308,7 +310,7 @@ static void validateRootFlags(Module &M, const mcdxbc::RootSignatureDesc &RSD,
         M, Flags, dxbc::RootFlags::DenyAmplificationShaderRootAccess);
     break;
   default:
-    break;
+    llvm_unreachable("Invalid triple to shader stage conversion");
   }
 }
 
@@ -372,7 +374,7 @@ static void validateDescriptorTables(Module &M,
   }
 }
 
-static void validateRootSignatureBindings(Module &M,
+static bool validateRootSignatureBindings(Module &M,
                                           const mcdxbc::RootSignatureDesc &RSD,
                                           dxil::ModuleMetadataInfo &MMI,
                                           DXILResourceMap &DRM) {
@@ -444,6 +446,8 @@ static void validateRootSignatureBindings(Module &M,
             Builder.findOverlapping(ReportedBinding);
         reportOverlappingRegisters(M, ReportedBinding, Overlaping);
       });
+  bool HasBindings = false;
+
   // Next checks require that the root signature definition is valid.
   if (!HasOverlap) {
     SmallVector<ResourceInfo::ResourceBinding> RDs =
@@ -460,10 +464,13 @@ static void validateRootSignatureBindings(Module &M,
 
         if (!Info.isBound(ResList.first, ResBinding.Space, ResRange))
           reportRegNotBound(M, ResList.first, ResBinding);
+        else
+          HasBindings = true;
       }
       reportInvalidHandleTy(M, RDs, ResList.second);
     }
   }
+  return HasBindings;
 }
 
 mcdxbc::RootSignatureDesc *getRootSignature(RootSignatureBindingInfo &RSBI,
@@ -487,9 +494,10 @@ static void reportErrors(Module &M, DXILResourceMap &DRM,
                                        "DXILResourceImplicitBinding pass");
 
   if (mcdxbc::RootSignatureDesc *RSD = getRootSignature(RSBI, MMI)) {
-    validateRootSignatureBindings(M, *RSD, MMI, DRM);
+    bool HasBindings = validateRootSignatureBindings(M, *RSD, MMI, DRM);
     validateDescriptorTables(M, *RSD);
-    validateRootFlags(M, *RSD, MMI);
+    if (HasBindings && MMI.ShaderProfile != Triple::Compute)
+      validateDeniedStagedNotInUse(M, *RSD, MMI);
   }
 }
 
diff --git a/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-no-binding.ll b/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-no-binding.ll
new file mode 100644
index 0000000000000..9db072b01da13
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-no-binding.ll
@@ -0,0 +1,15 @@
+; RUN: opt -S -passes='dxil-post-optimization-validation' %s 2>&1 
+; expected-no-diagnostics
+target triple = "dxil-pc-shadermodel6.6-pixel"
+
+define void @CSMain() #0 {
+entry:
+  ret void
+}
+attributes #0 = { noinline nounwind "exp-shader"="cs" "hlsl.numthreads"="1,2,1" "hlsl.shader"="geometry" }
+
+!dx.rootsignatures = !{!0}
+
+!0 = !{ptr @CSMain, !1, i32 2}
+!1 = !{!2}
+!2 = !{ !"RootFlags", i32 294 } ; 32 = deny_pixel/hull/vertex/amplification_shader_root_access
diff --git a/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-shader.ll b/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-shader.ll
index 234909e82b792..af344fa015cb9 100644
--- a/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-shader.ll
+++ b/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-shader.ll
@@ -13,4 +13,3 @@ attributes #0 = { noinline nounwind "exp-shader"="cs" "hlsl.numthreads"="1,2,1"
 !0 = !{ptr @CSMain, !1, i32 2}
 !1 = !{!2}
 !2 = !{ !"RootFlags", i32 294 } ; 32 = deny_pixel/hull/vertex/amplification_shader_root_access
-
diff --git a/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-multiple-shader.ll b/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-multiple-shader.ll
index 9286c31db2de0..5ab1389f8051b 100644
--- a/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-multiple-shader.ll
+++ b/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-multiple-shader.ll
@@ -1,17 +1,21 @@
 ; RUN: not opt -S -passes='dxil-post-optimization-validation' %s 2>&1 | FileCheck %s
 
 ; CHECK: error: Shader has root bindings but root signature uses a DENY flag to disallow root binding access to the shader stage.
-target triple = "dxil-pc-shadermodel6.6-hull"
+target triple = "dxil-pc-shadermodel6.6-pixel"
 
-define void @CSMain() #0 {
+%__cblayout_CB = type <{ float }>
+
+ at CB.str = private unnamed_addr constant [3 x i8] c"CB\00", align 1
+
+define void @CSMain() "hlsl.shader"="compute" {
 entry:
+  %CB = tail call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 4, 0)) @llvm.dx.resource.handlefrombinding(i32 0, i32 2, i32 1, i32 0, i1 false, ptr nonnull @CB.str)
   ret void
 }
-attributes #0 = { noinline nounwind "exp-shader"="cs" "hlsl.numthreads"="1,2,1" "hlsl.shader"="hull" }
 
 !dx.rootsignatures = !{!0}
 
 !0 = !{ptr @CSMain, !1, i32 2}
-!1 = !{!2}
-!2 = !{ !"RootFlags", i32 294 } ; 32 = deny_pixel/hull/vertex/amplification_shader_root_access
-
+!1 = !{!2, !3}
+!2 = !{!"RootConstants", i32 0, i32 2, i32 0, i32 4}
+!3 = !{!"RootFlags", i32 294} ; 294 = deny_pixel/hull/vertex/amplification_shader_root_access
diff --git a/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-single-shader.ll b/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-single-shader.ll
index 7294346900415..a9d0aca107ed7 100644
--- a/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-single-shader.ll
+++ b/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-single-shader.ll
@@ -3,15 +3,19 @@
 ; CHECK: error: Shader has root bindings but root signature uses a DENY flag to disallow root binding access to the shader stage.
 target triple = "dxil-pc-shadermodel6.6-pixel"
 
-define void @CSMain() #0 {
+%__cblayout_CB = type <{ float }>
+
+ at CB.str = private unnamed_addr constant [3 x i8] c"CB\00", align 1
+
+define void @CSMain() "hlsl.shader"="compute" {
 entry:
+  %CB = tail call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 4, 0)) @llvm.dx.resource.handlefrombinding(i32 0, i32 2, i32 1, i32 0, i1 false, ptr nonnull @CB.str)
   ret void
 }
-attributes #0 = { noinline nounwind "exp-shader"="cs" "hlsl.numthreads"="1,2,1" "hlsl.shader"="pixel" }
 
 !dx.rootsignatures = !{!0}
 
 !0 = !{ptr @CSMain, !1, i32 2}
-!1 = !{!2}
-!2 = !{ !"RootFlags", i32 32 } ; 32 = deny_pixel_shader_root_access
-
+!1 = !{!2, !3}
+!2 = !{!"RootConstants", i32 0, i32 2, i32 0, i32 4}
+!3 = !{!"RootFlags", i32 32} ; 32 = deny_pixel_shader_root_access

>From 51ff2804b0e0bf93b6e65f019bcacd015ccc72eb Mon Sep 17 00:00:00 2001
From: Joao Saffran <{ID}+{username}@users.noreply.github.com>
Date: Thu, 14 Aug 2025 18:16:10 -0700
Subject: [PATCH 06/25] format

---
 .../Target/DirectX/DXILPostOptimizationValidation.cpp  |  1 -
 .../rootsignature-validation-deny-no-binding.ll        | 10 ++++++----
 .../DirectX/rootsignature-validation-deny-shader.ll    |  7 ++++---
 ...otsignature-validation-fail-deny-multiple-shader.ll |  1 -
 4 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
index 8ee36292bcecf..7e5e607e2d2c2 100644
--- a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
+++ b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
@@ -19,7 +19,6 @@
 #include "llvm/IR/Module.h"
 #include "llvm/InitializePasses.h"
 #include "llvm/Support/DXILABI.h"
-#include "llvm/Support/ErrorHandling.h"
 
 #define DEBUG_TYPE "dxil-post-optimization-validation"
 
diff --git a/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-no-binding.ll b/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-no-binding.ll
index 9db072b01da13..065f3d94766ed 100644
--- a/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-no-binding.ll
+++ b/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-no-binding.ll
@@ -1,5 +1,5 @@
-; RUN: opt -S -passes='dxil-post-optimization-validation' %s 2>&1 
-; expected-no-diagnostics
+; RUN: opt -S -passes='dxil-post-optimization-validation' %s 
+; This is a valid case where no resource is being used
 target triple = "dxil-pc-shadermodel6.6-pixel"
 
 define void @CSMain() #0 {
@@ -11,5 +11,7 @@ attributes #0 = { noinline nounwind "exp-shader"="cs" "hlsl.numthreads"="1,2,1"
 !dx.rootsignatures = !{!0}
 
 !0 = !{ptr @CSMain, !1, i32 2}
-!1 = !{!2}
-!2 = !{ !"RootFlags", i32 294 } ; 32 = deny_pixel/hull/vertex/amplification_shader_root_access
+!1 = !{!2, !3, !4}
+!2 = !{!"RootConstants", i32 0, i32 2, i32 0, i32 4}
+!3 = !{ !"RootFlags", i32 294 } ; 32 = deny_pixel/hull/vertex/amplification_shader_root_access
+!4 = !{ !"RootSRV", i32 0, i32 1, i32 0, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-shader.ll b/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-shader.ll
index af344fa015cb9..845cb97d3fb29 100644
--- a/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-shader.ll
+++ b/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-shader.ll
@@ -1,5 +1,5 @@
-; RUN: opt -S -passes='dxil-post-optimization-validation' %s 2>&1 
-; expected-no-diagnostics
+; RUN: opt -S -passes='dxil-post-optimization-validation' %s 
+; Valid scenario where shader stage is not blocked from accessing root bindings
 target triple = "dxil-pc-shadermodel6.6-geometry"
 
 define void @CSMain() #0 {
@@ -11,5 +11,6 @@ attributes #0 = { noinline nounwind "exp-shader"="cs" "hlsl.numthreads"="1,2,1"
 !dx.rootsignatures = !{!0}
 
 !0 = !{ptr @CSMain, !1, i32 2}
-!1 = !{!2}
+!1 = !{!2, !3}
 !2 = !{ !"RootFlags", i32 294 } ; 32 = deny_pixel/hull/vertex/amplification_shader_root_access
+!3 = !{ !"RootCBV", i32 0, i32 1, i32 0, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-multiple-shader.ll b/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-multiple-shader.ll
index 5ab1389f8051b..c4f2365a4c1f6 100644
--- a/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-multiple-shader.ll
+++ b/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-multiple-shader.ll
@@ -1,5 +1,4 @@
 ; RUN: not opt -S -passes='dxil-post-optimization-validation' %s 2>&1 | FileCheck %s
-
 ; CHECK: error: Shader has root bindings but root signature uses a DENY flag to disallow root binding access to the shader stage.
 target triple = "dxil-pc-shadermodel6.6-pixel"
 

>From e5812cebd506079507a349d59968125ec0d4c92a Mon Sep 17 00:00:00 2001
From: Joao Saffran <{ID}+{username}@users.noreply.github.com>
Date: Thu, 14 Aug 2025 18:16:49 -0700
Subject: [PATCH 07/25] clean up

---
 llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp | 2 --
 1 file changed, 2 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
index 7e5e607e2d2c2..086fdd762feb8 100644
--- a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
+++ b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
@@ -326,8 +326,6 @@ static bool validateRootSignatureBindings(Module &M,
         reportOverlappingRegisters(M, ReportedBinding, Overlaping);
       });
   bool HasBindings = false;
-
-  // Next checks require that the root signature definition is valid.
     SmallVector<ResourceInfo::ResourceBinding> RDs =
         getRootDescriptorsBindingInfo(RSD, Visibility);
     for (const auto &ResList :

>From d186ebd990eaddedb7aac9086d43cb4f6434e373 Mon Sep 17 00:00:00 2001
From: Joao Saffran <{ID}+{username}@users.noreply.github.com>
Date: Thu, 14 Aug 2025 18:18:15 -0700
Subject: [PATCH 08/25] clean up

---
 .../DXILPostOptimizationValidation.cpp        | 36 +++++++++----------
 ...ootsignature-validation-deny-no-binding.ll |  2 +-
 2 files changed, 19 insertions(+), 19 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
index 086fdd762feb8..187e9a9e06d67 100644
--- a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
+++ b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
@@ -326,24 +326,24 @@ static bool validateRootSignatureBindings(Module &M,
         reportOverlappingRegisters(M, ReportedBinding, Overlaping);
       });
   bool HasBindings = false;
-    SmallVector<ResourceInfo::ResourceBinding> RDs =
-        getRootDescriptorsBindingInfo(RSD, Visibility);
-    for (const auto &ResList :
-         {std::make_pair(ResourceClass::SRV, DRM.srvs()),
-          std::make_pair(ResourceClass::UAV, DRM.uavs()),
-          std::make_pair(ResourceClass::CBuffer, DRM.cbuffers()),
-          std::make_pair(ResourceClass::Sampler, DRM.samplers())}) {
-      for (auto Res : ResList.second) {
-        llvm::dxil::ResourceInfo::ResourceBinding ResBinding = Res.getBinding();
-        llvm::hlsl::BindingInfo::BindingRange ResRange(
-            ResBinding.LowerBound, ResBinding.LowerBound + ResBinding.Size);
-
-        if (!Info.isBound(ResList.first, ResBinding.Space, ResRange))
-          reportRegNotBound(M, ResList.first, ResBinding);
-        else
-          HasBindings = true;
-      }
-      checkInvalidHandleTy(M, RDs, ResList.second);
+  SmallVector<ResourceInfo::ResourceBinding> RDs =
+      getRootDescriptorsBindingInfo(RSD, Visibility);
+  for (const auto &ResList :
+       {std::make_pair(ResourceClass::SRV, DRM.srvs()),
+        std::make_pair(ResourceClass::UAV, DRM.uavs()),
+        std::make_pair(ResourceClass::CBuffer, DRM.cbuffers()),
+        std::make_pair(ResourceClass::Sampler, DRM.samplers())}) {
+    for (auto Res : ResList.second) {
+      llvm::dxil::ResourceInfo::ResourceBinding ResBinding = Res.getBinding();
+      llvm::hlsl::BindingInfo::BindingRange ResRange(
+          ResBinding.LowerBound, ResBinding.LowerBound + ResBinding.Size);
+
+      if (!Info.isBound(ResList.first, ResBinding.Space, ResRange))
+        reportRegNotBound(M, ResList.first, ResBinding);
+      else
+        HasBindings = true;
+    }
+    checkInvalidHandleTy(M, RDs, ResList.second);
   }
   return HasBindings;
 }
diff --git a/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-no-binding.ll b/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-no-binding.ll
index 065f3d94766ed..15326d438f021 100644
--- a/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-no-binding.ll
+++ b/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-no-binding.ll
@@ -13,5 +13,5 @@ attributes #0 = { noinline nounwind "exp-shader"="cs" "hlsl.numthreads"="1,2,1"
 !0 = !{ptr @CSMain, !1, i32 2}
 !1 = !{!2, !3, !4}
 !2 = !{!"RootConstants", i32 0, i32 2, i32 0, i32 4}
-!3 = !{ !"RootFlags", i32 294 } ; 32 = deny_pixel/hull/vertex/amplification_shader_root_access
+!3 = !{ !"RootFlags", i32 294 } ; 294 = deny_pixel/hull/vertex/amplification_shader_root_access
 !4 = !{ !"RootSRV", i32 0, i32 1, i32 0, i32 0 }

>From 5c35c32fef4bf2c7d35be64988f9bc4f2bb9c5da Mon Sep 17 00:00:00 2001
From: Joao Saffran <{ID}+{username}@users.noreply.github.com>
Date: Thu, 14 Aug 2025 18:19:12 -0700
Subject: [PATCH 09/25] clean up

---
 .../CodeGen/DirectX/rootsignature-validation-deny-shader.ll     | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-shader.ll b/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-shader.ll
index 845cb97d3fb29..8a85946d263a8 100644
--- a/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-shader.ll
+++ b/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-shader.ll
@@ -12,5 +12,5 @@ attributes #0 = { noinline nounwind "exp-shader"="cs" "hlsl.numthreads"="1,2,1"
 
 !0 = !{ptr @CSMain, !1, i32 2}
 !1 = !{!2, !3}
-!2 = !{ !"RootFlags", i32 294 } ; 32 = deny_pixel/hull/vertex/amplification_shader_root_access
+!2 = !{ !"RootFlags", i32 294 } ; 294 = deny_pixel/hull/vertex/amplification_shader_root_access
 !3 = !{ !"RootCBV", i32 0, i32 1, i32 0, i32 0 }

>From 9169be0614d7f04a45992af139dbf51bb4ff3969 Mon Sep 17 00:00:00 2001
From: Joao Saffran <joaosaffranllvm at gmail.com>
Date: Mon, 15 Sep 2025 12:58:55 -0700
Subject: [PATCH 10/25] formatting

---
 .../DXILPostOptimizationValidation.cpp        | 36 +++++++++----------
 1 file changed, 17 insertions(+), 19 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
index 051c6631093c3..6c6c6c51007ef 100644
--- a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
+++ b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
@@ -160,7 +160,6 @@ tripleToVisibility(llvm::Triple::EnvironmentType ET) {
   }
 }
 
-
 static void reportIfDeniedShaderStageAccess(Module &M, dxbc::RootFlags Flags,
                                             dxbc::RootFlags Mask) {
   if ((Flags & Mask) == Mask) {
@@ -172,7 +171,6 @@ static void reportIfDeniedShaderStageAccess(Module &M, dxbc::RootFlags Flags,
   }
 }
 
-
 static void validateRootSignature(Module &M,
                                   const mcdxbc::RootSignatureDesc &RSD,
                                   dxil::ModuleMetadataInfo &MMI,
@@ -238,7 +236,7 @@ static void validateRootSignature(Module &M,
             Builder.findOverlapping(ReportedBinding);
         reportOverlappingRegisters(M, ReportedBinding, Overlaping);
       });
-  
+
   const hlsl::BoundRegs &BoundRegs = Builder.takeBoundRegs();
   bool HasBindings = false;
   for (const ResourceInfo &RI : DRM) {
@@ -253,35 +251,36 @@ static void validateRootSignature(Module &M,
 
     if (Reg != nullptr) {
       const auto *ParamInfo =
-      static_cast<const mcdxbc::RootParameterInfo *>(Reg->Cookie);
-      
-      if (RC != ResourceClass::SRV && RC != ResourceClass::UAV){
+          static_cast<const mcdxbc::RootParameterInfo *>(Reg->Cookie);
+
+      if (RC != ResourceClass::SRV && RC != ResourceClass::UAV) {
         HasBindings = true;
         continue;
       }
-    
-      if (ParamInfo->Type == dxbc::RootParameterType::DescriptorTable){
+
+      if (ParamInfo->Type == dxbc::RootParameterType::DescriptorTable) {
         HasBindings = true;
         continue;
       }
-      
-      if (RK != ResourceKind::RawBuffer && RK != ResourceKind::StructuredBuffer){
+
+      if (RK != ResourceKind::RawBuffer &&
+          RK != ResourceKind::StructuredBuffer) {
         reportInvalidHandleTyError(M, RC, Binding);
         continue;
       }
       HasBindings = true;
-      
+
     } else {
       reportRegNotBound(M, RC, Binding);
     }
   }
 
-  if(HasBindings && MMI.ShaderProfile != Triple::Compute){
+  if (HasBindings && MMI.ShaderProfile != Triple::Compute) {
     dxbc::RootFlags Flags = dxbc::RootFlags(RSD.Flags);
     switch (MMI.ShaderProfile) {
     case Triple::Pixel:
-      reportIfDeniedShaderStageAccess(M, Flags,
-                                      dxbc::RootFlags::DenyPixelShaderRootAccess);
+      reportIfDeniedShaderStageAccess(
+          M, Flags, dxbc::RootFlags::DenyPixelShaderRootAccess);
       break;
     case Triple::Vertex:
       reportIfDeniedShaderStageAccess(
@@ -292,16 +291,16 @@ static void validateRootSignature(Module &M,
           M, Flags, dxbc::RootFlags::DenyGeometryShaderRootAccess);
       break;
     case Triple::Hull:
-      reportIfDeniedShaderStageAccess(M, Flags,
-                                      dxbc::RootFlags::DenyHullShaderRootAccess);
+      reportIfDeniedShaderStageAccess(
+          M, Flags, dxbc::RootFlags::DenyHullShaderRootAccess);
       break;
     case Triple::Domain:
       reportIfDeniedShaderStageAccess(
           M, Flags, dxbc::RootFlags::DenyDomainShaderRootAccess);
       break;
     case Triple::Mesh:
-      reportIfDeniedShaderStageAccess(M, Flags,
-                                      dxbc::RootFlags::DenyMeshShaderRootAccess);
+      reportIfDeniedShaderStageAccess(
+          M, Flags, dxbc::RootFlags::DenyMeshShaderRootAccess);
       break;
     case Triple::Amplification:
       reportIfDeniedShaderStageAccess(
@@ -311,7 +310,6 @@ static void validateRootSignature(Module &M,
       llvm_unreachable("Invalid triple to shader stage conversion");
     }
   }
-
 }
 
 static mcdxbc::RootSignatureDesc *

>From 65089cebf5622de4bb44737b682c8e0e1eb3ef0e Mon Sep 17 00:00:00 2001
From: Joao Saffran <joaosaffranllvm at gmail.com>
Date: Mon, 15 Sep 2025 13:02:04 -0700
Subject: [PATCH 11/25] clean up

---
 llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
index 6c6c6c51007ef..1fbf8a91b465b 100644
--- a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
+++ b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
@@ -263,8 +263,7 @@ static void validateRootSignature(Module &M,
         continue;
       }
 
-      if (RK != ResourceKind::RawBuffer &&
-          RK != ResourceKind::StructuredBuffer) {
+      if (RK != ResourceKind::RawBuffer && RK != ResourceKind::StructuredBuffer) {
         reportInvalidHandleTyError(M, RC, Binding);
         continue;
       }
@@ -334,9 +333,8 @@ static void reportErrors(Module &M, DXILResourceMap &DRM,
   assert(!DRBI.hasImplicitBinding() && "implicit bindings should be handled in "
                                        "DXILResourceImplicitBinding pass");
 
-  if (mcdxbc::RootSignatureDesc *RSD = getRootSignature(RSBI, MMI)) {
+  if (mcdxbc::RootSignatureDesc *RSD = getRootSignature(RSBI, MMI)) 
     validateRootSignature(M, *RSD, MMI, DRM, DRTM);
-  }
 }
 
 PreservedAnalyses

>From 591027149e0c08d51c066faf990524234228af80 Mon Sep 17 00:00:00 2001
From: Joao Saffran <joaosaffranllvm at gmail.com>
Date: Mon, 15 Sep 2025 13:03:08 -0700
Subject: [PATCH 12/25] clean up

---
 llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
index 1fbf8a91b465b..53f107b526359 100644
--- a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
+++ b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
@@ -263,7 +263,8 @@ static void validateRootSignature(Module &M,
         continue;
       }
 
-      if (RK != ResourceKind::RawBuffer && RK != ResourceKind::StructuredBuffer) {
+      if (RK != ResourceKind::RawBuffer &&
+          RK != ResourceKind::StructuredBuffer) {
         reportInvalidHandleTyError(M, RC, Binding);
         continue;
       }
@@ -333,7 +334,7 @@ static void reportErrors(Module &M, DXILResourceMap &DRM,
   assert(!DRBI.hasImplicitBinding() && "implicit bindings should be handled in "
                                        "DXILResourceImplicitBinding pass");
 
-  if (mcdxbc::RootSignatureDesc *RSD = getRootSignature(RSBI, MMI)) 
+  if (mcdxbc::RootSignatureDesc *RSD = getRootSignature(RSBI, MMI))
     validateRootSignature(M, *RSD, MMI, DRM, DRTM);
 }
 

>From 311a2e5d0e9abc8f82689868cf919764973929b8 Mon Sep 17 00:00:00 2001
From: Joao Saffran <joaosaffranllvm at gmail.com>
Date: Mon, 15 Sep 2025 13:09:18 -0700
Subject: [PATCH 13/25] clean up

---
 .../DirectX/DXILPostOptimizationValidation.cpp   | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
index 53f107b526359..c45ca553361b6 100644
--- a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
+++ b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
@@ -162,15 +162,17 @@ tripleToVisibility(llvm::Triple::EnvironmentType ET) {
 
 static void reportIfDeniedShaderStageAccess(Module &M, dxbc::RootFlags Flags,
                                             dxbc::RootFlags Mask) {
-  if ((Flags & Mask) == Mask) {
-    SmallString<128> Message;
-    raw_svector_ostream OS(Message);
-    OS << "Shader has root bindings but root signature uses a DENY flag to "
-          "disallow root binding access to the shader stage.";
-    M.getContext().diagnose(DiagnosticInfoGeneric(Message));
-  }
+  if ((Flags & Mask) != Mask) 
+    return;
+  
+  SmallString<128> Message;
+  raw_svector_ostream OS(Message);
+  OS << "Shader has root bindings but root signature uses a DENY flag to "
+        "disallow root binding access to the shader stage.";
+  M.getContext().diagnose(DiagnosticInfoGeneric(Message));
 }
 
+
 static void validateRootSignature(Module &M,
                                   const mcdxbc::RootSignatureDesc &RSD,
                                   dxil::ModuleMetadataInfo &MMI,

>From 901bd1d85ca416e4757cb23fe52d4729fe03d500 Mon Sep 17 00:00:00 2001
From: Joao Saffran <joaosaffranllvm at gmail.com>
Date: Mon, 15 Sep 2025 13:09:34 -0700
Subject: [PATCH 14/25] clean up

---
 llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
index c45ca553361b6..5904d6354bc48 100644
--- a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
+++ b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
@@ -162,9 +162,9 @@ tripleToVisibility(llvm::Triple::EnvironmentType ET) {
 
 static void reportIfDeniedShaderStageAccess(Module &M, dxbc::RootFlags Flags,
                                             dxbc::RootFlags Mask) {
-  if ((Flags & Mask) != Mask) 
+  if ((Flags & Mask) != Mask)
     return;
-  
+
   SmallString<128> Message;
   raw_svector_ostream OS(Message);
   OS << "Shader has root bindings but root signature uses a DENY flag to "
@@ -172,7 +172,6 @@ static void reportIfDeniedShaderStageAccess(Module &M, dxbc::RootFlags Flags,
   M.getContext().diagnose(DiagnosticInfoGeneric(Message));
 }
 
-
 static void validateRootSignature(Module &M,
                                   const mcdxbc::RootSignatureDesc &RSD,
                                   dxil::ModuleMetadataInfo &MMI,

>From aba77f927e6afc70913eeb2fa7a2113a01cee384 Mon Sep 17 00:00:00 2001
From: Joao Saffran <joaosaffranllvm at gmail.com>
Date: Mon, 15 Sep 2025 13:16:33 -0700
Subject: [PATCH 15/25] fix test

---
 .../DirectX/rootsignature-validation-deny-shader.ll      | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-shader.ll b/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-shader.ll
index 8a85946d263a8..775fc3512ca84 100644
--- a/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-shader.ll
+++ b/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-shader.ll
@@ -2,8 +2,13 @@
 ; Valid scenario where shader stage is not blocked from accessing root bindings
 target triple = "dxil-pc-shadermodel6.6-geometry"
 
-define void @CSMain() #0 {
+%__cblayout_CB = type <{ float }>
+
+ at CB.str = private unnamed_addr constant [3 x i8] c"CB\00", align 1
+
+define void @CSMain() "hlsl.shader"="geometry" {
 entry:
+  %CB = tail call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 4, 0)) @llvm.dx.resource.handlefrombinding(i32 0, i32 2, i32 1, i32 0, ptr nonnull @CB.str)
   ret void
 }
 attributes #0 = { noinline nounwind "exp-shader"="cs" "hlsl.numthreads"="1,2,1" "hlsl.shader"="geometry" }
@@ -13,4 +18,4 @@ attributes #0 = { noinline nounwind "exp-shader"="cs" "hlsl.numthreads"="1,2,1"
 !0 = !{ptr @CSMain, !1, i32 2}
 !1 = !{!2, !3}
 !2 = !{ !"RootFlags", i32 294 } ; 294 = deny_pixel/hull/vertex/amplification_shader_root_access
-!3 = !{ !"RootCBV", i32 0, i32 1, i32 0, i32 0 }
+!3 = !{ !"RootCBV", i32 0, i32 2, i32 0, i32 0 }

>From 22319f99e4a941be1240557f32f3bc119eedb820 Mon Sep 17 00:00:00 2001
From: Joao Saffran <joaosaffranllvm at gmail.com>
Date: Mon, 15 Sep 2025 13:18:26 -0700
Subject: [PATCH 16/25] rename test

---
 ...gnature-validation-fail-deny-single-shader-root-descriptor.ll} | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename llvm/test/CodeGen/DirectX/{rootsignature-validation-fail-deny-single-shader-descriptor-table.ll => rootsignature-validation-fail-deny-single-shader-root-descriptor.ll} (100%)

diff --git a/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-single-shader-descriptor-table.ll b/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-single-shader-root-descriptor.ll
similarity index 100%
rename from llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-single-shader-descriptor-table.ll
rename to llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-single-shader-root-descriptor.ll

>From 4c86232f1fe40f9fc9f4baad3df6d3d7c308adee Mon Sep 17 00:00:00 2001
From: Joao Saffran <joaosaffranllvm at gmail.com>
Date: Mon, 15 Sep 2025 13:21:10 -0700
Subject: [PATCH 17/25] rename test

---
 ...ny-shader.ll => rootsignature-validation-not-dening-shader.ll} | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename llvm/test/CodeGen/DirectX/{rootsignature-validation-deny-shader.ll => rootsignature-validation-not-dening-shader.ll} (100%)

diff --git a/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-shader.ll b/llvm/test/CodeGen/DirectX/rootsignature-validation-not-dening-shader.ll
similarity index 100%
rename from llvm/test/CodeGen/DirectX/rootsignature-validation-deny-shader.ll
rename to llvm/test/CodeGen/DirectX/rootsignature-validation-not-dening-shader.ll

>From 6641d66db8c5c69f0cc45ce3da2ca4f09c14facd Mon Sep 17 00:00:00 2001
From: Joao Saffran <joaosaffranllvm at gmail.com>
Date: Mon, 15 Sep 2025 13:21:56 -0700
Subject: [PATCH 18/25] rename test

---
 ...r.ll => rootsignature-validation-fail-deny-root-descriptor.ll} | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename llvm/test/CodeGen/DirectX/{rootsignature-validation-fail-deny-single-shader-root-descriptor.ll => rootsignature-validation-fail-deny-root-descriptor.ll} (100%)

diff --git a/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-single-shader-root-descriptor.ll b/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-root-descriptor.ll
similarity index 100%
rename from llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-single-shader-root-descriptor.ll
rename to llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-root-descriptor.ll

>From c9986edad488a7309b033dad7ba8f04a3a5313d9 Mon Sep 17 00:00:00 2001
From: Joao Saffran <joaosaffranllvm at gmail.com>
Date: Mon, 15 Sep 2025 14:32:30 -0700
Subject: [PATCH 19/25] refactoring follow inbelic suggestion

---
 .../DXILPostOptimizationValidation.cpp        | 40 ++++++++-----------
 1 file changed, 17 insertions(+), 23 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
index 5904d6354bc48..4fa12e8bbd981 100644
--- a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
+++ b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
@@ -162,9 +162,9 @@ tripleToVisibility(llvm::Triple::EnvironmentType ET) {
 
 static void reportIfDeniedShaderStageAccess(Module &M, dxbc::RootFlags Flags,
                                             dxbc::RootFlags Mask) {
-  if ((Flags & Mask) != Mask)
+  if ((Flags & Mask) != Mask) 
     return;
-
+  
   SmallString<128> Message;
   raw_svector_ostream OS(Message);
   OS << "Shader has root bindings but root signature uses a DENY flag to "
@@ -172,6 +172,7 @@ static void reportIfDeniedShaderStageAccess(Module &M, dxbc::RootFlags Flags,
   M.getContext().diagnose(DiagnosticInfoGeneric(Message));
 }
 
+
 static void validateRootSignature(Module &M,
                                   const mcdxbc::RootSignatureDesc &RSD,
                                   dxil::ModuleMetadataInfo &MMI,
@@ -250,30 +251,23 @@ static void validateRootSignature(Module &M,
         BoundRegs.findBoundReg(RC, Binding.Space, Binding.LowerBound,
                                Binding.LowerBound + Binding.Size - 1);
 
-    if (Reg != nullptr) {
-      const auto *ParamInfo =
-          static_cast<const mcdxbc::RootParameterInfo *>(Reg->Cookie);
-
-      if (RC != ResourceClass::SRV && RC != ResourceClass::UAV) {
-        HasBindings = true;
-        continue;
-      }
-
-      if (ParamInfo->Type == dxbc::RootParameterType::DescriptorTable) {
-        HasBindings = true;
-        continue;
-      }
+    if (!Reg) {
+      reportRegNotBound(M, RC, Binding);
+      continue;
+    }
 
-      if (RK != ResourceKind::RawBuffer &&
-          RK != ResourceKind::StructuredBuffer) {
-        reportInvalidHandleTyError(M, RC, Binding);
-        continue;
-      }
-      HasBindings = true;
+    const auto *ParamInfo =
+          static_cast<const mcdxbc::RootParameterInfo *>(Reg->Cookie);
 
-    } else {
-      reportRegNotBound(M, RC, Binding);
+    bool IsRootSRVOrUAV = RC == ResourceClass::SRV || RC == ResourceClass::UAV;
+    bool IsDescriptorTable = ParamInfo->Type == dxbc::RootParameterType::DescriptorTable;
+    bool IsRawOrStructuredBuffer = RK != ResourceKind::RawBuffer && RK != ResourceKind::StructuredBuffer;
+    if (IsRootSRVOrUAV && !IsDescriptorTable && IsRawOrStructuredBuffer ) {
+      reportInvalidHandleTyError(M, RC, Binding);
+      continue;
     }
+
+    HasBindings = true;
   }
 
   if (HasBindings && MMI.ShaderProfile != Triple::Compute) {

>From a0916e14497b0c213611120669611c265cc64f8b Mon Sep 17 00:00:00 2001
From: Joao Saffran <joaosaffranllvm at gmail.com>
Date: Mon, 15 Sep 2025 14:32:53 -0700
Subject: [PATCH 20/25] formating

---
 .../DirectX/DXILPostOptimizationValidation.cpp    | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
index 4fa12e8bbd981..21a94cd5ce2e5 100644
--- a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
+++ b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
@@ -162,9 +162,9 @@ tripleToVisibility(llvm::Triple::EnvironmentType ET) {
 
 static void reportIfDeniedShaderStageAccess(Module &M, dxbc::RootFlags Flags,
                                             dxbc::RootFlags Mask) {
-  if ((Flags & Mask) != Mask) 
+  if ((Flags & Mask) != Mask)
     return;
-  
+
   SmallString<128> Message;
   raw_svector_ostream OS(Message);
   OS << "Shader has root bindings but root signature uses a DENY flag to "
@@ -172,7 +172,6 @@ static void reportIfDeniedShaderStageAccess(Module &M, dxbc::RootFlags Flags,
   M.getContext().diagnose(DiagnosticInfoGeneric(Message));
 }
 
-
 static void validateRootSignature(Module &M,
                                   const mcdxbc::RootSignatureDesc &RSD,
                                   dxil::ModuleMetadataInfo &MMI,
@@ -257,12 +256,14 @@ static void validateRootSignature(Module &M,
     }
 
     const auto *ParamInfo =
-          static_cast<const mcdxbc::RootParameterInfo *>(Reg->Cookie);
+        static_cast<const mcdxbc::RootParameterInfo *>(Reg->Cookie);
 
     bool IsRootSRVOrUAV = RC == ResourceClass::SRV || RC == ResourceClass::UAV;
-    bool IsDescriptorTable = ParamInfo->Type == dxbc::RootParameterType::DescriptorTable;
-    bool IsRawOrStructuredBuffer = RK != ResourceKind::RawBuffer && RK != ResourceKind::StructuredBuffer;
-    if (IsRootSRVOrUAV && !IsDescriptorTable && IsRawOrStructuredBuffer ) {
+    bool IsDescriptorTable =
+        ParamInfo->Type == dxbc::RootParameterType::DescriptorTable;
+    bool IsRawOrStructuredBuffer =
+        RK != ResourceKind::RawBuffer && RK != ResourceKind::StructuredBuffer;
+    if (IsRootSRVOrUAV && !IsDescriptorTable && IsRawOrStructuredBuffer) {
       reportInvalidHandleTyError(M, RC, Binding);
       continue;
     }

>From 1f8e5b699a7e74bf5cebc3225fcd0223f64c8ba0 Mon Sep 17 00:00:00 2001
From: Joao Saffran <joaosaffranllvm at gmail.com>
Date: Mon, 15 Sep 2025 14:57:43 -0700
Subject: [PATCH 21/25] adding getEnvironmentDenyFlagMask

---
 .../DXILPostOptimizationValidation.cpp        | 65 +++++++++----------
 1 file changed, 29 insertions(+), 36 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
index 21a94cd5ce2e5..21d3361b5f278 100644
--- a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
+++ b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
@@ -172,6 +172,28 @@ static void reportIfDeniedShaderStageAccess(Module &M, dxbc::RootFlags Flags,
   M.getContext().diagnose(DiagnosticInfoGeneric(Message));
 }
 
+static dxbc::RootFlags
+getEnvironmentDenyFlagMask(Triple::EnvironmentType ShaderProfile) {
+  switch (ShaderProfile) {
+  case Triple::Pixel:
+    return dxbc::RootFlags::DenyPixelShaderRootAccess;
+  case Triple::Vertex:
+    return dxbc::RootFlags::DenyVertexShaderRootAccess;
+  case Triple::Geometry:
+    return dxbc::RootFlags::DenyGeometryShaderRootAccess;
+  case Triple::Hull:
+    return dxbc::RootFlags::DenyHullShaderRootAccess;
+  case Triple::Domain:
+    return dxbc::RootFlags::DenyDomainShaderRootAccess;
+  case Triple::Mesh:
+    return dxbc::RootFlags::DenyMeshShaderRootAccess;
+  case Triple::Amplification:
+    return dxbc::RootFlags::DenyAmplificationShaderRootAccess;
+  default:
+    llvm_unreachable("Invalid triple to shader stage conversion");
+  }
+}
+
 static void validateRootSignature(Module &M,
                                   const mcdxbc::RootSignatureDesc &RSD,
                                   dxil::ModuleMetadataInfo &MMI,
@@ -258,10 +280,10 @@ static void validateRootSignature(Module &M,
     const auto *ParamInfo =
         static_cast<const mcdxbc::RootParameterInfo *>(Reg->Cookie);
 
-    bool IsRootSRVOrUAV = RC == ResourceClass::SRV || RC == ResourceClass::UAV;
-    bool IsDescriptorTable =
+    const bool IsRootSRVOrUAV = RC == ResourceClass::SRV || RC == ResourceClass::UAV;
+    const bool IsDescriptorTable =
         ParamInfo->Type == dxbc::RootParameterType::DescriptorTable;
-    bool IsRawOrStructuredBuffer =
+    const bool IsRawOrStructuredBuffer =
         RK != ResourceKind::RawBuffer && RK != ResourceKind::StructuredBuffer;
     if (IsRootSRVOrUAV && !IsDescriptorTable && IsRawOrStructuredBuffer) {
       reportInvalidHandleTyError(M, RC, Binding);
@@ -272,39 +294,10 @@ static void validateRootSignature(Module &M,
   }
 
   if (HasBindings && MMI.ShaderProfile != Triple::Compute) {
-    dxbc::RootFlags Flags = dxbc::RootFlags(RSD.Flags);
-    switch (MMI.ShaderProfile) {
-    case Triple::Pixel:
-      reportIfDeniedShaderStageAccess(
-          M, Flags, dxbc::RootFlags::DenyPixelShaderRootAccess);
-      break;
-    case Triple::Vertex:
-      reportIfDeniedShaderStageAccess(
-          M, Flags, dxbc::RootFlags::DenyVertexShaderRootAccess);
-      break;
-    case Triple::Geometry:
-      reportIfDeniedShaderStageAccess(
-          M, Flags, dxbc::RootFlags::DenyGeometryShaderRootAccess);
-      break;
-    case Triple::Hull:
-      reportIfDeniedShaderStageAccess(
-          M, Flags, dxbc::RootFlags::DenyHullShaderRootAccess);
-      break;
-    case Triple::Domain:
-      reportIfDeniedShaderStageAccess(
-          M, Flags, dxbc::RootFlags::DenyDomainShaderRootAccess);
-      break;
-    case Triple::Mesh:
-      reportIfDeniedShaderStageAccess(
-          M, Flags, dxbc::RootFlags::DenyMeshShaderRootAccess);
-      break;
-    case Triple::Amplification:
-      reportIfDeniedShaderStageAccess(
-          M, Flags, dxbc::RootFlags::DenyAmplificationShaderRootAccess);
-      break;
-    default:
-      llvm_unreachable("Invalid triple to shader stage conversion");
-    }
+    const dxbc::RootFlags Flags = dxbc::RootFlags(RSD.Flags);
+    const dxbc::RootFlags Mask = getEnvironmentDenyFlagMask(MMI.ShaderProfile);
+
+    reportIfDeniedShaderStageAccess(M, Flags, Mask);
   }
 }
 

>From 1c2a864e04a7f16fd61f9a0f03906229fbca49bf Mon Sep 17 00:00:00 2001
From: Joao Saffran <joaosaffranllvm at gmail.com>
Date: Mon, 15 Sep 2025 15:02:52 -0700
Subject: [PATCH 22/25] format

---
 llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
index 21d3361b5f278..2a346c8f1604e 100644
--- a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
+++ b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
@@ -280,7 +280,8 @@ static void validateRootSignature(Module &M,
     const auto *ParamInfo =
         static_cast<const mcdxbc::RootParameterInfo *>(Reg->Cookie);
 
-    const bool IsRootSRVOrUAV = RC == ResourceClass::SRV || RC == ResourceClass::UAV;
+    const bool IsRootSRVOrUAV =
+        RC == ResourceClass::SRV || RC == ResourceClass::UAV;
     const bool IsDescriptorTable =
         ParamInfo->Type == dxbc::RootParameterType::DescriptorTable;
     const bool IsRawOrStructuredBuffer =

>From 8cccaf39cf47a3978b82b5859af548fd5fa6bb7e Mon Sep 17 00:00:00 2001
From: Joao Saffran <joaosaffranllvm at gmail.com>
Date: Wed, 17 Sep 2025 13:44:45 -0700
Subject: [PATCH 23/25] making getEnvironmentDenyFlagMask return optional

---
 .../DXILPostOptimizationValidation.cpp        | 20 ++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
index 2a346c8f1604e..3531bb9c68eeb 100644
--- a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
+++ b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
@@ -160,8 +160,9 @@ tripleToVisibility(llvm::Triple::EnvironmentType ET) {
   }
 }
 
-static void reportIfDeniedShaderStageAccess(Module &M, dxbc::RootFlags Flags,
-                                            dxbc::RootFlags Mask) {
+static void reportIfDeniedShaderStageAccess(Module &M,
+                                            const dxbc::RootFlags &Flags,
+                                            const dxbc::RootFlags &Mask) {
   if ((Flags & Mask) != Mask)
     return;
 
@@ -172,7 +173,7 @@ static void reportIfDeniedShaderStageAccess(Module &M, dxbc::RootFlags Flags,
   M.getContext().diagnose(DiagnosticInfoGeneric(Message));
 }
 
-static dxbc::RootFlags
+static std::optional<dxbc::RootFlags>
 getEnvironmentDenyFlagMask(Triple::EnvironmentType ShaderProfile) {
   switch (ShaderProfile) {
   case Triple::Pixel:
@@ -190,7 +191,7 @@ getEnvironmentDenyFlagMask(Triple::EnvironmentType ShaderProfile) {
   case Triple::Amplification:
     return dxbc::RootFlags::DenyAmplificationShaderRootAccess;
   default:
-    llvm_unreachable("Invalid triple to shader stage conversion");
+    return std::nullopt;
   }
 }
 
@@ -293,13 +294,14 @@ static void validateRootSignature(Module &M,
 
     HasBindings = true;
   }
+  const std::optional<dxbc::RootFlags> Mask =
+      getEnvironmentDenyFlagMask(MMI.ShaderProfile);
 
-  if (HasBindings && MMI.ShaderProfile != Triple::Compute) {
-    const dxbc::RootFlags Flags = dxbc::RootFlags(RSD.Flags);
-    const dxbc::RootFlags Mask = getEnvironmentDenyFlagMask(MMI.ShaderProfile);
+  if (!Mask.has_value() || !HasBindings)
+    return;
 
-    reportIfDeniedShaderStageAccess(M, Flags, Mask);
-  }
+  const dxbc::RootFlags Flags = dxbc::RootFlags(RSD.Flags);
+  reportIfDeniedShaderStageAccess(M, Flags, Mask.value());
 }
 
 static mcdxbc::RootSignatureDesc *

>From b3bc8b8adf92d7e79d3c96b2c7134fa569b20949 Mon Sep 17 00:00:00 2001
From: Joao Saffran <joaosaffranllvm at gmail.com>
Date: Wed, 17 Sep 2025 16:45:32 -0700
Subject: [PATCH 24/25] renaming SRVorUAV flag

---
 llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
index 3531bb9c68eeb..227d09ea365c0 100644
--- a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
+++ b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
@@ -281,13 +281,13 @@ static void validateRootSignature(Module &M,
     const auto *ParamInfo =
         static_cast<const mcdxbc::RootParameterInfo *>(Reg->Cookie);
 
-    const bool IsRootSRVOrUAV =
+    const bool IsSRVOrUAV =
         RC == ResourceClass::SRV || RC == ResourceClass::UAV;
     const bool IsDescriptorTable =
         ParamInfo->Type == dxbc::RootParameterType::DescriptorTable;
     const bool IsRawOrStructuredBuffer =
         RK != ResourceKind::RawBuffer && RK != ResourceKind::StructuredBuffer;
-    if (IsRootSRVOrUAV && !IsDescriptorTable && IsRawOrStructuredBuffer) {
+    if (IsSRVOrUAV && !IsDescriptorTable && IsRawOrStructuredBuffer) {
       reportInvalidHandleTyError(M, RC, Binding);
       continue;
     }

>From 83ee5fea8584f3e1677972d3106f38981b653d7f Mon Sep 17 00:00:00 2001
From: Joao Saffran <joaosaffranllvm at gmail.com>
Date: Wed, 24 Sep 2025 10:31:26 -0700
Subject: [PATCH 25/25] addressing comments from bogner

---
 .../Target/DirectX/DXILPostOptimizationValidation.cpp    | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
index 227d09ea365c0..5fa25ce93eb02 100644
--- a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
+++ b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
@@ -294,14 +294,13 @@ static void validateRootSignature(Module &M,
 
     HasBindings = true;
   }
-  const std::optional<dxbc::RootFlags> Mask =
-      getEnvironmentDenyFlagMask(MMI.ShaderProfile);
 
-  if (!Mask.has_value() || !HasBindings)
+  if (!HasBindings)
     return;
 
-  const dxbc::RootFlags Flags = dxbc::RootFlags(RSD.Flags);
-  reportIfDeniedShaderStageAccess(M, Flags, Mask.value());
+  if (std::optional<dxbc::RootFlags> Mask =
+          getEnvironmentDenyFlagMask(MMI.ShaderProfile))
+    reportIfDeniedShaderStageAccess(M, dxbc::RootFlags(RSD.Flags), *Mask);
 }
 
 static mcdxbc::RootSignatureDesc *



More information about the llvm-branch-commits mailing list