[PATCH] D150043: [InferAddressSpaces] Handle vector of pointers type
CaprYang updated this revision to Diff 520296. CaprYang removed reviewers: bollu, ldionne, nicolasvasilache, rafauler, Amir, maksfb, NoQ, njames93, libc++, libc++abi, libunwind, rymiel, HazardyKnusperkeks, owenpan, MyDeveloperDay. CaprYang removed projects: clang-format, Flang, clang-tools-extra, MLIR, libunwind, libc++abi, libc-project, OpenMP, libc++, LLDB, Sanitizers, clang. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D150043/new/ https://reviews.llvm.org/D150043 Files: llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp llvm/test/Transforms/InferAddressSpaces/AMDGPU/icmp.ll llvm/test/Transforms/InferAddressSpaces/masked-gather-scatter.ll Index: llvm/test/Transforms/InferAddressSpaces/masked-gather-scatter.ll === --- /dev/null +++ llvm/test/Transforms/InferAddressSpaces/masked-gather-scatter.ll @@ -0,0 +1,25 @@ +; RUN: opt -S -passes=infer-address-spaces -assume-default-is-flat-addrspace %s | FileCheck %s + +; CHECK-LABEL: @masked_gather_inferas( +; CHECK: tail call <4 x i32> @llvm.masked.gather.v4i32.v4p1 +define <4 x i32> @masked_gather_inferas(ptr addrspace(1) %out, <4 x i64> %index) { +entry: + %out.1 = addrspacecast ptr addrspace(1) %out to ptr + %ptrs = getelementptr inbounds i32, ptr %out.1, <4 x i64> %index + %value = tail call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %ptrs, i32 4, <4 x i1> , <4 x i32> poison) + ret <4 x i32> %value +} + +; CHECK-LABEL: @masked_scatter_inferas( +; CHECK: tail call void @llvm.masked.scatter.v4i32.v4p1 +define void @masked_scatter_inferas(ptr addrspace(1) %out, <4 x i64> %index, <4 x i32> %value) { +entry: + %out.1 = addrspacecast ptr addrspace(1) %out to ptr + %ptrs = getelementptr inbounds i32, ptr %out.1, <4 x i64> %index + tail call void @llvm.masked.scatter.v4i32.v4p0(<4 x i32> %value, <4 x ptr> %ptrs, i32 4, <4 x i1> ) + ret void +} + +declare <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr>, i32 immarg, <4 x i1>, <4 x i32>) + +declare void @llvm.masked.scatter.v4i32.v4p0(<4 x i32>, <4 x ptr>, i32 immarg, <4 x i1>) \ No newline at end of file Index: llvm/test/Transforms/InferAddressSpaces/AMDGPU/icmp.ll === --- llvm/test/Transforms/InferAddressSpaces/AMDGPU/icmp.ll +++ llvm/test/Transforms/InferAddressSpaces/AMDGPU/icmp.ll @@ -147,9 +147,8 @@ ret i1 %cmp } -; TODO: Should be handled ; CHECK-LABEL: @icmp_flat_flat_from_group_vector( -; CHECK: %cmp = icmp eq <2 x ptr> %cast0, %cast1 +; CHECK: %cmp = icmp eq <2 x ptr addrspace(3)> %group.ptr.0, %group.ptr.1 define <2 x i1> @icmp_flat_flat_from_group_vector(<2 x ptr addrspace(3)> %group.ptr.0, <2 x ptr addrspace(3)> %group.ptr.1) #0 { %cast0 = addrspacecast <2 x ptr addrspace(3)> %group.ptr.0 to <2 x ptr> %cast1 = addrspacecast <2 x ptr addrspace(3)> %group.ptr.1 to <2 x ptr> Index: llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp === --- llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp +++ llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp @@ -256,6 +256,48 @@ INITIALIZE_PASS_END(InferAddressSpaces, DEBUG_TYPE, "Infer address spaces", false, false) +static unsigned getPtrOrVecOfPtrsAddressSpace(Type *Ty) { + if (Ty->isVectorTy()) { +Ty = cast(Ty)->getElementType(); + } + assert(Ty->isPointerTy()); + return Ty->getPointerAddressSpace(); +} + +static bool isPtrOrVecOfPtrsType(Type *Ty) { + if (Ty->isVectorTy()) { +Ty = cast(Ty)->getElementType(); + } + return Ty->isPointerTy(); +} + +static Type *getPtrOrVecOfPtrsWithNewAS(Type *Ty, unsigned NewAddrSpace) { + if (!Ty->isVectorTy()) { +assert(Ty->isPointerTy()); +return PointerType::getWithSamePointeeType(cast(Ty), + NewAddrSpace); + } + + Type *PT = cast(Ty)->getElementType(); + assert(PT->isPointerTy()); + + Type *NPT = + PointerType::getWithSamePointeeType(cast(PT), NewAddrSpace); + return VectorType::get(NPT, cast(Ty)->getElementCount()); +} + +static bool hasSameElementOfPtrOrVecPtrs(Type *Ty1, Type *Ty2) { + assert(isPtrOrVecOfPtrsType(Ty1) && isPtrOrVecOfPtrsType(Ty2)); + assert(Ty1->isVectorTy() == Ty2->isVectorTy()); + if (Ty1->isVectorTy()) { +Ty1 = cast(Ty1)->getElementType(); +Ty2 = cast(Ty2)->getElementType(); + } + + assert(Ty1->isPointerTy() && Ty2->isPointerTy()); + return cast(Ty1)->hasSameElementTypeAs(cast(Ty2)); +} + // Check whether that's no-op pointer bicast using a pair of // `ptrtoint`/`inttoptr` due to the missing no-op pointer bitcast over // different address spaces. @@ -279,8 +321,9 @@ // arithmetic may also be undefined after invalid pointer reinterpret cast. // However, as we confirm through the target hooks that it's a no-op // addrspacecast, it doesn't matter since the bits should be the same. - unsigned P2IOp0AS = P2I->getOperand(0)->getType()->getPointerAddre
[PATCH] D150043: [InferAddressSpaces] Handle vector of pointers type & Support intrinsic masked gather/scatter
CaprYang updated this revision to Diff 520302. CaprYang retitled this revision from "[InferAddressSpaces] Handle vector of pointers type" to "[InferAddressSpaces] Handle vector of pointers type & Support intrinsic masked gather/scatter". CHANGES SINCE LAST ACTION https://reviews.llvm.org/D150043/new/ https://reviews.llvm.org/D150043 Files: llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp llvm/test/Transforms/InferAddressSpaces/AMDGPU/icmp.ll llvm/test/Transforms/InferAddressSpaces/masked-gather-scatter.ll Index: llvm/test/Transforms/InferAddressSpaces/masked-gather-scatter.ll === --- /dev/null +++ llvm/test/Transforms/InferAddressSpaces/masked-gather-scatter.ll @@ -0,0 +1,25 @@ +; RUN: opt -S -passes=infer-address-spaces -assume-default-is-flat-addrspace %s | FileCheck %s + +; CHECK-LABEL: @masked_gather_inferas( +; CHECK: tail call <4 x i32> @llvm.masked.gather.v4i32.v4p1 +define <4 x i32> @masked_gather_inferas(ptr addrspace(1) %out, <4 x i64> %index) { +entry: + %out.1 = addrspacecast ptr addrspace(1) %out to ptr + %ptrs = getelementptr inbounds i32, ptr %out.1, <4 x i64> %index + %value = tail call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %ptrs, i32 4, <4 x i1> , <4 x i32> poison) + ret <4 x i32> %value +} + +; CHECK-LABEL: @masked_scatter_inferas( +; CHECK: tail call void @llvm.masked.scatter.v4i32.v4p1 +define void @masked_scatter_inferas(ptr addrspace(1) %out, <4 x i64> %index, <4 x i32> %value) { +entry: + %out.1 = addrspacecast ptr addrspace(1) %out to ptr + %ptrs = getelementptr inbounds i32, ptr %out.1, <4 x i64> %index + tail call void @llvm.masked.scatter.v4i32.v4p0(<4 x i32> %value, <4 x ptr> %ptrs, i32 4, <4 x i1> ) + ret void +} + +declare <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr>, i32 immarg, <4 x i1>, <4 x i32>) + +declare void @llvm.masked.scatter.v4i32.v4p0(<4 x i32>, <4 x ptr>, i32 immarg, <4 x i1>) \ No newline at end of file Index: llvm/test/Transforms/InferAddressSpaces/AMDGPU/icmp.ll === --- llvm/test/Transforms/InferAddressSpaces/AMDGPU/icmp.ll +++ llvm/test/Transforms/InferAddressSpaces/AMDGPU/icmp.ll @@ -147,9 +147,8 @@ ret i1 %cmp } -; TODO: Should be handled ; CHECK-LABEL: @icmp_flat_flat_from_group_vector( -; CHECK: %cmp = icmp eq <2 x ptr> %cast0, %cast1 +; CHECK: %cmp = icmp eq <2 x ptr addrspace(3)> %group.ptr.0, %group.ptr.1 define <2 x i1> @icmp_flat_flat_from_group_vector(<2 x ptr addrspace(3)> %group.ptr.0, <2 x ptr addrspace(3)> %group.ptr.1) #0 { %cast0 = addrspacecast <2 x ptr addrspace(3)> %group.ptr.0 to <2 x ptr> %cast1 = addrspacecast <2 x ptr addrspace(3)> %group.ptr.1 to <2 x ptr> Index: llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp === --- llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp +++ llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp @@ -256,6 +256,33 @@ INITIALIZE_PASS_END(InferAddressSpaces, DEBUG_TYPE, "Infer address spaces", false, false) +static Type *getPtrOrVecOfPtrsWithNewAS(Type *Ty, unsigned NewAddrSpace) { + if (!Ty->isVectorTy()) { +assert(Ty->isPointerTy()); +return PointerType::getWithSamePointeeType(cast(Ty), + NewAddrSpace); + } + + Type *PT = cast(Ty)->getElementType(); + assert(PT->isPointerTy()); + + Type *NPT = + PointerType::getWithSamePointeeType(cast(PT), NewAddrSpace); + return VectorType::get(NPT, cast(Ty)->getElementCount()); +} + +static bool hasSameElementOfPtrOrVecPtrs(Type *Ty1, Type *Ty2) { + assert(Ty1->isPtrOrPtrVectorTy() && Ty2->isPtrOrPtrVectorTy()); + assert(Ty1->isVectorTy() == Ty2->isVectorTy()); + if (Ty1->isVectorTy()) { +Ty1 = cast(Ty1)->getElementType(); +Ty2 = cast(Ty2)->getElementType(); + } + + assert(Ty1->isPointerTy() && Ty2->isPointerTy()); + return cast(Ty1)->hasSameElementTypeAs(cast(Ty2)); +} + // Check whether that's no-op pointer bicast using a pair of // `ptrtoint`/`inttoptr` due to the missing no-op pointer bitcast over // different address spaces. @@ -301,14 +328,14 @@ switch (Op->getOpcode()) { case Instruction::PHI: -assert(Op->getType()->isPointerTy()); +assert(Op->getType()->isPtrOrPtrVectorTy()); return true; case Instruction::BitCast: case Instruction::AddrSpaceCast: case Instruction::GetElementPtr: return true; case Instruction::Select: -return Op->getType()->isPointerTy(); +return Op->getType()->isPtrOrPtrVectorTy(); case Instruction::Call: { const IntrinsicInst *II = dyn_cast(&V); return II && II->getIntrinsicID() == Intrinsic::ptrmask; @@ -373,6 +400,24 @@ case Intrinsic::ptrmask: // This is handled as an address expression, not as a use memory operation. return false; + case Intrinsic::masked_gather: { +Type *RetTy = II->getType(); +Type *NewPtrTy = NewV
[PATCH] D150043: [InferAddressSpaces] Handle vector of pointers type & Support intrinsic masked gather/scatter
CaprYang updated this revision to Diff 520308. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D150043/new/ https://reviews.llvm.org/D150043 Files: llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp llvm/test/Transforms/InferAddressSpaces/AMDGPU/icmp.ll llvm/test/Transforms/InferAddressSpaces/masked-gather-scatter.ll Index: llvm/test/Transforms/InferAddressSpaces/masked-gather-scatter.ll === --- /dev/null +++ llvm/test/Transforms/InferAddressSpaces/masked-gather-scatter.ll @@ -0,0 +1,25 @@ +; RUN: opt -S -passes=infer-address-spaces -assume-default-is-flat-addrspace %s | FileCheck %s + +; CHECK-LABEL: @masked_gather_inferas( +; CHECK: tail call <4 x i32> @llvm.masked.gather.v4i32.v4p1 +define <4 x i32> @masked_gather_inferas(ptr addrspace(1) %out, <4 x i64> %index) { +entry: + %out.1 = addrspacecast ptr addrspace(1) %out to ptr + %ptrs = getelementptr inbounds i32, ptr %out.1, <4 x i64> %index + %value = tail call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %ptrs, i32 4, <4 x i1> , <4 x i32> poison) + ret <4 x i32> %value +} + +; CHECK-LABEL: @masked_scatter_inferas( +; CHECK: tail call void @llvm.masked.scatter.v4i32.v4p1 +define void @masked_scatter_inferas(ptr addrspace(1) %out, <4 x i64> %index, <4 x i32> %value) { +entry: + %out.1 = addrspacecast ptr addrspace(1) %out to ptr + %ptrs = getelementptr inbounds i32, ptr %out.1, <4 x i64> %index + tail call void @llvm.masked.scatter.v4i32.v4p0(<4 x i32> %value, <4 x ptr> %ptrs, i32 4, <4 x i1> ) + ret void +} + +declare <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr>, i32 immarg, <4 x i1>, <4 x i32>) + +declare void @llvm.masked.scatter.v4i32.v4p0(<4 x i32>, <4 x ptr>, i32 immarg, <4 x i1>) \ No newline at end of file Index: llvm/test/Transforms/InferAddressSpaces/AMDGPU/icmp.ll === --- llvm/test/Transforms/InferAddressSpaces/AMDGPU/icmp.ll +++ llvm/test/Transforms/InferAddressSpaces/AMDGPU/icmp.ll @@ -147,9 +147,8 @@ ret i1 %cmp } -; TODO: Should be handled ; CHECK-LABEL: @icmp_flat_flat_from_group_vector( -; CHECK: %cmp = icmp eq <2 x ptr> %cast0, %cast1 +; CHECK: %cmp = icmp eq <2 x ptr addrspace(3)> %group.ptr.0, %group.ptr.1 define <2 x i1> @icmp_flat_flat_from_group_vector(<2 x ptr addrspace(3)> %group.ptr.0, <2 x ptr addrspace(3)> %group.ptr.1) #0 { %cast0 = addrspacecast <2 x ptr addrspace(3)> %group.ptr.0 to <2 x ptr> %cast1 = addrspacecast <2 x ptr addrspace(3)> %group.ptr.1 to <2 x ptr> Index: llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp === --- llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp +++ llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp @@ -256,6 +256,21 @@ INITIALIZE_PASS_END(InferAddressSpaces, DEBUG_TYPE, "Infer address spaces", false, false) +static Type *getPtrOrVecOfPtrsWithNewAS(Type *Ty, unsigned NewAddrSpace) { + if (!Ty->isVectorTy()) { +assert(Ty->isPointerTy()); +return PointerType::getWithSamePointeeType(cast(Ty), + NewAddrSpace); + } + + Type *PT = cast(Ty)->getElementType(); + assert(PT->isPointerTy()); + + Type *NPT = + PointerType::getWithSamePointeeType(cast(PT), NewAddrSpace); + return VectorType::get(NPT, cast(Ty)->getElementCount()); +} + // Check whether that's no-op pointer bicast using a pair of // `ptrtoint`/`inttoptr` due to the missing no-op pointer bitcast over // different address spaces. @@ -301,14 +316,14 @@ switch (Op->getOpcode()) { case Instruction::PHI: -assert(Op->getType()->isPointerTy()); +assert(Op->getType()->isPtrOrPtrVectorTy()); return true; case Instruction::BitCast: case Instruction::AddrSpaceCast: case Instruction::GetElementPtr: return true; case Instruction::Select: -return Op->getType()->isPointerTy(); +return Op->getType()->isPtrOrPtrVectorTy(); case Instruction::Call: { const IntrinsicInst *II = dyn_cast(&V); return II && II->getIntrinsicID() == Intrinsic::ptrmask; @@ -373,6 +388,24 @@ case Intrinsic::ptrmask: // This is handled as an address expression, not as a use memory operation. return false; + case Intrinsic::masked_gather: { +Type *RetTy = II->getType(); +Type *NewPtrTy = NewV->getType(); +Function *NewDecl = +Intrinsic::getDeclaration(M, II->getIntrinsicID(), {RetTy, NewPtrTy}); +II->setArgOperand(0, NewV); +II->setCalledFunction(NewDecl); +return true; + } + case Intrinsic::masked_scatter: { +Type *ValueTy = II->getOperand(0)->getType(); +Type *NewPtrTy = NewV->getType(); +Function *NewDecl = +Intrinsic::getDeclaration(M, II->getIntrinsicID(), {ValueTy, NewPtrTy}); +II->setArgOperand(1, NewV); +II->setCalledFunction(NewDecl); +return true; + } default: { Value *Rewrite = TTI->rewriteIntrinsicWithAddre
[PATCH] D150043: [InferAddressSpaces] Handle vector of pointers type & Support intrinsic masked gather/scatter
CaprYang added inline comments. Comment at: llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp:259-265 +static unsigned getPtrOrVecOfPtrsAddressSpace(Type *Ty) { + if (Ty->isVectorTy()) { +Ty = cast(Ty)->getElementType(); + } + assert(Ty->isPointerTy()); + return Ty->getPointerAddressSpace(); +} arsenm wrote: > This is reinventing Type::getPointerAddressSpace Yes.. it seems like I am doing some useless work. Comment at: llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp:268-271 + if (Ty->isVectorTy()) { +Ty = cast(Ty)->getElementType(); + } + return Ty->isPointerTy(); arsenm wrote: > isPtrOrPtrVectorTy Oh thanks! I just learned that there are these APIs, let me replace them. Comment at: llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp:285 + Type *NPT = + PointerType::getWithSamePointeeType(cast(PT), NewAddrSpace); + return VectorType::get(NPT, cast(Ty)->getElementCount()); arsenm wrote: > Don't need to bother trying to maintain pointer element types anymore Sorry.. I don't know what to do, can you tell me? Comment at: llvm/test/Transforms/InferAddressSpaces/AMDGPU/icmp.ll:151 ; CHECK-LABEL: @icmp_flat_flat_from_group_vector( -; CHECK: %cmp = icmp eq <2 x ptr> %cast0, %cast1 +; CHECK: %cmp = icmp eq <2 x ptr addrspace(3)> %group.ptr.0, %group.ptr.1 define <2 x i1> @icmp_flat_flat_from_group_vector(<2 x ptr addrspace(3)> %group.ptr.0, <2 x ptr addrspace(3)> %group.ptr.1) #0 { arsenm wrote: > You touched a lot more than just icmp, so this needs more tests to cover all > the newly handled cases I will add more tests later CHANGES SINCE LAST ACTION https://reviews.llvm.org/D150043/new/ https://reviews.llvm.org/D150043 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D150043: [InferAddressSpaces] Handle vector of pointers type & Support intrinsic masked gather/scatter
CaprYang updated this revision to Diff 520660. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D150043/new/ https://reviews.llvm.org/D150043 Files: llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp llvm/test/Transforms/InferAddressSpaces/AMDGPU/icmp.ll llvm/test/Transforms/InferAddressSpaces/masked-gather-scatter.ll llvm/test/Transforms/InferAddressSpaces/vector-of-pointers.ll Index: llvm/test/Transforms/InferAddressSpaces/vector-of-pointers.ll === --- /dev/null +++ llvm/test/Transforms/InferAddressSpaces/vector-of-pointers.ll @@ -0,0 +1,101 @@ +; RUN: opt -S -passes=infer-address-spaces -assume-default-is-flat-addrspace %s | FileCheck %s + +; CHECK-LABEL: @double_ascast( +; CHECK: call void @use(<4 x ptr addrspace(3)> %input) +; CHECK: ret void +define void @double_ascast(<4 x ptr addrspace(3)> %input) { +entry: + %tmp0 = addrspacecast <4 x ptr addrspace(3)> %input to <4 x ptr> + %tmp1 = addrspacecast <4 x ptr> %tmp0 to <4 x ptr addrspace(3)> + call void @use(<4 x ptr addrspace(3)> %tmp1) + ret void +} + +; CHECK-LABEL: @double_gep( +; CHECK: %tmp1 = getelementptr float, ptr addrspace(3) %input, <4 x i64> %i +; CHECK: %tmp2 = getelementptr float, <4 x ptr addrspace(3)> %tmp1, i64 %j +; CHECK: call void @use(<4 x ptr addrspace(3)> %tmp2) +; CHECK: ret void +define void @double_gep(ptr addrspace(3) %input, <4 x i64> %i, i64 %j) { +entry: + %tmp0 = addrspacecast ptr addrspace(3) %input to ptr + %tmp1 = getelementptr float, ptr %tmp0, <4 x i64> %i + %tmp2 = getelementptr float, <4 x ptr> %tmp1, i64 %j + %tmp3 = addrspacecast <4 x ptr> %tmp2 to <4 x ptr addrspace(3)> + call void @use(<4 x ptr addrspace(3)> %tmp3) + ret void +} + +; CHECK-LABEL: @inferas_phi( +; CHECK: entry: +; CHECK: br i1 %cond, label %inc, label %end +; CHECK: inc: +; CHECK: %tmp1 = getelementptr float, <4 x ptr addrspace(3)> %input, i64 1 +; CHECK: br label %end +; CHECK: end: +; CHECK: %tmp2 = phi <4 x ptr addrspace(3)> [ %input, %entry ], [ %tmp1, %inc ] +; CHECK: call void @use(<4 x ptr addrspace(3)> %tmp2) +; CHECK: ret void +define void @inferas_phi(<4 x ptr addrspace(3)> %input, i1 %cond) { +entry: + %tmp0 = addrspacecast <4 x ptr addrspace(3)> %input to <4 x ptr> + br i1 %cond, label %inc, label %end + +inc: + %tmp1 = getelementptr float, <4 x ptr> %tmp0, i64 1 + br label %end + +end: + %tmp2 = phi <4 x ptr> [ %tmp0, %entry ], [ %tmp1, %inc ] + %tmp3 = addrspacecast <4 x ptr> %tmp2 to <4 x ptr addrspace(3)> + call void @use(<4 x ptr addrspace(3)> %tmp3) + ret void +} + +; CHECK-LABEL: @inferas_ptr2int2ptr( +; CHECK: call void @use(<4 x ptr addrspace(3)> %input) +; CHECK: ret void +define void @inferas_ptr2int2ptr(<4 x ptr addrspace(3)> %input) { +entry: + %tmp0 = addrspacecast <4 x ptr addrspace(3)> %input to <4 x ptr> + %tmp1 = ptrtoint <4 x ptr> %tmp0 to <4 x i64> + %tmp2 = inttoptr <4 x i64> %tmp1 to <4 x ptr> + %tmp3 = addrspacecast <4 x ptr> %tmp2 to <4 x ptr addrspace(3)> + call void @use(<4 x ptr addrspace(3)> %tmp3) + ret void +} + +; CHECK-LABEL: @inferas_loop( +; CHECK: entry: +; CHECK: br label %loop +; CHECK: loop: +; CHECK: %now = phi <4 x ptr addrspace(3)> [ %begin, %entry ], [ %next, %loop ] +; CHECK: call void @use(<4 x ptr addrspace(3)> %now) +; CHECK: %next = getelementptr float, <4 x ptr addrspace(3)> %now, i64 1 +; CHECK: %veq = icmp eq <4 x ptr addrspace(3)> %next, %end +; CHECK: %mask = bitcast <4 x i1> %veq to i4 +; CHECK: %cond = icmp eq i4 %mask, 0 +; CHECK: br i1 %cond, label %loop, label %exit +; CHECK: exit: +; CHECK: ret void +define void @inferas_loop(<4 x ptr addrspace(3)> %begin, <4 x ptr addrspace(3)> %end) { +entry: + %begin0 = addrspacecast <4 x ptr addrspace(3)> %begin to <4 x ptr> + %end0 = addrspacecast <4 x ptr addrspace(3)> %end to <4 x ptr> + br label %loop + +loop: + %now = phi <4 x ptr> [ %begin0, %entry ], [ %next, %loop ] + %now3 = addrspacecast <4 x ptr> %now to <4 x ptr addrspace(3)> + call void @use(<4 x ptr addrspace(3)> %now3) + %next = getelementptr float, <4 x ptr> %now, i64 1 + %veq = icmp eq <4 x ptr> %next, %end0 + %mask = bitcast <4 x i1> %veq to i4 + %cond = icmp eq i4 %mask, 0 + br i1 %cond, label %loop, label %exit + +exit: + ret void +} + +declare void @use(<4 x ptr addrspace(3)>) \ No newline at end of file Index: llvm/test/Transforms/InferAddressSpaces/masked-gather-scatter.ll === --- /dev/null +++ llvm/test/Transforms/InferAddressSpaces/masked-gather-scatter.ll @@ -0,0 +1,25 @@ +; RUN: opt -S -passes=infer-address-spaces -assume-default-is-flat-addrspace %s | FileCheck %s + +; CHECK-LABEL: @masked_gather_inferas( +; CHECK: tail call <4 x i32> @llvm.masked.gather.v4i32.v4p1 +define <4 x i32> @masked_gather_inferas(ptr addrspace(1) %out, <4 x i64> %index) { +entry: + %out.1 = addrspacecast ptr addrspace(1) %out to ptr + %ptrs = getelementptr inbounds i32, ptr %out.1, <4 x i64> %index + %value
[PATCH] D150043: [InferAddressSpaces] Handle vector of pointers type & Support intrinsic masked gather/scatter
CaprYang added inline comments. Comment at: llvm/test/Transforms/InferAddressSpaces/AMDGPU/icmp.ll:151 ; CHECK-LABEL: @icmp_flat_flat_from_group_vector( -; CHECK: %cmp = icmp eq <2 x ptr> %cast0, %cast1 +; CHECK: %cmp = icmp eq <2 x ptr addrspace(3)> %group.ptr.0, %group.ptr.1 define <2 x i1> @icmp_flat_flat_from_group_vector(<2 x ptr addrspace(3)> %group.ptr.0, <2 x ptr addrspace(3)> %group.ptr.1) #0 { CaprYang wrote: > arsenm wrote: > > You touched a lot more than just icmp, so this needs more tests to cover > > all the newly handled cases > I will add more tests later added CHANGES SINCE LAST ACTION https://reviews.llvm.org/D150043/new/ https://reviews.llvm.org/D150043 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D150043: [InferAddressSpaces] Handle vector of pointers type & Support intrinsic masked gather/scatter
CaprYang added inline comments. Comment at: llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp:289 + +static bool hasSameElementOfPtrOrVecPtrs(Type *Ty1, Type *Ty2) { + assert(isPtrOrVecOfPtrsType(Ty1) && isPtrOrVecOfPtrsType(Ty2)); arsenm wrote: > arsenm wrote: > > Ditto, only opaque pointers matter now > You don't need to bother using getWithSamePointeeType. You can use > Type::getWithNewType Does it mean this? do't check non-opaque types. ``` static Type *getPtrOrVecOfPtrsWithNewAS(Type *Ty, unsigned NewAddrSpace) { assert(Ty->isPtrOrPtrVectorTy()); PointerType *NPT = PointerType::get(Ty->getContext(), NewAddrSpace); return Ty->getWithNewType(NPT); } ``` CHANGES SINCE LAST ACTION https://reviews.llvm.org/D150043/new/ https://reviews.llvm.org/D150043 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D150043: [InferAddressSpaces] Handle vector of pointers type & Support intrinsic masked gather/scatter
CaprYang updated this revision to Diff 520692. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D150043/new/ https://reviews.llvm.org/D150043 Files: llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp llvm/test/Transforms/InferAddressSpaces/AMDGPU/icmp.ll llvm/test/Transforms/InferAddressSpaces/masked-gather-scatter.ll llvm/test/Transforms/InferAddressSpaces/vector-of-pointers.ll Index: llvm/test/Transforms/InferAddressSpaces/vector-of-pointers.ll === --- /dev/null +++ llvm/test/Transforms/InferAddressSpaces/vector-of-pointers.ll @@ -0,0 +1,104 @@ +; RUN: opt -S -passes=infer-address-spaces -assume-default-is-flat-addrspace %s | FileCheck %s + +; CHECK-LABEL: @double_ascast( +; CHECK-NEXT: entry: +; CHECK-NEXT: call void @use(<4 x ptr addrspace(3)> [[INPUT:%.*]]) +; CHECK-NEXT: ret void +define void @double_ascast(<4 x ptr addrspace(3)> %input) { +entry: + %tmp0 = addrspacecast <4 x ptr addrspace(3)> %input to <4 x ptr> + %tmp1 = addrspacecast <4 x ptr> %tmp0 to <4 x ptr addrspace(3)> + call void @use(<4 x ptr addrspace(3)> %tmp1) + ret void +} + +; CHECK-LABEL: @double_gep( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TMP1:%.*]] = getelementptr float, ptr addrspace(3) [[INPUT:%.*]], <4 x i64> [[I:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = getelementptr float, <4 x ptr addrspace(3)> [[TMP1]], i64 [[J:%.*]] +; CHECK-NEXT: call void @use(<4 x ptr addrspace(3)> [[TMP2]]) +; CHECK-NEXT: ret void +define void @double_gep(ptr addrspace(3) %input, <4 x i64> %i, i64 %j) { +entry: + %tmp0 = addrspacecast ptr addrspace(3) %input to ptr + %tmp1 = getelementptr float, ptr %tmp0, <4 x i64> %i + %tmp2 = getelementptr float, <4 x ptr> %tmp1, i64 %j + %tmp3 = addrspacecast <4 x ptr> %tmp2 to <4 x ptr addrspace(3)> + call void @use(<4 x ptr addrspace(3)> %tmp3) + ret void +} + +; CHECK-LABEL: @inferas_phi( +; CHECK-NEXT: entry: +; CHECK-NEXT: br i1 [[COND:%.*]], label %inc, label %end +; CHECK: inc: +; CHECK-NEXT: [[TMP1:%.*]] = getelementptr float, <4 x ptr addrspace(3)> [[INPUT:%.*]], i64 1 +; CHECK-NEXT: br label %end +; CHECK: end: +; CHECK-NEXT: [[TMP2:%.*]] = phi <4 x ptr addrspace(3)> [ [[INPUT]], %entry ], [ [[TMP1]], %inc ] +; CHECK-NEXT: call void @use(<4 x ptr addrspace(3)> [[TMP2]]) +; CHECK-NEXT: ret void +define void @inferas_phi(<4 x ptr addrspace(3)> %input, i1 %cond) { +entry: + %tmp0 = addrspacecast <4 x ptr addrspace(3)> %input to <4 x ptr> + br i1 %cond, label %inc, label %end + +inc: + %tmp1 = getelementptr float, <4 x ptr> %tmp0, i64 1 + br label %end + +end: + %tmp2 = phi <4 x ptr> [ %tmp0, %entry ], [ %tmp1, %inc ] + %tmp3 = addrspacecast <4 x ptr> %tmp2 to <4 x ptr addrspace(3)> + call void @use(<4 x ptr addrspace(3)> %tmp3) + ret void +} + +; CHECK-LABEL: @inferas_ptr2int2ptr( +; CHECK-NEXT: entry: +; CHECK-NEXT: call void @use(<4 x ptr addrspace(3)> [[INPUT:%.*]]) +; CHECK-NEXT: ret void +define void @inferas_ptr2int2ptr(<4 x ptr addrspace(3)> %input) { +entry: + %tmp0 = addrspacecast <4 x ptr addrspace(3)> %input to <4 x ptr> + %tmp1 = ptrtoint <4 x ptr> %tmp0 to <4 x i64> + %tmp2 = inttoptr <4 x i64> %tmp1 to <4 x ptr> + %tmp3 = addrspacecast <4 x ptr> %tmp2 to <4 x ptr addrspace(3)> + call void @use(<4 x ptr addrspace(3)> %tmp3) + ret void +} + +; CHECK-LABEL: @inferas_loop( +; CHECK-NEXT: entry: +; CHECK-NEXT: br label %loop +; CHECK: loop: +; CHECK-NEXT: [[NOW:%.*]] = phi <4 x ptr addrspace(3)> [ [[BEGIN:%.*]], %entry ], [ [[NEXT:%.*]], %loop ] +; CHECK-NEXT: call void @use(<4 x ptr addrspace(3)> [[NOW]]) +; CHECK-NEXT: [[NEXT]] = getelementptr float, <4 x ptr addrspace(3)> [[NOW]], i64 1 +; CHECK-NEXT: [[VEQ:%.*]] = icmp eq <4 x ptr addrspace(3)> [[NEXT]], [[END:%.*]] +; CHECK-NEXT: [[MASK:%.*]] = bitcast <4 x i1> [[VEQ]] to i4 +; CHECK-NEXT: [[COND:%.*]] = icmp eq i4 [[MASK]], 0 +; CHECK-NEXT: br i1 [[COND]], label %loop, label %exit +; CHECK: exit: +; CHECK-NEXT: ret void +define void @inferas_loop(<4 x ptr addrspace(3)> %begin, <4 x ptr addrspace(3)> %end) { +entry: + %begin0 = addrspacecast <4 x ptr addrspace(3)> %begin to <4 x ptr> + %end0 = addrspacecast <4 x ptr addrspace(3)> %end to <4 x ptr> + br label %loop + +loop: + %now = phi <4 x ptr> [ %begin0, %entry ], [ %next, %loop ] + %now3 = addrspacecast <4 x ptr> %now to <4 x ptr addrspace(3)> + call void @use(<4 x ptr addrspace(3)> %now3) + %next = getelementptr float, <4 x ptr> %now, i64 1 + %veq = icmp eq <4 x ptr> %next, %end0 + %mask = bitcast <4 x i1> %veq to i4 + %cond = icmp eq i4 %mask, 0 + br i1 %cond, label %loop, label %exit + +exit: + ret void +} + +declare void @use(<4 x ptr addrspace(3)>) \ No newline at end of file Index: llvm/test/Transforms/InferAddressSpaces/masked-gather-scatter.ll === --- /dev/null +++ llvm/test/Transforms/InferAddressSpaces/masked-gather-scatter.ll @@ -0,0 +1,31 @@ +; RUN: opt -S -passes=infer-address-spaces -assume-default-is-flat-ad
[PATCH] D150043: [InferAddressSpaces] Handle vector of pointers type & Support intrinsic masked gather/scatter
CaprYang added inline comments. Comment at: llvm/test/Transforms/InferAddressSpaces/masked-gather-scatter.ll:3 + +; CHECK-LABEL: @masked_gather_inferas( +; CHECK: tail call <4 x i32> @llvm.masked.gather.v4i32.v4p1 arsenm wrote: > Generate full checks updated CHANGES SINCE LAST ACTION https://reviews.llvm.org/D150043/new/ https://reviews.llvm.org/D150043 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D150043: [InferAddressSpaces] Handle vector of pointers type & Support intrinsic masked gather/scatter
CaprYang added inline comments. Comment at: llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp:289 + +static bool hasSameElementOfPtrOrVecPtrs(Type *Ty1, Type *Ty2) { + assert(isPtrOrVecOfPtrsType(Ty1) && isPtrOrVecOfPtrsType(Ty2)); CaprYang wrote: > arsenm wrote: > > arsenm wrote: > > > Ditto, only opaque pointers matter now > > You don't need to bother using getWithSamePointeeType. You can use > > Type::getWithNewType > Does it mean this? do't check non-opaque types. > > ``` > static Type *getPtrOrVecOfPtrsWithNewAS(Type *Ty, unsigned NewAddrSpace) { > assert(Ty->isPtrOrPtrVectorTy()); > PointerType *NPT = PointerType::get(Ty->getContext(), NewAddrSpace); > return Ty->getWithNewType(NPT); > } > ``` @arsenm Excuse me... can you help me review again? CHANGES SINCE LAST ACTION https://reviews.llvm.org/D150043/new/ https://reviews.llvm.org/D150043 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D150043: [InferAddressSpaces] Handle vector of pointers type & Support intrinsic masked gather/scatter
CaprYang updated this revision to Diff 523087. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D150043/new/ https://reviews.llvm.org/D150043 Files: llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp llvm/test/Transforms/InferAddressSpaces/AMDGPU/icmp.ll llvm/test/Transforms/InferAddressSpaces/masked-gather-scatter.ll llvm/test/Transforms/InferAddressSpaces/vector-of-pointers.ll Index: llvm/test/Transforms/InferAddressSpaces/vector-of-pointers.ll === --- /dev/null +++ llvm/test/Transforms/InferAddressSpaces/vector-of-pointers.ll @@ -0,0 +1,115 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 +; RUN: opt -S -passes=infer-address-spaces -assume-default-is-flat-addrspace %s | FileCheck %s + +define void @double_ascast(<4 x ptr addrspace(3)> %input) { +; CHECK-LABEL: define void @double_ascast +; CHECK-SAME: (<4 x ptr addrspace(3)> [[INPUT:%.*]]) { +; CHECK-NEXT: entry: +; CHECK-NEXT:call void @use(<4 x ptr addrspace(3)> [[INPUT]]) +; CHECK-NEXT:ret void +; +entry: + %tmp0 = addrspacecast <4 x ptr addrspace(3)> %input to <4 x ptr> + %tmp1 = addrspacecast <4 x ptr> %tmp0 to <4 x ptr addrspace(3)> + call void @use(<4 x ptr addrspace(3)> %tmp1) + ret void +} + +define void @double_gep(ptr addrspace(3) %input, <4 x i64> %i, i64 %j) { +; CHECK-LABEL: define void @double_gep +; CHECK-SAME: (ptr addrspace(3) [[INPUT:%.*]], <4 x i64> [[I:%.*]], i64 [[J:%.*]]) { +; CHECK-NEXT: entry: +; CHECK-NEXT:[[TMP1:%.*]] = getelementptr float, ptr addrspace(3) [[INPUT]], <4 x i64> [[I]] +; CHECK-NEXT:[[TMP2:%.*]] = getelementptr float, <4 x ptr addrspace(3)> [[TMP1]], i64 [[J]] +; CHECK-NEXT:call void @use(<4 x ptr addrspace(3)> [[TMP2]]) +; CHECK-NEXT:ret void +; +entry: + %tmp0 = addrspacecast ptr addrspace(3) %input to ptr + %tmp1 = getelementptr float, ptr %tmp0, <4 x i64> %i + %tmp2 = getelementptr float, <4 x ptr> %tmp1, i64 %j + %tmp3 = addrspacecast <4 x ptr> %tmp2 to <4 x ptr addrspace(3)> + call void @use(<4 x ptr addrspace(3)> %tmp3) + ret void +} + +define void @inferas_phi(<4 x ptr addrspace(3)> %input, i1 %cond) { +; CHECK-LABEL: define void @inferas_phi +; CHECK-SAME: (<4 x ptr addrspace(3)> [[INPUT:%.*]], i1 [[COND:%.*]]) { +; CHECK-NEXT: entry: +; CHECK-NEXT:br i1 [[COND]], label [[INC:%.*]], label [[END:%.*]] +; CHECK: inc: +; CHECK-NEXT:[[TMP1:%.*]] = getelementptr float, <4 x ptr addrspace(3)> [[INPUT]], i64 1 +; CHECK-NEXT:br label [[END]] +; CHECK: end: +; CHECK-NEXT:[[TMP2:%.*]] = phi <4 x ptr addrspace(3)> [ [[INPUT]], [[ENTRY:%.*]] ], [ [[TMP1]], [[INC]] ] +; CHECK-NEXT:call void @use(<4 x ptr addrspace(3)> [[TMP2]]) +; CHECK-NEXT:ret void +; +entry: + %tmp0 = addrspacecast <4 x ptr addrspace(3)> %input to <4 x ptr> + br i1 %cond, label %inc, label %end + +inc: + %tmp1 = getelementptr float, <4 x ptr> %tmp0, i64 1 + br label %end + +end: + %tmp2 = phi <4 x ptr> [ %tmp0, %entry ], [ %tmp1, %inc ] + %tmp3 = addrspacecast <4 x ptr> %tmp2 to <4 x ptr addrspace(3)> + call void @use(<4 x ptr addrspace(3)> %tmp3) + ret void +} + +define void @inferas_ptr2int2ptr(<4 x ptr addrspace(3)> %input) { +; CHECK-LABEL: define void @inferas_ptr2int2ptr +; CHECK-SAME: (<4 x ptr addrspace(3)> [[INPUT:%.*]]) { +; CHECK-NEXT: entry: +; CHECK-NEXT:call void @use(<4 x ptr addrspace(3)> [[INPUT]]) +; CHECK-NEXT:ret void +; +entry: + %tmp0 = addrspacecast <4 x ptr addrspace(3)> %input to <4 x ptr> + %tmp1 = ptrtoint <4 x ptr> %tmp0 to <4 x i64> + %tmp2 = inttoptr <4 x i64> %tmp1 to <4 x ptr> + %tmp3 = addrspacecast <4 x ptr> %tmp2 to <4 x ptr addrspace(3)> + call void @use(<4 x ptr addrspace(3)> %tmp3) + ret void +} + +define void @inferas_loop(<4 x ptr addrspace(3)> %begin, <4 x ptr addrspace(3)> %end) { +; CHECK-LABEL: define void @inferas_loop +; CHECK-SAME: (<4 x ptr addrspace(3)> [[BEGIN:%.*]], <4 x ptr addrspace(3)> [[END:%.*]]) { +; CHECK-NEXT: entry: +; CHECK-NEXT:br label [[LOOP:%.*]] +; CHECK: loop: +; CHECK-NEXT:[[NOW:%.*]] = phi <4 x ptr addrspace(3)> [ [[BEGIN]], [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ] +; CHECK-NEXT:call void @use(<4 x ptr addrspace(3)> [[NOW]]) +; CHECK-NEXT:[[NEXT]] = getelementptr float, <4 x ptr addrspace(3)> [[NOW]], i64 1 +; CHECK-NEXT:[[VEQ:%.*]] = icmp eq <4 x ptr addrspace(3)> [[NEXT]], [[END]] +; CHECK-NEXT:[[MASK:%.*]] = bitcast <4 x i1> [[VEQ]] to i4 +; CHECK-NEXT:[[COND:%.*]] = icmp eq i4 [[MASK]], 0 +; CHECK-NEXT:br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]] +; CHECK: exit: +; CHECK-NEXT:ret void +; +entry: + %begin0 = addrspacecast <4 x ptr addrspace(3)> %begin to <4 x ptr> + %end0 = addrspacecast <4 x ptr addrspace(3)> %end to <4 x ptr> + br label %loop + +loop: + %now = phi <4 x ptr> [ %begin0, %entry ], [ %next, %loop ] + %now3 = addrspacecast <4 x ptr> %now to <4 x ptr addrspace(3)> + call void @u
[PATCH] D150043: [InferAddressSpaces] Handle vector of pointers type & Support intrinsic masked gather/scatter
CaprYang added inline comments. Comment at: llvm/test/Transforms/InferAddressSpaces/masked-gather-scatter.ll:3 + +; CHECK-LABEL: @masked_gather_inferas( +; CHECK: tail call <4 x i32> @llvm.masked.gather.v4i32.v4p1 arsenm wrote: > CaprYang wrote: > > arsenm wrote: > > > Generate full checks > > updated > These aren't generated checks? I meant use update_test_checks Yeah.. but I've already rewritten with `update_test_checks.py`. I didn't know about its existence before, thx! CHANGES SINCE LAST ACTION https://reviews.llvm.org/D150043/new/ https://reviews.llvm.org/D150043 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D150043: [InferAddressSpaces] Handle vector of pointers type & Support intrinsic masked gather/scatter
CaprYang added inline comments. Comment at: llvm/test/Transforms/InferAddressSpaces/masked-gather-scatter.ll:3 + +; CHECK-LABEL: @masked_gather_inferas( +; CHECK: tail call <4 x i32> @llvm.masked.gather.v4i32.v4p1 CaprYang wrote: > arsenm wrote: > > CaprYang wrote: > > > arsenm wrote: > > > > Generate full checks > > > updated > > These aren't generated checks? I meant use update_test_checks > Yeah.. but I've already rewritten with `update_test_checks.py`. I didn't know > about its existence before, thx! Could you please commit this for me if there are no issues? I don't have permissions to do. thx! author: `CaprYang ` CHANGES SINCE LAST ACTION https://reviews.llvm.org/D150043/new/ https://reviews.llvm.org/D150043 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits