From d199ff17659fc65a9b1b4ebe2d304cdbfdfe89d7 Mon Sep 17 00:00:00 2001 From: Wenju He Date: Wed, 1 Nov 2023 13:32:38 +0800 Subject: [PATCH] [InferAddressSpaces] collect flat address expression from return value (#70610) If function return value's type is pointer, we can try to collect flat address expression from it. This PR also fixes noop_ptrint_pair_ce2 in noop-ptrint-pair.ll in #70611 --- llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp | 4 ++++ .../InferAddressSpaces/AMDGPU/noop-ptrint-pair.ll | 7 +++++++ .../Transforms/InferAddressSpaces/AMDGPU/select.ll | 10 +++++----- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp b/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp index 2da521375c00..28fe1b5e7532 100644 --- a/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp +++ b/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp @@ -523,6 +523,10 @@ InferAddressSpacesImpl::collectFlatAddressExpressions(Function &F) const { } else if (auto *I2P = dyn_cast(&I)) { if (isNoopPtrIntCastPair(cast(I2P), *DL, TTI)) PushPtrOperand(cast(I2P->getOperand(0))->getOperand(0)); + } else if (auto *RI = dyn_cast(&I)) { + if (auto *RV = RI->getReturnValue(); + RV && RV->getType()->isPtrOrPtrVectorTy()) + PushPtrOperand(RV); } } diff --git a/llvm/test/Transforms/InferAddressSpaces/AMDGPU/noop-ptrint-pair.ll b/llvm/test/Transforms/InferAddressSpaces/AMDGPU/noop-ptrint-pair.ll index a73cd517fd49..b6713e96bed3 100644 --- a/llvm/test/Transforms/InferAddressSpaces/AMDGPU/noop-ptrint-pair.ll +++ b/llvm/test/Transforms/InferAddressSpaces/AMDGPU/noop-ptrint-pair.ll @@ -69,6 +69,13 @@ define ptr @noop_ptrint_pair_ce2() { ret ptr inttoptr (i64 ptrtoint (ptr addrspace(1) @g to i64) to ptr) } +; COMMON-LABEL: @noop_ptrint_pair_ce2_vec( +; AMDGCN-NEXT: ret <2 x ptr> +; NOTTI-NEXT: ret <2 x ptr> +define <2 x ptr> @noop_ptrint_pair_ce2_vec() { + ret <2 x ptr> +} + ; COMMON-LABEL: @noop_ptrint_pair_ce3( ; AMDGCN-NEXT: %i = inttoptr i64 ptrtoint (ptr addrspace(1) @g to i64) to ptr ; AMDGCN-NEXT: ret void diff --git a/llvm/test/Transforms/InferAddressSpaces/AMDGPU/select.ll b/llvm/test/Transforms/InferAddressSpaces/AMDGPU/select.ll index 9495c5566b36..ab4e1277b81f 100644 --- a/llvm/test/Transforms/InferAddressSpaces/AMDGPU/select.ll +++ b/llvm/test/Transforms/InferAddressSpaces/AMDGPU/select.ll @@ -3,11 +3,11 @@ ; Instcombine pulls the addrspacecast out of the select, make sure ; this doesn't do something insane on non-canonical IR. -; CHECK-LABEL: @return_select_group_flat( -; CHECK-NEXT: %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr -; CHECK-NEXT: %cast1 = addrspacecast ptr addrspace(3) %group.ptr.1 to ptr -; CHECK-NEXT: %select = select i1 %c, ptr %cast0, ptr %cast1 -; CHECK-NEXT: ret ptr %select +; CHECK-LABEL: define ptr @return_select_group_flat( +; CHECK-SAME: i1 [[C:%.*]], ptr addrspace(3) [[GROUP_PTR_0:%.*]], ptr addrspace(3) [[GROUP_PTR_1:%.*]]) #[[ATTR0:[0-9]+]] { +; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[C]], ptr addrspace(3) [[GROUP_PTR_0]], ptr addrspace(3) [[GROUP_PTR_1]] +; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr addrspace(3) [[SELECT]] to ptr +; CHECK-NEXT: ret ptr [[TMP1]] define ptr @return_select_group_flat(i1 %c, ptr addrspace(3) %group.ptr.0, ptr addrspace(3) %group.ptr.1) #0 { %cast0 = addrspacecast ptr addrspace(3) %group.ptr.0 to ptr %cast1 = addrspacecast ptr addrspace(3) %group.ptr.1 to ptr