[llvm] [AMDGPU] Fix ImageIntrinsicOptimizer DMask check starting at wrong arg index (PR #213264)

Arseniy Obolenskiy via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 31 05:58:00 PDT 2026


https://github.com/aobolensk updated https://github.com/llvm/llvm-project/pull/213264

>From 475607def2cf4430b7229b79210aaee9dc9cf187 Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <arseniy.obolenskiy at amd.com>
Date: Fri, 31 Jul 2026 14:38:18 +0200
Subject: [PATCH] [AMDGPU] Fix ImageIntrinsicOptimizer DMask check starting at
 wrong arg index

---
 .../AMDGPU/AMDGPUImageIntrinsicOptimizer.cpp  |  2 +-
 .../AMDGPU/llvm.amdgcn.image.load.2dmsaa.ll   | 27 +++++++++++++++++++
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/Target/AMDGPU/AMDGPUImageIntrinsicOptimizer.cpp b/llvm/lib/Target/AMDGPU/AMDGPUImageIntrinsicOptimizer.cpp
index 04ede2b7dfdd5..ecfdfdf344257 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUImageIntrinsicOptimizer.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUImageIntrinsicOptimizer.cpp
@@ -111,7 +111,7 @@ void addInstToMergeableList(
     // Check all arguments (DMask, VAddr, RSrc etc).
     bool AllEqual = true;
     assert(IIList.front()->arg_size() == II->arg_size());
-    for (int I = 1, E = II->arg_size(); AllEqual && I != E; ++I) {
+    for (int I = 0, E = II->arg_size(); AllEqual && I != E; ++I) {
       Value *ArgList = IIList.front()->getArgOperand(I);
       Value *Arg = II->getArgOperand(I);
       if (I == ImageDimIntr->VAddrEnd - 1) {
diff --git a/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.image.load.2dmsaa.ll b/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.image.load.2dmsaa.ll
index c6b50a1881511..b4835142db453 100644
--- a/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.image.load.2dmsaa.ll
+++ b/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.image.load.2dmsaa.ll
@@ -1225,6 +1225,33 @@ main_body:
   ret [4 x float] %i7
 }
 
+define amdgpu_ps <2 x float> @load_2dmsaa_v2f32_dmask_mismatch(<8 x i32> inreg %rsrc, i32 %s, i32 %t) {
+; NO-MSAA-LABEL: define amdgpu_ps <2 x float> @load_2dmsaa_v2f32_dmask_mismatch(
+; NO-MSAA-SAME: <8 x i32> inreg [[RSRC:%.*]], i32 [[S:%.*]], i32 [[T:%.*]]) {
+; NO-MSAA-NEXT:  main_body:
+; NO-MSAA-NEXT:    [[A:%.*]] = call float @llvm.amdgcn.image.load.2dmsaa.f32.i32.v8i32(i32 1, i32 [[S]], i32 [[T]], i32 0, <8 x i32> [[RSRC]], i32 0, i32 0)
+; NO-MSAA-NEXT:    [[B:%.*]] = call float @llvm.amdgcn.image.load.2dmsaa.f32.i32.v8i32(i32 8, i32 [[S]], i32 [[T]], i32 1, <8 x i32> [[RSRC]], i32 0, i32 0)
+; NO-MSAA-NEXT:    [[V0:%.*]] = insertelement <2 x float> poison, float [[A]], i32 0
+; NO-MSAA-NEXT:    [[V1:%.*]] = insertelement <2 x float> [[V0]], float [[B]], i32 1
+; NO-MSAA-NEXT:    ret <2 x float> [[V1]]
+;
+; MSAA-LABEL: define amdgpu_ps <2 x float> @load_2dmsaa_v2f32_dmask_mismatch(
+; MSAA-SAME: <8 x i32> inreg [[RSRC:%.*]], i32 [[S:%.*]], i32 [[T:%.*]]) {
+; MSAA-NEXT:  main_body:
+; MSAA-NEXT:    [[A:%.*]] = call float @llvm.amdgcn.image.load.2dmsaa.f32.i32.v8i32(i32 1, i32 [[S]], i32 [[T]], i32 0, <8 x i32> [[RSRC]], i32 0, i32 0)
+; MSAA-NEXT:    [[B:%.*]] = call float @llvm.amdgcn.image.load.2dmsaa.f32.i32.v8i32(i32 8, i32 [[S]], i32 [[T]], i32 1, <8 x i32> [[RSRC]], i32 0, i32 0)
+; MSAA-NEXT:    [[V0:%.*]] = insertelement <2 x float> poison, float [[A]], i32 0
+; MSAA-NEXT:    [[V1:%.*]] = insertelement <2 x float> [[V0]], float [[B]], i32 1
+; MSAA-NEXT:    ret <2 x float> [[V1]]
+;
+main_body:
+  %a = call float @llvm.amdgcn.image.load.2dmsaa.f32.i32.v8i32(i32 1, i32 %s, i32 %t, i32 0, <8 x i32> %rsrc, i32 0, i32 0)
+  %b = call float @llvm.amdgcn.image.load.2dmsaa.f32.i32.v8i32(i32 8, i32 %s, i32 %t, i32 1, <8 x i32> %rsrc, i32 0, i32 0)
+  %v0 = insertelement <2 x float> poison, float %a, i32 0
+  %v1 = insertelement <2 x float> %v0, float %b, i32 1
+  ret <2 x float> %v1
+}
+
 declare float @llvm.amdgcn.image.load.2dmsaa.f32.i32.v8i32(i32, i32, i32, i32, <8 x i32>, i32, i32) #0
 declare <2 x float> @llvm.amdgcn.image.load.2dmsaa.v2f32.i32.v8i32(i32, i32, i32, i32, <8 x i32>, i32, i32) #0
 declare <3 x float> @llvm.amdgcn.image.load.2dmsaa.v3f32.i32.v8i32(i32, i32, i32, i32, <8 x i32>, i32, i32) #0



More information about the llvm-commits mailing list