[llvm] d43ef1b - [DirectX] Fix RawBuffer Loads of double vectors (#224695)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 21 17:48:01 PDT 2026
Author: Farzon Lotfi
Date: 2026-09-22T00:47:54Z
New Revision: d43ef1b381ca458bb34c1e79b050db5d3d834abd
URL: https://github.com/llvm/llvm-project/commit/d43ef1b381ca458bb34c1e79b050db5d3d834abd
DIFF: https://github.com/llvm/llvm-project/commit/d43ef1b381ca458bb34c1e79b050db5d3d834abd.diff
LOG: [DirectX] Fix RawBuffer Loads of double vectors (#224695)
fixes https://github.com/llvm/llvm-project/issues/224684
We need to do the same change we did for Raw Buffer Stores
(https://github.com/llvm/llvm-project/issues/223558) in
https://github.com/llvm/llvm-project/pull/224136 by Create add with the
byte index offsets because were were looking at the wrong argument.
Added:
llvm/test/CodeGen/DirectX/ResourceAccess/load-rawbuffer-wide-double.ll
Modified:
llvm/lib/Target/DirectX/DXILIntrinsicExpansion.cpp
llvm/test/CodeGen/DirectX/RawBufferLoadDouble.ll
llvm/test/CodeGen/DirectX/TextureLoad.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/DirectX/DXILIntrinsicExpansion.cpp b/llvm/lib/Target/DirectX/DXILIntrinsicExpansion.cpp
index 2a1416deccc3a..dce8a1ec9f92a 100644
--- a/llvm/lib/Target/DirectX/DXILIntrinsicExpansion.cpp
+++ b/llvm/lib/Target/DirectX/DXILIntrinsicExpansion.cpp
@@ -813,7 +813,11 @@ static bool expandBufferLoadIntrinsic(CallInst *Orig, bool IsRaw) {
if (IsRaw) {
LoadIntrinsic = Intrinsic::dx_resource_load_rawbuffer;
Value *Tmp = Builder.getInt32(4 * Base * 2);
- Args.push_back(Builder.CreateAdd(Orig->getOperand(2), Tmp));
+ Value *Offset = Orig->getOperand(2);
+ Args.push_back(Offset);
+ unsigned AddressArg = isa<PoisonValue>(Offset) ? 1 : 2;
+ if (Base != 0)
+ Args[AddressArg] = Builder.CreateAdd(Args[AddressArg], Tmp);
}
Value *Load = Builder.CreateIntrinsic(LoadType, LoadIntrinsic, Args);
diff --git a/llvm/test/CodeGen/DirectX/RawBufferLoadDouble.ll b/llvm/test/CodeGen/DirectX/RawBufferLoadDouble.ll
index 6c7d8c2598330..32da2b79a0aa9 100644
--- a/llvm/test/CodeGen/DirectX/RawBufferLoadDouble.ll
+++ b/llvm/test/CodeGen/DirectX/RawBufferLoadDouble.ll
@@ -71,6 +71,29 @@ define void @loadv2f64(i32 %index) {
ret void
}
+define void @loadv4f64_byte(i32 %index) {
+ ; CHECK: [[B:%.*]] = call target("dx.RawBuffer", i8, 0, 0)
+ ; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0t(
+ ; CHECK-SAME: i32 0, i32 0, i32 1, i32 0, ptr null)
+ %buffer = call target("dx.RawBuffer", i8, 0, 0)
+ @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0t(
+ i32 0, i32 0, i32 1, i32 0, ptr null)
+
+ ; CHECK63: call { <4 x double>, i1 } @llvm.dx.resource.load.rawbuffer
+ ; CHECK63-SAME: target("dx.RawBuffer", i8, 0, 0) [[B]], i32 %index, i32 poison)
+
+ ; CHECK62: [[LOW:%.*]] = call { <4 x i32>, i1 } @llvm.dx.resource.load.rawbuffer
+ ; CHECK62-SAME: target("dx.RawBuffer", i8, 0, 0) [[B]], i32 %index, i32 poison)
+ ; CHECK62: [[NEXTINDEX:%.*]] = add i32 %index, 16
+ ; CHECK62: [[HIGH:%.*]] = call { <4 x i32>, i1 } @llvm.dx.resource.load.rawbuffer
+ ; CHECK62-SAME: target("dx.RawBuffer", i8, 0, 0) [[B]], i32 [[NEXTINDEX]], i32 poison)
+ %load0 = call { <4 x double>, i1 } @llvm.dx.resource.load.rawbuffer(
+ target("dx.RawBuffer", i8, 0, 0) %buffer, i32 %index, i32 poison)
+
+ %data0 = extractvalue { <4 x double>, i1 } %load0, 0
+ ret void
+}
+
; show we properly handle extracting the check bit
define void @loadf64WithCheckBit(i32 %index) {
; check the handle from binding is unchanged
diff --git a/llvm/test/CodeGen/DirectX/ResourceAccess/load-rawbuffer-wide-double.ll b/llvm/test/CodeGen/DirectX/ResourceAccess/load-rawbuffer-wide-double.ll
new file mode 100644
index 0000000000000..f4b83aa335b49
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ResourceAccess/load-rawbuffer-wide-double.ll
@@ -0,0 +1,22 @@
+; RUN: opt -S -dxil-resource-access -dxil-intrinsic-expansion \
+; RUN: -mtriple=dxil-pc-shadermodel6.2-compute %s | FileCheck %s
+
+define <8 x double> @loadv8f64_byte(i32 %index) {
+ %buffer = call target("dx.RawBuffer", i8, 0, 0)
+ @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, ptr null)
+
+ ; CHECK-NOT: @llvm.dx.resource.getpointer
+ %ptr = call ptr @llvm.dx.resource.getpointer(
+ target("dx.RawBuffer", i8, 0, 0) %buffer, i32 %index)
+
+ ; CHECK: call { <4 x i32>, i1 } [[LOAD_INTRINSIC:@llvm\.dx\.resource\.load\.rawbuffer[^(]*]]([[BUFFER_TY:target\("dx\.RawBuffer", i8, 0, 0\)]] %buffer, i32 %index, i32 poison)
+ ; CHECK: %[[INDEX16:.*]] = add i32 %index, 16
+ ; CHECK: call { <4 x i32>, i1 } [[LOAD_INTRINSIC]]([[BUFFER_TY]] %buffer, i32 %[[INDEX16]], i32 poison)
+ ; CHECK: %[[INDEX32:.*]] = add i32 %index, 32
+ ; CHECK: call { <4 x i32>, i1 } [[LOAD_INTRINSIC]]([[BUFFER_TY]] %buffer, i32 %[[INDEX32]], i32 poison)
+ ; CHECK: %[[INDEX48:.*]] = add i32 %[[INDEX32]], 16
+ ; CHECK: call { <4 x i32>, i1 } [[LOAD_INTRINSIC]]([[BUFFER_TY]] %buffer, i32 %[[INDEX48]], i32 poison)
+ %data = load <8 x double>, ptr %ptr
+
+ ret <8 x double> %data
+}
diff --git a/llvm/test/CodeGen/DirectX/TextureLoad.ll b/llvm/test/CodeGen/DirectX/TextureLoad.ll
index 29329f4bf9896..1ce81929b1f9e 100644
--- a/llvm/test/CodeGen/DirectX/TextureLoad.ll
+++ b/llvm/test/CodeGen/DirectX/TextureLoad.ll
@@ -266,7 +266,7 @@ define void @load_rwtexture2d_float4_explicit_lod(<2 x i32> %coords) {
define void @load_rwtexture2darray_float4(<3 x i32> %coords) {
%texture = call target("dx.Texture", <4 x float>, 1, 0, 0, 7)
@llvm.dx.resource.handlefrombinding.tdx.Texture_v4f32_1_0_0_7t(
- i32 0, i32 0, i32 1, i32 0, ptr null)
+ i32 0, i32 1, i32 1, i32 0, ptr null)
; CHECK: %[[COORD0:.*]] = extractelement <3 x i32> %coords, i32 0
; CHECK: %[[COORD1:.*]] = extractelement <3 x i32> %coords, i32 1
@@ -287,7 +287,7 @@ define void @load_rwtexture2darray_float4(<3 x i32> %coords) {
define void @load_rwtexture2darray_scalarized_coords(i32 %x, i32 %y, i32 %z) {
%texture = call target("dx.Texture", float, 1, 0, 0, 7)
@llvm.dx.resource.handlefrombinding.tdx.Texture_f32_1_0_0_7t(
- i32 0, i32 0, i32 1, i32 0, ptr null)
+ i32 0, i32 2, i32 1, i32 0, ptr null)
%coords.0 = insertelement <3 x i32> poison, i32 %x, i32 0
%coords.1 = insertelement <3 x i32> %coords.0, i32 %y, i32 1
More information about the llvm-commits
mailing list