From: Justin Lebar Date: Wed, 4 Oct 2017 20:47:33 +0000 (+0000) Subject: Convert an APInt to int64_t properly in TTI::getGEPCost(). X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d1dce4497d5ba4d67aeb18504113d73e51435466;p=llvm Convert an APInt to int64_t properly in TTI::getGEPCost(). Summary: If the pointer width is 32 bits and the calculated GEP offset is negative, we call APInt::getLimitedValue(), which does a *zero*-extension of the offset. That's wrong -- we should do an sext. Fixes a bug introduced in rL314362 and found by Evgeny Astigeevich. Reviewers: efriedma Subscribers: sanjoy, javed.absar, llvm-commits, eastig Differential Revision: https://reviews.llvm.org/D38557 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@314935 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Analysis/TargetTransformInfoImpl.h b/include/llvm/Analysis/TargetTransformInfoImpl.h index 2434f593bbb..905609e1afc 100644 --- a/include/llvm/Analysis/TargetTransformInfoImpl.h +++ b/include/llvm/Analysis/TargetTransformInfoImpl.h @@ -720,10 +720,10 @@ public: // Assumes the address space is 0 when Ptr is nullptr. unsigned AS = (Ptr == nullptr ? 0 : Ptr->getType()->getPointerAddressSpace()); + if (static_cast(this)->isLegalAddressingMode( TargetType, const_cast(BaseGV), - static_cast(BaseOffset.getLimitedValue()), HasBaseReg, - Scale, AS)) + BaseOffset.sextOrTrunc(64).getSExtValue(), HasBaseReg, Scale, AS)) return TTI::TCC_Free; return TTI::TCC_Basic; } diff --git a/test/Analysis/CostModel/ARM/gep.ll b/test/Analysis/CostModel/ARM/gep.ll index 9d74da4c2d3..12e314e2407 100644 --- a/test/Analysis/CostModel/ARM/gep.ll +++ b/test/Analysis/CostModel/ARM/gep.ll @@ -83,5 +83,8 @@ define void @test_geps(i32 %i) { ;CHECK: cost of 1 for instruction: {{.*}} getelementptr inbounds <4 x double>, <4 x double>* %c12 = getelementptr inbounds <4 x double>, <4 x double>* undef, i32 %i +;CHECK: cost of 0 for instruction: {{.*}} getelementptr inbounds i8, i8* + %d0 = getelementptr inbounds i8, i8* undef, i32 -1 + ret void }