From a35414c8b87b606f47559868b12816c6b6122287 Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Fri, 4 Jul 2025 20:54:50 +0000 Subject: [PATCH 1/6] [HLSL][DirectX] Add `verifyNumDescriptors` --- .../Frontend/HLSL/RootSignatureValidations.h | 1 + .../HLSL/RootSignatureValidations.cpp | 4 ++++ llvm/lib/Target/DirectX/DXILRootSignature.cpp | 3 +++ ...-DescriptorTable-Invalid-NumDescriptors.ll | 19 +++++++++++++++++++ 4 files changed, 27 insertions(+) create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-NumDescriptors.ll diff --git a/llvm/include/llvm/Frontend/HLSL/RootSignatureValidations.h b/llvm/include/llvm/Frontend/HLSL/RootSignatureValidations.h index 9b68a524432cc..bcef20530559d 100644 --- a/llvm/include/llvm/Frontend/HLSL/RootSignatureValidations.h +++ b/llvm/include/llvm/Frontend/HLSL/RootSignatureValidations.h @@ -31,6 +31,7 @@ bool verifyDescriptorFlag(uint32_t Flags); bool verifyRangeType(uint32_t Type); bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type, uint32_t FlagsVal); +bool verifyNumDescriptors(uint32_t NumDescriptors); bool verifySamplerFilter(uint32_t Value); bool verifyAddress(uint32_t Address); bool verifyMipLODBias(float MipLODBias); diff --git a/llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp b/llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp index b5b5fc0c74d83..6c238e0f04468 100644 --- a/llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp +++ b/llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp @@ -108,6 +108,10 @@ bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type, return (Flags & ~Mask) == FlagT::None; } +bool verifyNumDescriptors(uint32_t NumDescriptors) { + return NumDescriptors > 0; +} + bool verifySamplerFilter(uint32_t Value) { switch (Value) { #define FILTER(Num, Val) case llvm::to_underlying(dxbc::SamplerFilter::Val): diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp index e46b184a353f1..edad63bfe7ea7 100644 --- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp +++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp @@ -447,6 +447,9 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) { if (!llvm::hlsl::rootsig::verifyRegisterSpace(Range.RegisterSpace)) return reportValueError(Ctx, "RegisterSpace", Range.RegisterSpace); + if (!llvm::hlsl::rootsig::verifyNumDescriptors(Range.NumDescriptors)) + return reportValueError(Ctx, "NumDescriptors", Range.NumDescriptors); + if (!llvm::hlsl::rootsig::verifyDescriptorRangeFlag( RSD.Version, Range.RangeType, Range.Flags)) return reportValueError(Ctx, "DescriptorFlag", Range.Flags); diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-NumDescriptors.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-NumDescriptors.ll new file mode 100644 index 0000000000000..99d126ee95443 --- /dev/null +++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-NumDescriptors.ll @@ -0,0 +1,19 @@ +; RUN: not opt -passes='print' %s -S -o - 2>&1 | FileCheck %s + +target triple = "dxil-unknown-shadermodel6.0-compute" + +; CHECK: error: Invalid value for NumDescriptors: 0 +; CHECK-NOT: Root Signature Definitions + +define void @main() #0 { +entry: + ret void +} +attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" } + + +!dx.rootsignatures = !{!2} ; list of function/root signature pairs +!2 = !{ ptr @main, !3, i32 2 } ; function, root signature +!3 = !{ !5 } ; list of root signature elements +!5 = !{ !"DescriptorTable", i32 0, !6} +!6 = !{ !"SRV", i32 0, i32 0, i32 10, i32 -1, i32 4 } From 84260fa73e6143db9dd77856cb2a0d05da243982 Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Fri, 4 Jul 2025 20:59:09 +0000 Subject: [PATCH 2/6] fix up testcases using invalid num descriptors --- ...ootSignature-DescriptorTable-AllValidFlagCombinationsV1.ll | 4 ++-- .../RootSignature-DescriptorTable-Invalid-Flag.ll | 2 +- .../RootSignature-DescriptorTable-Invalid-RangeType.ll | 2 +- .../RootSignature-DescriptorTable-Invalid-RegisterSpace.ll | 2 +- .../DirectX/ContainerData/RootSignature-DescriptorTable.ll | 4 ++-- .../CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-AllValidFlagCombinationsV1.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-AllValidFlagCombinationsV1.ll index 9d89dbdd9107b..053721de1eb1f 100644 --- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-AllValidFlagCombinationsV1.ll +++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-AllValidFlagCombinationsV1.ll @@ -13,7 +13,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" } !2 = !{ ptr @main, !3, i32 1 } ; function, root signature !3 = !{ !5 } ; list of root signature elements !5 = !{ !"DescriptorTable", i32 0, !6, !7 } -!6 = !{ !"Sampler", i32 0, i32 1, i32 0, i32 -1, i32 1 } +!6 = !{ !"Sampler", i32 1, i32 1, i32 0, i32 -1, i32 1 } !7 = !{ !"UAV", i32 5, i32 1, i32 10, i32 5, i32 3 } @@ -33,7 +33,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" } ; DXC-NEXT: RangesOffset: 44 ; DXC-NEXT: Ranges: ; DXC-NEXT: - RangeType: 3 -; DXC-NEXT: NumDescriptors: 0 +; DXC-NEXT: NumDescriptors: 1 ; DXC-NEXT: BaseShaderRegister: 1 ; DXC-NEXT: RegisterSpace: 0 ; DXC-NEXT: OffsetInDescriptorsFromTableStart: 4294967295 diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-Flag.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-Flag.ll index 41101c1f1fe8e..58056c5d4ba94 100644 --- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-Flag.ll +++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-Flag.ll @@ -16,5 +16,5 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" } !2 = !{ ptr @main, !3, i32 2 } ; function, root signature !3 = !{ !5 } ; list of root signature elements !5 = !{ !"DescriptorTable", i32 0, !6, !7 } -!6 = !{ !"SRV", i32 0, i32 1, i32 0, i32 -1, i32 22 } +!6 = !{ !"SRV", i32 1, i32 1, i32 0, i32 -1, i32 22 } !7 = !{ !"UAV", i32 5, i32 1, i32 10, i32 5, i32 2 } diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RangeType.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RangeType.ll index b7e99ae7cd27b..0f7116307c315 100644 --- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RangeType.ll +++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RangeType.ll @@ -16,5 +16,5 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" } !2 = !{ ptr @main, !3, i32 2 } ; function, root signature !3 = !{ !5 } ; list of root signature elements !5 = !{ !"DescriptorTable", i32 0, !6, !7 } -!6 = !{ !"Invalid", i32 0, i32 0, i32 -1, i32 -1, i32 4 } +!6 = !{ !"Invalid", i32 1, i32 0, i32 -1, i32 -1, i32 4 } !7 = !{ !"UAV", i32 5, i32 1, i32 10, i32 5, i32 2 } diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RegisterSpace.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RegisterSpace.ll index 4cef5d86a980b..94cd25b06a127 100644 --- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RegisterSpace.ll +++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RegisterSpace.ll @@ -16,5 +16,5 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" } !2 = !{ ptr @main, !3, i32 2 } ; function, root signature !3 = !{ !5 } ; list of root signature elements !5 = !{ !"DescriptorTable", i32 0, !6, !7 } -!6 = !{ !"SRV", i32 0, i32 0, i32 10, i32 -1, i32 4 } +!6 = !{ !"SRV", i32 1, i32 0, i32 10, i32 -1, i32 4 } !7 = !{ !"UAV", i32 5, i32 1, i32 4294967280, i32 5, i32 2 } diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable.ll index b516d66180247..8e9b4b43b11a6 100644 --- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable.ll +++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable.ll @@ -16,7 +16,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" } !2 = !{ ptr @main, !3, i32 2 } ; function, root signature !3 = !{ !5 } ; list of root signature elements !5 = !{ !"DescriptorTable", i32 0, !6, !7 } -!6 = !{ !"SRV", i32 0, i32 1, i32 0, i32 -1, i32 4 } +!6 = !{ !"SRV", i32 1, i32 1, i32 0, i32 -1, i32 4 } !7 = !{ !"UAV", i32 5, i32 1, i32 10, i32 5, i32 2 } ; DXC: - Name: RTS0 @@ -35,7 +35,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" } ; DXC-NEXT: RangesOffset: 44 ; DXC-NEXT: Ranges: ; DXC-NEXT: - RangeType: 0 -; DXC-NEXT: NumDescriptors: 0 +; DXC-NEXT: NumDescriptors: 1 ; DXC-NEXT: BaseShaderRegister: 1 ; DXC-NEXT: RegisterSpace: 0 ; DXC-NEXT: OffsetInDescriptorsFromTableStart: 4294967295 diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll index d0a58bc34ffa4..a8444c6079a85 100644 --- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll +++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll @@ -17,7 +17,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" } !5 = !{ !"RootConstants", i32 0, i32 1, i32 2, i32 3 } !6 = !{ !"RootSRV", i32 1, i32 4, i32 5, i32 6 } !7 = !{ !"DescriptorTable", i32 0, !8, !9 } -!8 = !{ !"SRV", i32 0, i32 1, i32 0, i32 -1, i32 4 } +!8 = !{ !"SRV", i32 1, i32 1, i32 0, i32 -1, i32 4 } !9 = !{ !"UAV", i32 5, i32 1, i32 10, i32 5, i32 2 } ;CHECK-LABEL: Definition for 'main': @@ -41,7 +41,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" } ;CHECK-NEXT: - Range Type: 0 ;CHECK-NEXT: Register Space: 0 ;CHECK-NEXT: Base Shader Register: 1 -;CHECK-NEXT: Num Descriptors: 0 +;CHECK-NEXT: Num Descriptors: 1 ;CHECK-NEXT: Offset In Descriptors From Table Start: 4294967295 ;CHECK-NEXT: Flags: 4 ;CHECK-NEXT: - Range Type: 1 From fe859bb067eb29c9b1712dfdfc9f11c531e2210b Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Fri, 4 Jul 2025 21:11:47 +0000 Subject: [PATCH 3/6] [HLSL][DirectX] update `verifyRootDescriptorFlag` to match the spec --- .../Frontend/HLSL/RootSignatureValidations.h | 2 +- .../HLSL/RootSignatureValidations.cpp | 19 ++++++++++++++++++- llvm/lib/Target/DirectX/DXILRootSignature.cpp | 3 ++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/llvm/include/llvm/Frontend/HLSL/RootSignatureValidations.h b/llvm/include/llvm/Frontend/HLSL/RootSignatureValidations.h index bcef20530559d..03f4e2cf5bb8f 100644 --- a/llvm/include/llvm/Frontend/HLSL/RootSignatureValidations.h +++ b/llvm/include/llvm/Frontend/HLSL/RootSignatureValidations.h @@ -27,7 +27,7 @@ bool verifyRootFlag(uint32_t Flags); bool verifyVersion(uint32_t Version); bool verifyRegisterValue(uint32_t RegisterValue); bool verifyRegisterSpace(uint32_t RegisterSpace); -bool verifyDescriptorFlag(uint32_t Flags); +bool verifyRootDescriptorFlag(uint32_t Version, uint32_t FlagsVal); bool verifyRangeType(uint32_t Type); bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type, uint32_t FlagsVal); diff --git a/llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp b/llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp index 6c238e0f04468..7b9019725ce38 100644 --- a/llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp +++ b/llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp @@ -32,7 +32,24 @@ bool verifyRegisterSpace(uint32_t RegisterSpace) { return !(RegisterSpace >= 0xFFFFFFF0 && RegisterSpace <= 0xFFFFFFFF); } -bool verifyDescriptorFlag(uint32_t Flags) { return (Flags & ~0xE) == 0; } +bool verifyRootDescriptorFlag(uint32_t Version, uint32_t FlagsVal) { + using FlagT = dxbc::RootDescriptorFlags; + FlagT Flags = FlagT(FlagsVal); + if (Version == 1) + return Flags == FlagT::DataVolatile; + + assert(Version == 2 && "Provided invalid root signature version"); + + // The data-specific flags are mutually exclusive. + FlagT DataFlags = FlagT::DataVolatile | FlagT::DataStatic | + FlagT::DataStaticWhileSetAtExecute; + + if (popcount(llvm::to_underlying(Flags & DataFlags)) > 1) + return false; + + // Only a data flag or no flags is valid + return (Flags | DataFlags) == DataFlags; +} bool verifyRangeType(uint32_t Type) { switch (Type) { diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp index edad63bfe7ea7..37a60075514ef 100644 --- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp +++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp @@ -432,7 +432,8 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) { return reportValueError(Ctx, "RegisterSpace", Descriptor.RegisterSpace); if (RSD.Version > 1) { - if (!llvm::hlsl::rootsig::verifyDescriptorFlag(Descriptor.Flags)) + if (!llvm::hlsl::rootsig::verifyRootDescriptorFlag(RSD.Version, + Descriptor.Flags)) return reportValueError(Ctx, "DescriptorRangeFlag", Descriptor.Flags); } break; From f9c377d8fd9b0c8332ffa80fab5b73bc1ec93ca8 Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Fri, 4 Jul 2025 21:44:57 +0000 Subject: [PATCH 4/6] fix small typo --- llvm/lib/Target/DirectX/DXILRootSignature.cpp | 2 +- .../ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp index 37a60075514ef..cfd4107b8a3de 100644 --- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp +++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp @@ -434,7 +434,7 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) { if (RSD.Version > 1) { if (!llvm::hlsl::rootsig::verifyRootDescriptorFlag(RSD.Version, Descriptor.Flags)) - return reportValueError(Ctx, "DescriptorRangeFlag", Descriptor.Flags); + return reportValueError(Ctx, "RootDescriptorFlag", Descriptor.Flags); } break; } diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll index 7ee04710be0ae..96f96011a7d16 100644 --- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll +++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll @@ -3,7 +3,7 @@ target triple = "dxil-unknown-shadermodel6.0-compute" -; CHECK: error: Invalid value for DescriptorRangeFlag: 3 +; CHECK: error: Invalid value for RootDescriptorFlag: 3 ; CHECK-NOT: Root Signature Definitions define void @main() #0 { entry: From 9542c3913692033d6509a558255d39339b3bd113 Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Fri, 4 Jul 2025 21:45:10 +0000 Subject: [PATCH 5/6] fix up testcases using invalid flags --- .../CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll | 4 ++-- .../DirectX/ContainerData/RootSignature-RootDescriptor_V1.ll | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll index a8444c6079a85..6477ad397c32d 100644 --- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll +++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll @@ -15,7 +15,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" } !3 = !{ !4, !5, !6, !7 } ; list of root signature elements !4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout !5 = !{ !"RootConstants", i32 0, i32 1, i32 2, i32 3 } -!6 = !{ !"RootSRV", i32 1, i32 4, i32 5, i32 6 } +!6 = !{ !"RootSRV", i32 1, i32 4, i32 5, i32 4 } !7 = !{ !"DescriptorTable", i32 0, !8, !9 } !8 = !{ !"SRV", i32 1, i32 1, i32 0, i32 -1, i32 4 } !9 = !{ !"UAV", i32 5, i32 1, i32 10, i32 5, i32 2 } @@ -34,7 +34,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" } ;CHECK-NEXT: Shader Visibility: 1 ;CHECK-NEXT: Register Space: 5 ;CHECK-NEXT: Shader Register: 4 -;CHECK-NEXT: Flags: 6 +;CHECK-NEXT: Flags: 4 ;CHECK-NEXT: - Parameter Type: 0 ;CHECK-NEXT: Shader Visibility: 0 ;CHECK-NEXT: NumRanges: 2 diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor_V1.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor_V1.ll index e05c42a22ea48..ddf556e7fe20a 100644 --- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor_V1.ll +++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor_V1.ll @@ -15,7 +15,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" } !dx.rootsignatures = !{!2} ; list of function/root signature pairs !2 = !{ ptr @main, !3, i32 1 } ; function, root signature !3 = !{ !5 } ; list of root signature elements -!5 = !{ !"RootCBV", i32 0, i32 1, i32 2, i32 8 } +!5 = !{ !"RootCBV", i32 0, i32 1, i32 2, i32 2 } ; DXC: - Name: RTS0 ; DXC-NEXT: Size: 44 @@ -31,4 +31,4 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" } ; DXC-NEXT: Descriptor: ; DXC-NEXT: RegisterSpace: 2 ; DXC-NEXT: ShaderRegister: 1 -; DXC-NOT: DATA_STATIC: true +; DXC-NOT: DATA_VOLATILE: true From 22a8bf6713446a773f2b865381ae2d55a2b50eaa Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Fri, 4 Jul 2025 21:46:44 +0000 Subject: [PATCH 6/6] add testcase for new validation --- ...e-RootDescriptor-Invalid-Multiple-Flags.ll | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Multiple-Flags.ll diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Multiple-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Multiple-Flags.ll new file mode 100644 index 0000000000000..dd06a2783bd10 --- /dev/null +++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Multiple-Flags.ll @@ -0,0 +1,19 @@ +; RUN: not opt -passes='print' %s -S -o - 2>&1 | FileCheck %s + +target triple = "dxil-unknown-shadermodel6.0-compute" + +; Check that 10 = DataVolatile | Datastatic is invalid due to mutually exclusive + +; CHECK: error: Invalid value for RootDescriptorFlag: 10 +; CHECK-NOT: Root Signature Definitions +define void @main() #0 { +entry: + ret void +} +attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" } + + +!dx.rootsignatures = !{!2} ; list of function/root signature pairs +!2 = !{ ptr @main, !3, i32 2 } ; function, root signature +!3 = !{ !5 } ; list of root signature elements +!5 = !{ !"RootCBV", i32 0, i32 1, i32 2, i32 10 }