[llvm] [CodeGenPrepare] Consider target memory intrinics as memory use (PR #159638)

Jeffrey Byrnes via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 19 07:53:46 PDT 2025


https://github.com/jrbyrnes updated https://github.com/llvm/llvm-project/pull/159638

>From 4c52b4265dcd498cc1496c21082a370915de432c Mon Sep 17 00:00:00 2001
From: Jeffrey Byrnes <Jeffrey.Byrnes at amd.com>
Date: Thu, 18 Sep 2025 11:59:12 -0700
Subject: [PATCH 1/2] [CodeGenPrepare] Consider target memory intrinics as
 memory use

Change-Id: Ieebc6e6246e04164bce6b6b425d39e8624aac578
---
 llvm/lib/CodeGen/CodeGenPrepare.cpp | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp
index a190f0dac1379..ae499e773e7b2 100644
--- a/llvm/lib/CodeGen/CodeGenPrepare.cpp
+++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp
@@ -5596,6 +5596,20 @@ static bool FindAllMemoryUses(
       continue;
     }
 
+    if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(UserI)) {
+      SmallVector<Value *, 2> PtrOps;
+      Type *AccessTy;
+      if (!TLI.getAddrModeArguments(II, PtrOps, AccessTy))
+        return true;
+
+      auto PtrVal = U.get();
+      if (!find(PtrOps, PtrVal))
+        return true;
+
+      MemoryUses.push_back({&U, AccessTy});
+      continue;
+    }
+
     if (CallInst *CI = dyn_cast<CallInst>(UserI)) {
       if (CI->hasFnAttr(Attribute::Cold)) {
         // If this is a cold call, we can sink the addressing calculation into

>From 035f5c72f2245c89e9fa02fef970c0347b186803 Mon Sep 17 00:00:00 2001
From: Jeffrey Byrnes <Jeffrey.Byrnes at amd.com>
Date: Fri, 19 Sep 2025 07:53:18 -0700
Subject: [PATCH 2/2] Review comments

Change-Id: I93a777d78d19df5b1a799a3a7e4bc7c465be2558
---
 llvm/lib/CodeGen/CodeGenPrepare.cpp           |  3 +--
 .../AMDGPU/sink-addr-memory-intrinsics.ll     | 20 +++++++++----------
 2 files changed, 10 insertions(+), 13 deletions(-)

diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp
index ae499e773e7b2..d290f202f3cca 100644
--- a/llvm/lib/CodeGen/CodeGenPrepare.cpp
+++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp
@@ -5602,8 +5602,7 @@ static bool FindAllMemoryUses(
       if (!TLI.getAddrModeArguments(II, PtrOps, AccessTy))
         return true;
 
-      auto PtrVal = U.get();
-      if (!find(PtrOps, PtrVal))
+      if (!find(PtrOps, U.get()))
         return true;
 
       MemoryUses.push_back({&U, AccessTy});
diff --git a/llvm/test/CodeGen/AMDGPU/sink-addr-memory-intrinsics.ll b/llvm/test/CodeGen/AMDGPU/sink-addr-memory-intrinsics.ll
index df30e3755490f..970c98afd2a05 100644
--- a/llvm/test/CodeGen/AMDGPU/sink-addr-memory-intrinsics.ll
+++ b/llvm/test/CodeGen/AMDGPU/sink-addr-memory-intrinsics.ll
@@ -6,25 +6,23 @@ define amdgpu_kernel void @memoryIntrinstic(ptr addrspace(3) %inptr, i1 %cond, p
 ; CHECK:       ; %bb.0:
 ; CHECK-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
 ; CHECK-NEXT:    s_waitcnt lgkmcnt(0)
-; CHECK-NEXT:    s_and_b32 s1, s1, 1
-; CHECK-NEXT:    s_add_i32 s3, s0, 0x2000
-; CHECK-NEXT:    s_cmp_eq_u32 s1, 0
+; CHECK-NEXT:    s_bitcmp0_b32 s1, 0
 ; CHECK-NEXT:    s_cbranch_scc0 .LBB0_2
 ; CHECK-NEXT:  ; %bb.1: ; %else
-; CHECK-NEXT:    v_mov_b32_e32 v0, s3
-; CHECK-NEXT:    ds_read_b64_tr_b16 v[2:3], v0
-; CHECK-NEXT:    s_mov_b32 s0, 0x7060302
-; CHECK-NEXT:    s_mov_b32 s1, 0x5040100
+; CHECK-NEXT:    v_mov_b32_e32 v0, s0
+; CHECK-NEXT:    ds_read_b64_tr_b16 v[2:3], v0 offset:8192
+; CHECK-NEXT:    s_mov_b32 s1, 0x7060302
+; CHECK-NEXT:    s_mov_b32 s3, 0x5040100
 ; CHECK-NEXT:    s_waitcnt lgkmcnt(0)
-; CHECK-NEXT:    v_perm_b32 v0, v3, v2, s0
-; CHECK-NEXT:    v_perm_b32 v1, v3, v2, s1
+; CHECK-NEXT:    v_perm_b32 v0, v3, v2, s1
+; CHECK-NEXT:    v_perm_b32 v1, v3, v2, s3
 ; CHECK-NEXT:    s_cbranch_execz .LBB0_3
 ; CHECK-NEXT:    s_branch .LBB0_4
 ; CHECK-NEXT:  .LBB0_2:
 ; CHECK-NEXT:    ; implicit-def: $vgpr1
 ; CHECK-NEXT:  .LBB0_3: ; %then
-; CHECK-NEXT:    v_mov_b32_e32 v0, s3
-; CHECK-NEXT:    ds_read_b64_tr_b16 v[2:3], v0
+; CHECK-NEXT:    v_mov_b32_e32 v0, s0
+; CHECK-NEXT:    ds_read_b64_tr_b16 v[2:3], v0 offset:8192
 ; CHECK-NEXT:    s_mov_b32 s0, 0x5040100
 ; CHECK-NEXT:    s_mov_b32 s1, 0x7060302
 ; CHECK-NEXT:    s_waitcnt lgkmcnt(0)



More information about the llvm-commits mailing list