mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 12:43:36 +01:00
Make context-sensitive isDereferenceable queries in isSafeToLoadUnconditionally
This is a part of the refactoring to unify isSafeToLoadUnconditionally and isDereferenceablePointer functions. In the subsequent change isSafeToSpeculativelyExecute will be modified to use isSafeToLoadUnconditionally instead of isDereferenceableAndAlignedPointer. Reviewed By: reames Differential Revision: http://reviews.llvm.org/D16227 llvm-svn: 260520
This commit is contained in:
parent
b88f17016b
commit
3b9ebd21e4
@ -24,11 +24,17 @@ class DataLayout;
|
||||
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().
|
||||
|
@ -56,6 +56,8 @@ static bool AreEquivalentAddressValues(const Value *A, const Value *B) {
|
||||
|
||||
/// \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 @@ static bool AreEquivalentAddressValues(const Value *A, const Value *B) {
|
||||
/// 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 @@ bool llvm::isSafeToLoadUnconditionally(Value *V, unsigned Align,
|
||||
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;
|
||||
|
Loading…
Reference in New Issue
Block a user