[llvm] [DirectX] Set TypedUAVLoadAdditionalFormats on UAV texture loads (PR #225484)

via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 22 11:51:54 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-directx

Author: Deric C. (Icohedron)

<details>
<summary>Changes</summary>

Fixes https://github.com/llvm/llvm-project/issues/225147

This PR makes the `TypedUAVLoadAdditionalFormats` shader flag get set on UAV texture loads.

Assisted by: GPT 5.6 Sol

---
Full diff: https://github.com/llvm/llvm-project/pull/225484.diff


3 Files Affected:

- (modified) llvm/lib/Target/DirectX/DXILShaderFlags.cpp (+3-1) 
- (modified) llvm/test/CodeGen/DirectX/ShaderFlags/typed-srv-load.ll (+10) 
- (modified) llvm/test/CodeGen/DirectX/ShaderFlags/typed-uav-load-additional-formats.ll (+30) 


``````````diff
diff --git a/llvm/lib/Target/DirectX/DXILShaderFlags.cpp b/llvm/lib/Target/DirectX/DXILShaderFlags.cpp
index e404eb81097694..bc69af6f73cdd7 100644
--- a/llvm/lib/Target/DirectX/DXILShaderFlags.cpp
+++ b/llvm/lib/Target/DirectX/DXILShaderFlags.cpp
@@ -289,12 +289,14 @@ void ModuleShaderFlags::updateFunctionFlags(ComputedShaderFlags &CSF,
       }
       break;
     }
+    case Intrinsic::dx_resource_load_level:
     case Intrinsic::dx_resource_load_typedbuffer: {
       dxil::ResourceTypeInfo &RTI =
           DRTM[cast<TargetExtType>(II->getArgOperand(0)->getType())];
       if (RTI.isTyped() && RTI.isUAV())
         CSF.TypedUAVLoadAdditionalFormats |= RTI.getTyped().ElementCount > 1;
-      if (!CSF.TiledResources && checkIfStatusIsExtracted(*II))
+      if (II->getIntrinsicID() == Intrinsic::dx_resource_load_typedbuffer &&
+          !CSF.TiledResources && checkIfStatusIsExtracted(*II))
         CSF.TiledResources = true;
       break;
     }
diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/typed-srv-load.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/typed-srv-load.ll
index 51e73290dd7503..6a929ae45f38f0 100644
--- a/llvm/test/CodeGen/DirectX/ShaderFlags/typed-srv-load.ll
+++ b/llvm/test/CodeGen/DirectX/ShaderFlags/typed-srv-load.ll
@@ -35,6 +35,16 @@ define float @onecomponent() #0 {
   ret float %val
 }
 
+; CHECK: Function texture_multicomponent : 0x00000000
+define <4 x float> @texture_multicomponent(<2 x i32> %coords) #0 {
+  %res = call target("dx.Texture", <4 x float>, 0, 0, 0, 2)
+      @llvm.dx.resource.handlefrombinding(i32 0, i32 2, i32 1, i32 0, ptr null)
+  %load = call <4 x float> @llvm.dx.resource.load.level(
+      target("dx.Texture", <4 x float>, 0, 0, 0, 2) %res,
+      <2 x i32> %coords, i32 0, <2 x i32> zeroinitializer)
+  ret <4 x float> %load
+}
+
 !llvm.module.flags = !{!0}
 !dx.valver = !{!1}
 !0 = !{i32 1, !"dx.resmayalias", i32 1}
diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/typed-uav-load-additional-formats.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/typed-uav-load-additional-formats.ll
index 87172338db6566..553870be06be51 100644
--- a/llvm/test/CodeGen/DirectX/ShaderFlags/typed-uav-load-additional-formats.ll
+++ b/llvm/test/CodeGen/DirectX/ShaderFlags/typed-uav-load-additional-formats.ll
@@ -33,6 +33,36 @@ define float @onecomponent() #0 {
   ret float %val
 }
 
+; CHECK: Function texture2d_multicomponent : 0x00002000
+define <4 x float> @texture2d_multicomponent(<2 x i32> %coords) #0 {
+  %res = call target("dx.Texture", <4 x float>, 1, 0, 0, 2)
+      @llvm.dx.resource.handlefrombinding(i32 0, i32 2, i32 1, i32 0, ptr null)
+  %load = call <4 x float> @llvm.dx.resource.load.level(
+      target("dx.Texture", <4 x float>, 1, 0, 0, 2) %res,
+      <2 x i32> %coords, i32 poison, <2 x i32> zeroinitializer)
+  ret <4 x float> %load
+}
+
+; CHECK: Function texture2darray_multicomponent : 0x00002000
+define <4 x float> @texture2darray_multicomponent(<3 x i32> %coords) #0 {
+  %res = call target("dx.Texture", <4 x float>, 1, 0, 0, 7)
+      @llvm.dx.resource.handlefrombinding(i32 0, i32 3, i32 1, i32 0, ptr null)
+  %load = call <4 x float> @llvm.dx.resource.load.level(
+      target("dx.Texture", <4 x float>, 1, 0, 0, 7) %res,
+      <3 x i32> %coords, i32 poison, <2 x i32> zeroinitializer)
+  ret <4 x float> %load
+}
+
+; CHECK: Function texture_onecomponent : 0x00000000
+define float @texture_onecomponent(<2 x i32> %coords) #0 {
+  %res = call target("dx.Texture", float, 1, 0, 0, 2)
+      @llvm.dx.resource.handlefrombinding(i32 0, i32 4, i32 1, i32 0, ptr null)
+  %load = call float @llvm.dx.resource.load.level(
+      target("dx.Texture", float, 1, 0, 0, 2) %res,
+      <2 x i32> %coords, i32 poison, <2 x i32> zeroinitializer)
+  ret float %load
+}
+
 ; CHECK: Function noload : 0x00000000
 define void @noload(<4 x float> %val) #0 {
   %res = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0)

``````````

</details>


https://github.com/llvm/llvm-project/pull/225484


More information about the llvm-commits mailing list