Index: llvm/trunk/include/llvm/Analysis/Loads.h =================================================================== --- llvm/trunk/include/llvm/Analysis/Loads.h +++ llvm/trunk/include/llvm/Analysis/Loads.h @@ -24,11 +24,17 @@ class MDNode; /// isSafeToLoadUnconditionally - Return true if we know that executing a load -/// from this value cannot trap. If it is not obviously safe to load from the -/// specified pointer, we do a quick local scan of the basic block containing -/// ScanFrom, to determine if the address is already accessed. +/// from this value cannot trap. +/// +/// If DT is specified this method performs context-sensitive analysis. +/// +/// If it is not obviously safe to load from the specified pointer, we do a +/// quick local scan of the basic block containing ScanFrom, to determine if +/// the address is already accessed. bool isSafeToLoadUnconditionally(Value *V, unsigned Align, - Instruction *ScanFrom); + Instruction *ScanFrom, + const DominatorTree *DT = nullptr, + const TargetLibraryInfo *TLI = nullptr); /// DefMaxInstsToScan - the default number of maximum instructions /// to scan in the block, used by FindAvailableLoadedValue(). Index: llvm/trunk/lib/Analysis/Loads.cpp =================================================================== --- llvm/trunk/lib/Analysis/Loads.cpp +++ llvm/trunk/lib/Analysis/Loads.cpp @@ -56,6 +56,8 @@ /// \brief Check if executing a load of this pointer value cannot trap. /// +/// If DT is specified this method performs context-sensitive analysis. +/// /// If it is not obviously safe to load from the specified pointer, we do /// a quick local scan of the basic block containing \c ScanFrom, to determine /// if the address is already accessed. @@ -63,7 +65,9 @@ /// This uses the pointee type to determine how many bytes need to be safe to /// load from the pointer. bool llvm::isSafeToLoadUnconditionally(Value *V, unsigned Align, - Instruction *ScanFrom) { + Instruction *ScanFrom, + const DominatorTree *DT, + const TargetLibraryInfo *TLI) { const DataLayout &DL = ScanFrom->getModule()->getDataLayout(); // Zero alignment means that the load has the ABI alignment for the target @@ -71,7 +75,9 @@ Align = DL.getABITypeAlignment(V->getType()->getPointerElementType()); assert(isPowerOf2_32(Align)); - if (isDereferenceableAndAlignedPointer(V, Align, DL)) + // If DT is not specified we can't make context-sensitive query + const Instruction* CtxI = DT ? ScanFrom : nullptr; + if (isDereferenceableAndAlignedPointer(V, Align, DL, CtxI, DT, TLI)) return true; int64_t ByteOffset = 0;