diff --git a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp index 6e95a4232fabe..7e93474e73118 100644 --- a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp +++ b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp @@ -160,41 +160,6 @@ tripleToVisibility(llvm::Triple::EnvironmentType ET) { } } -static void reportIfDeniedShaderStageAccess(Module &M, - const dxbc::RootFlags &Flags, - const dxbc::RootFlags &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 " - "disallow root binding access to the shader stage."; - M.getContext().diagnose(DiagnosticInfoGeneric(Message)); -} - -static std::optional -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: - return std::nullopt; - } -} - static void validateRootSignature(Module &M, const mcdxbc::RootSignatureDesc &RSD, dxil::ModuleMetadataInfo &MMI, @@ -260,9 +225,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) { const ResourceInfo::ResourceBinding &Binding = RI.getBinding(); const dxil::ResourceTypeInfo &RTI = DRTM[RI.getHandleTy()]; @@ -273,33 +236,22 @@ static void validateRootSignature(Module &M, BoundRegs.findBoundReg(RC, Binding.Space, Binding.LowerBound, Binding.LowerBound + Binding.Size - 1); - if (!Reg) { - reportRegNotBound(M, RC, Binding); - continue; - } + if (Reg != nullptr) { + const auto *ParamInfo = + static_cast(Reg->Cookie); + + if (RC != ResourceClass::SRV && RC != ResourceClass::UAV) + continue; - const auto *ParamInfo = - static_cast(Reg->Cookie); + if (ParamInfo->Type == dxbc::RootParameterType::DescriptorTable) + continue; - bool IsSRVOrUAV = RC == ResourceClass::SRV || RC == ResourceClass::UAV; - bool IsDescriptorTable = - ParamInfo->Type == dxbc::RootParameterType::DescriptorTable; - bool IsRawOrStructuredBuffer = - RK != ResourceKind::RawBuffer && RK != ResourceKind::StructuredBuffer; - if (IsSRVOrUAV && !IsDescriptorTable && IsRawOrStructuredBuffer) { - reportInvalidHandleTyError(M, RC, Binding); - continue; + if (RK != ResourceKind::RawBuffer && RK != ResourceKind::StructuredBuffer) + reportInvalidHandleTyError(M, RC, Binding); + } else { + reportRegNotBound(M, RC, Binding); } - - HasBindings = true; } - - if (!HasBindings) - return; - - if (std::optional Mask = - getEnvironmentDenyFlagMask(MMI.ShaderProfile)) - reportIfDeniedShaderStageAccess(M, dxbc::RootFlags(RSD.Flags), *Mask); } static mcdxbc::RootSignatureDesc * diff --git a/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-no-binding.ll b/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-no-binding.ll deleted file mode 100644 index 15326d438f021..0000000000000 --- a/llvm/test/CodeGen/DirectX/rootsignature-validation-deny-no-binding.ll +++ /dev/null @@ -1,17 +0,0 @@ -; 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 { -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, !3, !4} -!2 = !{!"RootConstants", i32 0, i32 2, i32 0, i32 4} -!3 = !{ !"RootFlags", i32 294 } ; 294 = 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-fail-deny-multiple-shader.ll b/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-multiple-shader.ll deleted file mode 100644 index b11cce694bd25..0000000000000 --- a/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-multiple-shader.ll +++ /dev/null @@ -1,20 +0,0 @@ -; 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" - -%__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, ptr nonnull @CB.str) - ret void -} - -!dx.rootsignatures = !{!0} - -!0 = !{ptr @CSMain, !1, i32 2} -!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-root-descriptor.ll b/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-root-descriptor.ll deleted file mode 100644 index 6d323757d5897..0000000000000 --- a/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-root-descriptor.ll +++ /dev/null @@ -1,20 +0,0 @@ -; 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" - -@SB.str = private unnamed_addr constant [3 x i8] c"SB\00", align 1 - -define void @CSMain() "hlsl.shader"="pixel" { -entry: - %SB = tail call target("dx.RawBuffer", i32, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, ptr nonnull @SB.str) - ret void -} - -!dx.rootsignatures = !{!0} - -!0 = !{ptr @CSMain, !1, i32 2} -!1 = !{!2, !3} -!2 = !{!"DescriptorTable", i32 0, !4} -!4 = !{!"SRV", i32 1, i32 0, i32 0, i32 -1, i32 4} -!3 = !{!"RootFlags", i32 32} ; 32 = deny_pixel_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 deleted file mode 100644 index 4e50f50049b0e..0000000000000 --- a/llvm/test/CodeGen/DirectX/rootsignature-validation-fail-deny-single-shader.ll +++ /dev/null @@ -1,19 +0,0 @@ -; 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" - -@SB.str = private unnamed_addr constant [3 x i8] c"SB\00", align 1 - -define void @CSMain() "hlsl.shader"="pixel" { -entry: - %SB = tail call target("dx.RawBuffer", i32, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, ptr nonnull @SB.str) - ret void -} - -!dx.rootsignatures = !{!0} - -!0 = !{ptr @CSMain, !1, i32 2} -!1 = !{!2, !3} -!2 = !{!"RootSRV", i32 0, i32 0, i32 0, i32 4} -!3 = !{!"RootFlags", i32 32} ; 32 = deny_pixel_shader_root_access diff --git a/llvm/test/CodeGen/DirectX/rootsignature-validation-not-dening-shader.ll b/llvm/test/CodeGen/DirectX/rootsignature-validation-not-dening-shader.ll deleted file mode 100644 index 775fc3512ca84..0000000000000 --- a/llvm/test/CodeGen/DirectX/rootsignature-validation-not-dening-shader.ll +++ /dev/null @@ -1,21 +0,0 @@ -; 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" - -%__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" } - -!dx.rootsignatures = !{!0} - -!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 2, i32 0, i32 0 }