From fd66c22fa1655e58b685dbc173b1f9e207ea2821 Mon Sep 17 00:00:00 2001 From: Wenju He Date: Fri, 19 Sep 2025 04:05:29 +0200 Subject: [PATCH] [InferAddressSpaces] Mark ConstantAggregateZero as safe to cast to a ConstantExpr addrspacecast This PR extends isSafeToCastConstAddrSpace to treat ConstantAggregateZero like ConstantPointerNull. Tests shows an extra addrspacecast instruction is removed and icmp pointer vector operand's address space is now inferred. This change is motivated by inspecting the test in commit f7629f5945f6. --- llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp | 2 +- llvm/test/Transforms/InferAddressSpaces/AMDGPU/issue110433.ll | 3 +-- llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-poison.ll | 3 +-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp b/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp index 7363ec38a4e3a..3ad87545953ff 100644 --- a/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp +++ b/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp @@ -1170,7 +1170,7 @@ bool InferAddressSpacesImpl::isSafeToCastConstAddrSpace(Constant *C, if (SrcAS != FlatAddrSpace && NewAS != FlatAddrSpace) return false; - if (isa(C)) + if (isa(C) || isa(C)) return true; if (auto *Op = dyn_cast(C)) { diff --git a/llvm/test/Transforms/InferAddressSpaces/AMDGPU/issue110433.ll b/llvm/test/Transforms/InferAddressSpaces/AMDGPU/issue110433.ll index 4297d1c27639e..1928bb98cd2a7 100644 --- a/llvm/test/Transforms/InferAddressSpaces/AMDGPU/issue110433.ll +++ b/llvm/test/Transforms/InferAddressSpaces/AMDGPU/issue110433.ll @@ -6,8 +6,7 @@ define <8 x i1> @load_vector_of_flat_ptr_from_constant(ptr addrspace(4) %ptr) { ; CHECK-SAME: ptr addrspace(4) [[PTR:%.*]]) { ; CHECK-NEXT: [[LD:%.*]] = load <8 x ptr>, ptr addrspace(4) [[PTR]], align 128 ; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast <8 x ptr> [[LD]] to <8 x ptr addrspace(1)> -; CHECK-NEXT: [[TMP2:%.*]] = addrspacecast <8 x ptr addrspace(1)> [[TMP1]] to <8 x ptr> -; CHECK-NEXT: [[CMP:%.*]] = icmp eq <8 x ptr> [[TMP2]], zeroinitializer +; CHECK-NEXT: [[CMP:%.*]] = icmp eq <8 x ptr addrspace(1)> [[TMP1]], ; CHECK-NEXT: ret <8 x i1> [[CMP]] ; %ld = load <8 x ptr>, ptr addrspace(4) %ptr, align 128 diff --git a/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-poison.ll b/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-poison.ll index 6c60d9748ebc7..0ccf7e3df8af9 100644 --- a/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-poison.ll +++ b/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-poison.ll @@ -11,9 +11,8 @@ define void @phi_poison(ptr addrspace(1) %arg, <2 x ptr addrspace(1)> %arg1) { ; CHECK: merge: ; CHECK-NEXT: [[I:%.*]] = phi ptr addrspace(1) [ [[ARG:%.*]], [[LEADER]] ], [ poison, [[ENTRY:%.*]] ] ; CHECK-NEXT: [[I2:%.*]] = phi <2 x ptr addrspace(1)> [ [[ARG1:%.*]], [[LEADER]] ], [ poison, [[ENTRY]] ] -; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast <2 x ptr addrspace(1)> [[I2]] to <2 x ptr> ; CHECK-NEXT: [[J:%.*]] = icmp eq ptr addrspace(1) [[I]], addrspacecast (ptr null to ptr addrspace(1)) -; CHECK-NEXT: [[J1:%.*]] = icmp eq <2 x ptr> [[TMP1]], zeroinitializer +; CHECK-NEXT: [[J1:%.*]] = icmp eq <2 x ptr addrspace(1)> [[I2]], ; CHECK-NEXT: ret void ; entry: