[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
Thu Aug 14 15:37:12 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 1/5] 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 2/5] 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 3/5] 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 4/5] 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 5/5] 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
More information about the llvm-branch-commits
mailing list