[llvm-branch-commits] [llvm] [DirectX] Add shader flags for heap resources (PR #216461)

Helena Kotas via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Aug 18 12:54:22 PDT 2026


https://github.com/hekota updated https://github.com/llvm/llvm-project/pull/216461

>From 46ded031905032fbde74a68ec9b6a2b7443a00a7 Mon Sep 17 00:00:00 2001
From: Helena Kotas <hekotas at microsoft.com>
Date: Sat, 15 Aug 2026 00:03:46 -0700
Subject: [PATCH 1/2] [DirectX] Add shader flags for heap resources

Fixes #213825
---
 llvm/lib/Target/DirectX/DXILShaderFlags.cpp   | 12 +++++-
 .../DirectX/ShaderFlags/heap-resources.ll     | 42 +++++++++++++++++++
 2 files changed, 53 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/CodeGen/DirectX/ShaderFlags/heap-resources.ll

diff --git a/llvm/lib/Target/DirectX/DXILShaderFlags.cpp b/llvm/lib/Target/DirectX/DXILShaderFlags.cpp
index 64d8dc33e3e60..b7c296b2bde6d 100644
--- a/llvm/lib/Target/DirectX/DXILShaderFlags.cpp
+++ b/llvm/lib/Target/DirectX/DXILShaderFlags.cpp
@@ -274,6 +274,16 @@ void ModuleShaderFlags::updateFunctionFlags(ComputedShaderFlags &CSF,
       }
       break;
     }
+    case Intrinsic::dx_resource_handlefromheap: {
+      if (auto *ConstInt = dyn_cast<ConstantInt>(II->getArgOperand(1))) {
+        bool IsSamplerHeap = ConstInt->getValue().getBoolValue();
+        if (IsSamplerHeap)
+          CSF.SamplerDescriptorHeapIndexing = true;
+        else
+          CSF.ResourceDescriptorHeapIndexing = true;
+      }
+      break;
+    }
     case Intrinsic::dx_resource_load_typedbuffer: {
       dxil::ResourceTypeInfo &RTI =
           DRTM[cast<TargetExtType>(II->getArgOperand(0)->getType())];
@@ -342,7 +352,7 @@ ModuleShaderFlags::gatherGlobalModuleFlags(const Module &M,
     if (MMDI.ValidatorVersion < VersionTuple(1, 6)) {
       NumUAVs++;
     } else { // MMDI.ValidatorVersion >= VersionTuple(1, 6)
-      uint32_t Size = UAV.getBinding().Size;
+      uint32_t Size = UAV.getSize();
       uint32_t NewNum = NumUAVs + (Size == 0 ? ~0U : Size);
       if (NewNum < NumUAVs)
         NewNum = ~0U;
diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/heap-resources.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/heap-resources.ll
new file mode 100644
index 0000000000000..d7e15a65aea3a
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ShaderFlags/heap-resources.ll
@@ -0,0 +1,42 @@
+; RUN: opt -S --passes="print-dx-shader-flags" 2>&1 %s | FileCheck %s
+; RUN: llc %s -disable-dxil-remove-unused-resources --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
+
+; This test makes sure that the shader flags 'Resource descriptor heap indexing'
+; is set when the shader uses CreateHandleFromHeap instruction on a resource
+; descriptor heap.
+
+target triple = "dxil-pc-shadermodel6.6-library"
+
+; CHECK:      Combined Shader Flags for Module
+; CHECK-NEXT: Shader Flags Value: 0xc0000000
+
+; CHECK: Note: shader requires additional functionality:
+; CHECK:        Resource descriptor heap indexing
+; CHECK:        Sampler descriptor heap indexing
+;
+; CHECK: Function test_1 : 0x40000000
+define void @test_1() "hlsl.export" {
+  ; RWBuffer<float4> Buf = ResourceDescriptorHeap[3]
+  %typed = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0)
+              @llvm.dx.resource.handlefromheap.tdx.TypedBuffer_v4f32_1_0_0(i32 3, i1 false)
+  ret void
+}
+
+; CHECK: Function test_2 : 0x80000000
+define void @test_2() "hlsl.export" {
+  ; SamplerState Samp = ResourceDescriptorHeap[100];
+  %samp = call target("dx.Sampler", 0)
+              @llvm.dx.resource.handlefromheap.tdx.Sampler_0(i32 100, i1 true)
+  ret void
+}
+
+!dx.valver = !{!0}
+!0 = !{i32 1, i32 8}
+
+; DXC: - Name:            SFI0
+; DXC-NEXT:     Size:            8
+; DXC-NEXT:     Flags:
+; DXC:             ResourceDescriptorHeapIndexing: true
+; DXC:             SamplerDescriptorHeapIndexing: true
+; DXC:       NextUnusedBit:   false
+

>From 2e1e167e8706a36c95267cd5c78592db9c8dd1ab Mon Sep 17 00:00:00 2001
From: Helena Kotas <hekotas at microsoft.com>
Date: Tue, 18 Aug 2026 12:54:00 -0700
Subject: [PATCH 2/2] code review feedback - update test comments

---
 .../test/CodeGen/DirectX/ShaderFlags/heap-resources.ll | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/heap-resources.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/heap-resources.ll
index d7e15a65aea3a..cc84d2f8574ad 100644
--- a/llvm/test/CodeGen/DirectX/ShaderFlags/heap-resources.ll
+++ b/llvm/test/CodeGen/DirectX/ShaderFlags/heap-resources.ll
@@ -1,9 +1,11 @@
 ; RUN: opt -S --passes="print-dx-shader-flags" 2>&1 %s | FileCheck %s
 ; RUN: llc %s -disable-dxil-remove-unused-resources --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
 
-; This test makes sure that the shader flags 'Resource descriptor heap indexing'
-; is set when the shader uses CreateHandleFromHeap instruction on a resource
-; descriptor heap.
+; This test makes sure that the shader flag 'Resource descriptor heap indexing'
+; is set when the shader uses CreateHandleFromHeap instruction to get a resource
+; from a resource descriptor heap, and that the shader flag `Sampler descriptor
+; heap indexing` is set when the shader uses the same instruction to get a sampler
+; from a sampler descriptor heap.
 
 target triple = "dxil-pc-shadermodel6.6-library"
 
@@ -24,7 +26,7 @@ define void @test_1() "hlsl.export" {
 
 ; CHECK: Function test_2 : 0x80000000
 define void @test_2() "hlsl.export" {
-  ; SamplerState Samp = ResourceDescriptorHeap[100];
+  ; SamplerState Samp = SamplerDescriptorHeap[100];
   %samp = call target("dx.Sampler", 0)
               @llvm.dx.resource.handlefromheap.tdx.Sampler_0(i32 100, i1 true)
   ret void



More information about the llvm-branch-commits mailing list