[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