https://github.com/arsenm updated 
https://github.com/llvm/llvm-project/pull/168787

>From cd383966fb4d7d56ac5a61f37c4970d6c232c7cc Mon Sep 17 00:00:00 2001
From: Matt Arsenault <[email protected]>
Date: Wed, 19 Nov 2025 17:34:24 -0500
Subject: [PATCH] AMDGPU: Handle invariant loads when considering if a load can
 be scalar

Doesn't touch the globalisel version because the handling
there looks a bit broken.
---
 llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp     |  3 ++-
 .../AMDGPU/invariant-load-no-alias-store.ll       | 15 ++++++++++++++-
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp 
b/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp
index 6a0a9e3d3e5ac..6c36f8ad9b6a9 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp
@@ -4437,7 +4437,8 @@ bool AMDGPUDAGToDAGISel::isUniformLoad(const SDNode *N) 
const {
          Ld->getAlign() >=
              Align(std::min(MMO->getSize().getValue().getKnownMinValue(),
                             uint64_t(4))) &&
-         ((Ld->getAddressSpace() == AMDGPUAS::CONSTANT_ADDRESS ||
+         (MMO->isInvariant() ||
+          (Ld->getAddressSpace() == AMDGPUAS::CONSTANT_ADDRESS ||
            Ld->getAddressSpace() == AMDGPUAS::CONSTANT_ADDRESS_32BIT) ||
           (Subtarget->getScalarizeGlobalBehavior() &&
            Ld->getAddressSpace() == AMDGPUAS::GLOBAL_ADDRESS &&
diff --git a/llvm/test/CodeGen/AMDGPU/invariant-load-no-alias-store.ll 
b/llvm/test/CodeGen/AMDGPU/invariant-load-no-alias-store.ll
index 6815050d0a441..23970d454526c 100644
--- a/llvm/test/CodeGen/AMDGPU/invariant-load-no-alias-store.ll
+++ b/llvm/test/CodeGen/AMDGPU/invariant-load-no-alias-store.ll
@@ -10,7 +10,7 @@
 ; GCN-DAG: buffer_load_dwordx2 [[PTR:v\[[0-9]+:[0-9]+\]]],
 ; GCN-DAG: v_mov_b32_e32 [[K:v[0-9]+]], 0x1c8007b
 ; GCN: buffer_store_dword [[K]], [[PTR]]
-define amdgpu_kernel void 
@test_merge_store_constant_i16_invariant_global_pointer_load(ptr addrspace(1) 
dereferenceable(4096) nonnull %in) #0 {
+define void @test_merge_store_constant_i16_invariant_global_pointer_load(ptr 
addrspace(1) dereferenceable(4096) nonnull %in) #0 {
   %ptr = load ptr addrspace(1), ptr addrspace(1) %in, !invariant.load !0
   %ptr.1 = getelementptr i16, ptr addrspace(1) %ptr, i64 1
   store i16 123, ptr addrspace(1) %ptr, align 4
@@ -30,6 +30,19 @@ define amdgpu_kernel void 
@test_merge_store_constant_i16_invariant_constant_poin
   ret void
 }
 
+; Invariant global load should be equivalently handled to constant.
+; GCN-LABEL: 
{{^}}test_merge_store_global_i16_invariant_uniform_global_pointer_load:
+; GCN: s_load_dwordx2 s[[[SPTR_LO:[0-9]+]]:[[SPTR_HI:[0-9]+]]]
+; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 0x1c8007b
+; GCN: buffer_store_dword [[K]], off, s[[[SPTR_LO]]:
+define amdgpu_kernel void 
@test_merge_store_global_i16_invariant_uniform_global_pointer_load(ptr 
addrspace(1) dereferenceable(4096) nonnull %in) #0 {
+  %ptr = load ptr addrspace(1), ptr addrspace(1) %in, !invariant.load !0
+  %ptr.1 = getelementptr i16, ptr addrspace(1) %ptr, i64 1
+  store i16 123, ptr addrspace(1) %ptr, align 4
+  store i16 456, ptr addrspace(1) %ptr.1
+  ret void
+}
+
 !0 = !{}
 
 attributes #0 = { nounwind }

_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to