Index: lib/Analysis/InlineCost.cpp =================================================================== --- lib/Analysis/InlineCost.cpp +++ lib/Analysis/InlineCost.cpp @@ -346,7 +346,7 @@ /// Returns false if unable to compute the offset for any reason. Respects any /// simplified values known during the analysis of this callsite. bool CallAnalyzer::accumulateGEPOffset(GEPOperator &GEP, APInt &Offset) { - unsigned IntPtrWidth = DL.getPointerSizeInBits(); + unsigned IntPtrWidth = DL.getPointerTypeSizeInBits(GEP.getType()); assert(IntPtrWidth == Offset.getBitWidth()); for (gep_type_iterator GTI = gep_type_begin(GEP), GTE = gep_type_end(GEP); @@ -537,7 +537,8 @@ // Track base/offset pairs when converted to a plain integer provided the // integer is large enough to represent the pointer. unsigned IntegerSize = I.getType()->getScalarSizeInBits(); - if (IntegerSize >= DL.getPointerSizeInBits()) { + unsigned AS = I.getOperand(0)->getType()->getPointerAddressSpace(); + if (IntegerSize >= DL.getPointerSizeInBits(AS)) { std::pair BaseAndOffset = ConstantOffsetPtrs.lookup(I.getOperand(0)); if (BaseAndOffset.first) @@ -570,7 +571,7 @@ // modifications provided the integer is not too large. Value *Op = I.getOperand(0); unsigned IntegerSize = Op->getType()->getScalarSizeInBits(); - if (IntegerSize <= DL.getPointerSizeInBits()) { + if (IntegerSize <= DL.getPointerTypeSizeInBits(I.getType())) { std::pair BaseAndOffset = ConstantOffsetPtrs.lookup(Op); if (BaseAndOffset.first) ConstantOffsetPtrs[&I] = BaseAndOffset; @@ -1484,7 +1485,8 @@ if (!V->getType()->isPointerTy()) return nullptr; - unsigned IntPtrWidth = DL.getPointerSizeInBits(); + unsigned AS = V->getType()->getPointerAddressSpace(); + unsigned IntPtrWidth = DL.getPointerSizeInBits(AS); APInt Offset = APInt::getNullValue(IntPtrWidth); // Even though we don't look through PHI nodes, we could be called on an @@ -1508,7 +1510,7 @@ assert(V->getType()->isPointerTy() && "Unexpected operand type!"); } while (Visited.insert(V).second); - Type *IntPtrTy = DL.getIntPtrType(V->getContext()); + Type *IntPtrTy = DL.getIntPtrType(V->getContext(), AS); return cast(ConstantInt::get(IntPtrTy, Offset)); } @@ -1735,7 +1737,8 @@ // size of the byval type by the target's pointer size. PointerType *PTy = cast(CS.getArgument(I)->getType()); unsigned TypeSize = DL.getTypeSizeInBits(PTy->getElementType()); - unsigned PointerSize = DL.getPointerSizeInBits(); + unsigned AS = PTy->getAddressSpace(); + unsigned PointerSize = DL.getPointerSizeInBits(AS); // Ceiling division. unsigned NumStores = (TypeSize + PointerSize - 1) / PointerSize; Index: test/Transforms/Inline/ptr-diff.ll =================================================================== --- test/Transforms/Inline/ptr-diff.ll +++ test/Transforms/Inline/ptr-diff.ll @@ -59,6 +59,30 @@ ret i32 %t } +define i32 @outer3(i16* addrspace(1)* %ptr) { +; CHECK-LABEL: @outer3( +; CHECK-NOT: call i32 +; CHECK: ret i32 3 +; CHECK-LABEL: @inner3( + %result = call i32 @inner3(i16* addrspace(1)* %ptr) + ret i32 %result +} + +define i32 @inner3(i16* addrspace(1)* %ptr) { + call void @extern() + %ptr.i = ptrtoint i16* addrspace(1)* %ptr to i64 + %distance = sub i64 %ptr.i, %ptr.i + %icmp = icmp eq i64 %distance, 0 + br i1 %icmp, label %then, label %else + +then: + ret i32 3 + +else: + ret i32 5 +} + + ; The inttoptrs are free since it is a smaller integer to a larger ; pointer size define i32 @inttoptr_free_cost(i32 %a, i32 %b, i32 %c) {