diff --git a/lib/Analysis/Loads.cpp b/lib/Analysis/Loads.cpp index aa0b62638b1..a687eccf3e9 100644 --- a/lib/Analysis/Loads.cpp +++ b/lib/Analysis/Loads.cpp @@ -25,23 +25,6 @@ using namespace llvm; -static bool isDereferenceableFromAttribute(const Value *BV, APInt Size, - const DataLayout &DL, - const Instruction *CtxI, - const DominatorTree *DT, - const TargetLibraryInfo *TLI) { - bool CheckForNonNull = false; - APInt DerefBytes(Size.getBitWidth(), - BV->getPointerDereferenceableBytes(DL, CheckForNonNull)); - - if (DerefBytes.getBoolValue()) - if (DerefBytes.uge(Size)) - if (!CheckForNonNull || isKnownNonNullAt(BV, CtxI, DT, TLI)) - return true; - - return false; -} - static bool isAligned(const Value *Base, APInt Offset, unsigned Align, const DataLayout &DL) { APInt BaseAlign(Offset.getBitWidth(), Base->getPointerAlignment(DL)); @@ -80,8 +63,14 @@ static bool isDereferenceableAndAlignedPointer( return isDereferenceableAndAlignedPointer(BC->getOperand(0), Align, Size, DL, CtxI, DT, TLI, Visited); - if (isDereferenceableFromAttribute(V, Size, DL, CtxI, DT, TLI)) - return isAligned(V, Align, DL); + bool CheckForNonNull = false; + APInt KnownDerefBytes(Size.getBitWidth(), + V->getPointerDereferenceableBytes(DL, CheckForNonNull)); + if (KnownDerefBytes.getBoolValue()) { + if (KnownDerefBytes.uge(Size)) + if (!CheckForNonNull || isKnownNonNullAt(V, CtxI, DT, TLI)) + return isAligned(V, Align, DL); + } // For GEPs, determine if the indexing lands within the allocated object. if (const GEPOperator *GEP = dyn_cast(V)) {