forked from OSchip/llvm-project
![]() GetPointerBaseWithConstantOffset include this code, where ByteOffset and GEPOffset are both of type llvm::APInt : ByteOffset += GEPOffset.getSExtValue(); The problem with this line is that getSExtValue() returns an int64_t, but the += matches an overload for uint64_t. The problem is that the resulting APInt is no longer considered to be signed. That in turn causes assertion failures later on if the relevant pointer type is > 64 bits in width and the GEPOffset was negative. Changing it to ByteOffset += GEPOffset.sextOrTrunc(ByteOffset.getBitWidth()); resolves the issue and explicitly performs the sign-extending or truncation. Additionally, instead of asserting later if the result is > 64 bits, it breaks out of the loop in that case. See also https://reviews.llvm.org/D24729 https://reviews.llvm.org/D24772 This commit must be merged after D38662 in order for the test to pass. Patch by Michael Ferguson <mpfergu@gmail.com>. Reviewers: reames, sanjoy, hfinkel Reviewed By: hfinkel Differential Revision: https://reviews.llvm.org/D38501 llvm-svn: 350395 |
||
---|---|---|
.. | ||
assume.ll | ||
deref-bitcast-of-gep.ll | ||
dereferenceable-and-aligned.ll | ||
func-ptr-lsb.ll | ||
gep-negative-issue.ll | ||
get-pointer-base-with-const-off.ll | ||
invariant.group.ll | ||
known-bits-from-range-md.ll | ||
known-non-equal.ll | ||
known-nonnull-at.ll | ||
known-power-of-two.ll | ||
known-signbit-shift.ll | ||
knownnonzero-shift.ll | ||
knownzero-addrspacecast.ll | ||
knownzero-shift.ll | ||
memory-dereferenceable.ll | ||
monotonic-phi.ll | ||
non-negative-phi-bits.ll | ||
numsignbits-from-assume.ll | ||
pr23011.ll | ||
select-pattern.ll | ||
signbits-extract-elt.ll |