Index: lib/Analysis/Loads.cpp =================================================================== --- lib/Analysis/Loads.cpp +++ lib/Analysis/Loads.cpp @@ -370,6 +370,21 @@ if (LI->isAtomic() < AtLeastAtomic) return nullptr; + if (Ptr->getType()->isPointerTy()) { + PointerType *Ty1 = cast(Ptr->getType()); + if (PointerType *Ty2 = dyn_cast(LI->getType())) { + if (Ty1->getAddressSpace() != Ty2->getAddressSpace()) { + return nullptr; + } + } + else if (DL.isNonIntegralPointerType(Ty1)) { + return nullptr; + } + } + else if (DL.isNonIntegralPointerType(LI->getType())) { + return nullptr; + } + if (IsLoadCSE) *IsLoadCSE = true; return LI; @@ -389,6 +404,21 @@ if (SI->isAtomic() < AtLeastAtomic) return nullptr; + if (Ptr->getType()->isPointerTy()) { + PointerType *Ty1 = cast(Ptr->getType()); + if (PointerType *Ty2 = dyn_cast(SI->getValueOperand()->getType())) { + if (Ty1->getAddressSpace() != Ty2->getAddressSpace()) { + return nullptr; + } + } + else if (DL.isNonIntegralPointerType(Ty1)) { + return nullptr; + } + } + else if (DL.isNonIntegralPointerType(SI->getValueOperand()->getType())) { + return nullptr; + } + if (IsLoadCSE) *IsLoadCSE = false; return SI->getOperand(0); Index: test/Transforms/InstCombine/non-integral-pointers.ll =================================================================== --- test/Transforms/InstCombine/non-integral-pointers.ll +++ test/Transforms/InstCombine/non-integral-pointers.ll @@ -46,3 +46,21 @@ store i8 addrspace(3)* %val, i8 addrspace(3)** %ptr1 ret void } + +define i64 @g(i8 addrspace(4)** %gp) { +; CHECK-LABEL: @g( + %.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 + store i8 addrspace(4)* %.pre, i8 addrspace(4)** %v77, align 8 + %v78 = bitcast i8 addrspace(4)* %v74 to i8 addrspace(4)* addrspace(4)* + %v79 = addrspacecast i8 addrspace(4)* addrspace(4)* %v78 to i8 addrspace(4)** + %v80 = bitcast i8 addrspace(4)** %v77 to i64* +; CHECK-NOT: ptrtoint + %v81 = load i64, i64* %v80, align 8 + ret i64 %v81 +} + +declare i8 addrspace(4)* @alloc()