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/26] 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 #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(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(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(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(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/26] 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 #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/26] 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/26] 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/26] 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 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 }> + +@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 }> + +@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/26] 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/26] 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 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/26] 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 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 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/26] 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 Date: Mon, 15 Sep 2025 12:58:55 -0700 Subject: [PATCH 10/26] 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(Reg->Cookie); - - if (RC != ResourceClass::SRV && RC != ResourceClass::UAV){ + static_cast(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 Date: Mon, 15 Sep 2025 13:02:04 -0700 Subject: [PATCH 11/26] 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 Date: Mon, 15 Sep 2025 13:03:08 -0700 Subject: [PATCH 12/26] 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 Date: Mon, 15 Sep 2025 13:09:18 -0700 Subject: [PATCH 13/26] 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 Date: Mon, 15 Sep 2025 13:09:34 -0700 Subject: [PATCH 14/26] 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 Date: Mon, 15 Sep 2025 13:16:33 -0700 Subject: [PATCH 15/26] 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 }> + +@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 Date: Mon, 15 Sep 2025 13:18:26 -0700 Subject: [PATCH 16/26] 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 Date: Mon, 15 Sep 2025 13:21:10 -0700 Subject: [PATCH 17/26] 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 Date: Mon, 15 Sep 2025 13:21:56 -0700 Subject: [PATCH 18/26] 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 Date: Mon, 15 Sep 2025 14:32:30 -0700 Subject: [PATCH 19/26] 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(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(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 Date: Mon, 15 Sep 2025 14:32:53 -0700 Subject: [PATCH 20/26] 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(Reg->Cookie); + static_cast(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 Date: Mon, 15 Sep 2025 14:57:43 -0700 Subject: [PATCH 21/26] 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(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 Date: Mon, 15 Sep 2025 15:02:52 -0700 Subject: [PATCH 22/26] 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(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 Date: Wed, 17 Sep 2025 13:44:45 -0700 Subject: [PATCH 23/26] 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 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 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 Date: Wed, 17 Sep 2025 16:45:32 -0700 Subject: [PATCH 24/26] 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(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 Date: Wed, 24 Sep 2025 10:31:26 -0700 Subject: [PATCH 25/26] 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 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 Mask = + getEnvironmentDenyFlagMask(MMI.ShaderProfile)) + reportIfDeniedShaderStageAccess(M, dxbc::RootFlags(RSD.Flags), *Mask); } static mcdxbc::RootSignatureDesc * From fdcd3e3da7adb79535e01a731e977bbe19f9c659 Mon Sep 17 00:00:00 2001 From: Joao Saffran Date: Thu, 25 Sep 2025 10:00:40 -0700 Subject: [PATCH 26/26] removing consts --- llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp index 5fa25ce93eb02..6e95a4232fabe 100644 --- a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp +++ b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp @@ -281,11 +281,10 @@ static void validateRootSignature(Module &M, const auto *ParamInfo = static_cast(Reg->Cookie); - const bool IsSRVOrUAV = - RC == ResourceClass::SRV || RC == ResourceClass::UAV; - const bool IsDescriptorTable = + bool IsSRVOrUAV = RC == ResourceClass::SRV || RC == ResourceClass::UAV; + bool IsDescriptorTable = ParamInfo->Type == dxbc::RootParameterType::DescriptorTable; - const bool IsRawOrStructuredBuffer = + bool IsRawOrStructuredBuffer = RK != ResourceKind::RawBuffer && RK != ResourceKind::StructuredBuffer; if (IsSRVOrUAV && !IsDescriptorTable && IsRawOrStructuredBuffer) { reportInvalidHandleTyError(M, RC, Binding);