forked from OSchip/llvm-project
baby steps toward fixing some problems with inbound GEPs that overflow, as discussed 2 months ago or so.
Make sure we do not emit index computations with NSW flags so that we dont get an undef value if the GEP overflows llvm-svn: 160589
This commit is contained in:
parent
dff711ed75
commit
705141d4df
|
@ -168,15 +168,18 @@ static inline unsigned getKnownAlignment(Value *V, const TargetData *TD = 0) {
|
|||
/// EmitGEPOffset - Given a getelementptr instruction/constantexpr, emit the
|
||||
/// code necessary to compute the offset from the base pointer (without adding
|
||||
/// in the base pointer). Return the result as a signed integer of intptr size.
|
||||
/// When NoAssumptions is true, no assumptions about index computation not
|
||||
/// overflowing is made.
|
||||
template<typename IRBuilderTy>
|
||||
Value *EmitGEPOffset(IRBuilderTy *Builder, const TargetData &TD, User *GEP) {
|
||||
Value *EmitGEPOffset(IRBuilderTy *Builder, const TargetData &TD, User *GEP,
|
||||
bool NoAssumptions = false) {
|
||||
gep_type_iterator GTI = gep_type_begin(GEP);
|
||||
Type *IntPtrTy = TD.getIntPtrType(GEP->getContext());
|
||||
Value *Result = Constant::getNullValue(IntPtrTy);
|
||||
|
||||
// If the GEP is inbounds, we know that none of the addressing operations will
|
||||
// overflow in an unsigned sense.
|
||||
bool isInBounds = cast<GEPOperator>(GEP)->isInBounds();
|
||||
bool isInBounds = cast<GEPOperator>(GEP)->isInBounds() && !NoAssumptions;
|
||||
|
||||
// Build a mask for high order bits.
|
||||
unsigned IntPtrWidth = TD.getPointerSizeInBits();
|
||||
|
|
|
@ -645,7 +645,7 @@ ObjectSizeOffsetEvaluator::visitGEPOperator(GEPOperator &GEP) {
|
|||
if (!bothKnown(PtrData))
|
||||
return unknown();
|
||||
|
||||
Value *Offset = EmitGEPOffset(&Builder, *TD, &GEP);
|
||||
Value *Offset = EmitGEPOffset(&Builder, *TD, &GEP, /*NoAssumptions=*/true);
|
||||
Offset = Builder.CreateAdd(PtrData.second, Offset);
|
||||
return std::make_pair(PtrData.first, Offset);
|
||||
}
|
||||
|
|
|
@ -116,3 +116,13 @@ define void @f11(i128* byval %x) nounwind {
|
|||
%3 = load i8* %2, align 4
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK: @f12
|
||||
define i64 @f12(i64 %x, i64 %y) nounwind {
|
||||
%1 = tail call i8* @calloc(i64 1, i64 %x)
|
||||
; CHECK: mul i64 %y, 8
|
||||
%2 = bitcast i8* %1 to i64*
|
||||
%3 = getelementptr inbounds i64* %2, i64 %y
|
||||
%4 = load i64* %3, align 8
|
||||
ret i64 %4
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue