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
