From 689fbe01095f6d5f962f666089c1ec11ea13a1b2 Mon Sep 17 00:00:00 2001 From: Yichao Yu Date: Sun, 22 Oct 2017 20:28:17 +0000 Subject: [PATCH] Fix invalid ptrtoint in InstCombine Summary: It's unclear if this is the only thing we can do but at least this is consistent with the check of address space agreement in `isBitCastable`. The code is used at least in both instcombine and jumpthreading though I could only find a way to trigger the invalid cast in instcombine. Reviewers: loladiro, sanjoy, majnemer Reviewed By: sanjoy Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D34335 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@316302 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/IR/Instructions.cpp | 7 ++- .../InstCombine/non-integral-pointers.ll | 44 +++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/lib/IR/Instructions.cpp b/lib/IR/Instructions.cpp index 55c8ab6d5fd..490fcbce743 100644 --- a/lib/IR/Instructions.cpp +++ b/lib/IR/Instructions.cpp @@ -2877,12 +2877,15 @@ bool CastInst::isBitCastable(Type *SrcTy, Type *DestTy) { bool CastInst::isBitOrNoopPointerCastable(Type *SrcTy, Type *DestTy, const DataLayout &DL) { + // ptrtoint and inttoptr are not allowed on non-integral pointers if (auto *PtrTy = dyn_cast(SrcTy)) if (auto *IntTy = dyn_cast(DestTy)) - return IntTy->getBitWidth() == DL.getPointerTypeSizeInBits(PtrTy); + return (IntTy->getBitWidth() == DL.getPointerTypeSizeInBits(PtrTy) && + !DL.isNonIntegralPointerType(PtrTy)); if (auto *PtrTy = dyn_cast(DestTy)) if (auto *IntTy = dyn_cast(SrcTy)) - return IntTy->getBitWidth() == DL.getPointerTypeSizeInBits(PtrTy); + return (IntTy->getBitWidth() == DL.getPointerTypeSizeInBits(PtrTy) && + !DL.isNonIntegralPointerType(PtrTy)); return isBitCastable(SrcTy, DestTy); } diff --git a/test/Transforms/InstCombine/non-integral-pointers.ll b/test/Transforms/InstCombine/non-integral-pointers.ll index 4f54fe6737d..3b4538985bd 100644 --- a/test/Transforms/InstCombine/non-integral-pointers.ll +++ b/test/Transforms/InstCombine/non-integral-pointers.ll @@ -46,3 +46,47 @@ entry: store i8 addrspace(3)* %val, i8 addrspace(3)** %ptr1 ret void } + +define i64 @g(i8 addrspace(4)** %gp) { + ; CHECK-LABEL: @g( + ; CHECK: load + %.pre = load i8 addrspace(4)*, i8 addrspace(4)** %gp, align 8 + %v74 = call i8 addrspace(4)* @alloc() + %v75 = addrspacecast i8 addrspace(4)* %v74 to i8* + %v76 = bitcast i8* %v75 to i8 addrspace(4)** + %v77 = getelementptr i8 addrspace(4)*, i8 addrspace(4)** %v76, i64 -1 + ; CHECK: store + store i8 addrspace(4)* %.pre, i8 addrspace(4)** %v77, align 8 + %v80 = bitcast i8 addrspace(4)** %v77 to i64* + ; CHECK: load + ; CHECK-NOT: ptrtoint + %v81 = load i64, i64* %v80, align 8 + ret i64 %v81 +} + +define i64 @g2(i8* addrspace(4)* %gp) { + ; CHECK-LABEL: @g2( + ; CHECK: load + %.pre = load i8*, i8* addrspace(4)* %gp, align 8 + %v74 = call i8 addrspace(4)* @alloc() + %v76 = bitcast i8 addrspace(4)* %v74 to i8* addrspace(4)* + %v77 = getelementptr i8*, i8* addrspace(4)* %v76, i64 -1 + ; CHECK: store + store i8* %.pre, i8* addrspace(4)* %v77, align 8 + %v80 = bitcast i8* addrspace(4)* %v77 to i64 addrspace(4)* + ; CHECK-NOT: store + %v81 = load i64, i64 addrspace(4)* %v80, align 8 + ret i64 %v81 +} + +declare i8 addrspace(4)* @alloc() + +define i64 @f_4(i8 addrspace(4)* %v0) { + ; CHECK-LABEL: @f_4( + ; CHECK-NOT: ptrtoint + %v5 = bitcast i64 (i64)* @f_5 to i64 (i8 addrspace(4)*)* + %v6 = call i64 %v5(i8 addrspace(4)* %v0) + ret i64 %v6 +} + +declare i64 @f_5(i64) -- 2.40.0