mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-05 03:36:43 +00:00
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 llvm-svn: 314935
This commit is contained in:
parent
e3a4a32d00
commit
c8a4e60a71
@ -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<T *>(this)->isLegalAddressingMode(
|
||||
TargetType, const_cast<GlobalValue *>(BaseGV),
|
||||
static_cast<int64_t>(BaseOffset.getLimitedValue()), HasBaseReg,
|
||||
Scale, AS))
|
||||
BaseOffset.sextOrTrunc(64).getSExtValue(), HasBaseReg, Scale, AS))
|
||||
return TTI::TCC_Free;
|
||||
return TTI::TCC_Basic;
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user