From d08e3ae271a9748af6c99be7e455730fb110b0a5 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Tue, 13 Dec 2022 12:02:10 -0800 Subject: [PATCH] [InstCombine] Support vectors in simplifyIntToPtrRoundTripCast. This code compares getPointerTypeSizeInBits and getTypeSizeInBits. getPointerTypeSizeInBits contains a call to getScalarType while getTypeSizeInBits does not. This makes the code incorrect for vectors. For scalable vectors this caused a warning about a scalable TypeSize being converted to unsigned. Switch to DL.getTypeSizeInBits for the pointers too. This should work since inttoptr/ptrtoint can't change the number of elements. This was suggested by @nikic in D139911. Fixes PR59480. Reviewed By: nikic Differential Revision: https://reviews.llvm.org/D139962 --- .../InstCombine/InstructionCombining.cpp | 4 ++-- .../InstCombine/ptr-int-ptr-icmp.ll | 22 +++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp index 2e41886359dab..38a79f055e9ed 100644 --- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp +++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -370,14 +370,14 @@ static bool simplifyAssocCastAssoc(BinaryOperator *BinOp1, // inttoptr ( ptrtoint (x) ) --> x Value *InstCombinerImpl::simplifyIntToPtrRoundTripCast(Value *Val) { auto *IntToPtr = dyn_cast(Val); - if (IntToPtr && DL.getPointerTypeSizeInBits(IntToPtr->getDestTy()) == + if (IntToPtr && DL.getTypeSizeInBits(IntToPtr->getDestTy()) == DL.getTypeSizeInBits(IntToPtr->getSrcTy())) { auto *PtrToInt = dyn_cast(IntToPtr->getOperand(0)); Type *CastTy = IntToPtr->getDestTy(); if (PtrToInt && CastTy->getPointerAddressSpace() == PtrToInt->getSrcTy()->getPointerAddressSpace() && - DL.getPointerTypeSizeInBits(PtrToInt->getSrcTy()) == + DL.getTypeSizeInBits(PtrToInt->getSrcTy()) == DL.getTypeSizeInBits(PtrToInt->getDestTy())) { return CastInst::CreateBitOrPointerCast(PtrToInt->getOperand(0), CastTy, "", PtrToInt); diff --git a/llvm/test/Transforms/InstCombine/ptr-int-ptr-icmp.ll b/llvm/test/Transforms/InstCombine/ptr-int-ptr-icmp.ll index a73dc419d7e6b..5249aa4269e87 100644 --- a/llvm/test/Transforms/InstCombine/ptr-int-ptr-icmp.ll +++ b/llvm/test/Transforms/InstCombine/ptr-int-ptr-icmp.ll @@ -17,6 +17,28 @@ define i1 @func(ptr %X, ptr %Y) { ret i1 %cmp } +define <2 x i1> @func_vec(<2 x ptr> %X, <2 x ptr> %Y) { +; CHECK-LABEL: @func_vec( +; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x ptr> [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: ret <2 x i1> [[CMP]] +; + %i = ptrtoint <2 x ptr> %X to <2 x i64> + %p = inttoptr <2 x i64> %i to <2 x ptr> + %cmp = icmp eq <2 x ptr> %p, %Y + ret <2 x i1> %cmp +} + +define @func_svec( %X, %Y) { +; CHECK-LABEL: @func_svec( +; CHECK-NEXT: [[CMP:%.*]] = icmp eq [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: ret [[CMP]] +; + %i = ptrtoint %X to + %p = inttoptr %i to + %cmp = icmp eq %p, %Y + ret %cmp +} + define i1 @func_pointer_different_types(ptr %X, ptr %Y) { ; CHECK-LABEL: @func_pointer_different_types( ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[X:%.*]], [[Y:%.*]]