[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