diff options
author | Anna Thomas <anna@azul.com> | 2016-07-08 15:18:56 +0000 |
---|---|---|
committer | Anna Thomas <anna@azul.com> | 2016-07-08 15:18:56 +0000 |
commit | 3124f6273ab4ce6e6ee6f9b6e8b9781824e6cdb1 (patch) | |
tree | 8bba84eb055c68c148b8e25ad073b978038ed794 /llvm/lib/Analysis/Loads.cpp | |
parent | 68853ab2c5e4c64e9aee003f77ed5008ec8d0fe4 (diff) | |
download | bcm5719-llvm-3124f6273ab4ce6e6ee6f9b6e8b9781824e6cdb1.tar.gz bcm5719-llvm-3124f6273ab4ce6e6ee6f9b6e8b9781824e6cdb1.zip |
InstCombine rule to fold truncs whose value is available
We can fold truncs whose operand feeds from a load, if the trunc value
is available through a prior load/store.
This change is from: http://reviews.llvm.org/D21246, which folded the
trunc but missed the bitcast or ptrtoint/inttoptr required in the RAUW
call, when the load type didnt match the prior load/store type.
Differential Revision: http://reviews.llvm.org/D21791
llvm-svn: 274853
Diffstat (limited to 'llvm/lib/Analysis/Loads.cpp')
-rw-r--r-- | llvm/lib/Analysis/Loads.cpp | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/llvm/lib/Analysis/Loads.cpp b/llvm/lib/Analysis/Loads.cpp index 309a1d95efb..1a2f8e76c87 100644 --- a/llvm/lib/Analysis/Loads.cpp +++ b/llvm/lib/Analysis/Loads.cpp @@ -297,27 +297,17 @@ llvm::DefMaxInstsToScan("available-load-scan-limit", cl::init(6), cl::Hidden, "to scan backward from a given instruction, when searching for " "available loaded value")); -Value *llvm::FindAvailableLoadedValue(LoadInst *Load, BasicBlock *ScanBB, + +Value *llvm::FindAvailableLoadedValue(Value *Ptr, Type *AccessTy, + bool IsAtomicMemOp, BasicBlock *ScanBB, BasicBlock::iterator &ScanFrom, unsigned MaxInstsToScan, AliasAnalysis *AA, AAMDNodes *AATags, bool *IsLoadCSE) { + if (MaxInstsToScan == 0) MaxInstsToScan = ~0U; - - Value *Ptr = Load->getPointerOperand(); - Type *AccessTy = Load->getType(); - - // We can never remove a volatile load - if (Load->isVolatile()) - return nullptr; - - // Anything stronger than unordered is currently unimplemented. - if (!Load->isUnordered()) - return nullptr; - const DataLayout &DL = ScanBB->getModule()->getDataLayout(); - // Try to get the store size for the type. uint64_t AccessSize = DL.getTypeStoreSize(AccessTy); @@ -348,7 +338,7 @@ Value *llvm::FindAvailableLoadedValue(LoadInst *Load, BasicBlock *ScanBB, // We can value forward from an atomic to a non-atomic, but not the // other way around. - if (LI->isAtomic() < Load->isAtomic()) + if (LI->isAtomic() < IsAtomicMemOp) return nullptr; if (AATags) @@ -369,7 +359,7 @@ Value *llvm::FindAvailableLoadedValue(LoadInst *Load, BasicBlock *ScanBB, // We can value forward from an atomic to a non-atomic, but not the // other way around. - if (SI->isAtomic() < Load->isAtomic()) + if (SI->isAtomic() < IsAtomicMemOp) return nullptr; if (AATags) @@ -413,3 +403,24 @@ Value *llvm::FindAvailableLoadedValue(LoadInst *Load, BasicBlock *ScanBB, // block. return nullptr; } + + +Value *llvm::FindAvailableLoadedValue(LoadInst *Load, BasicBlock *ScanBB, + BasicBlock::iterator &ScanFrom, + unsigned MaxInstsToScan, + AliasAnalysis *AA, AAMDNodes *AATags, + bool *IsLoadCSE) { + + // We can never remove a volatile load + if (Load->isVolatile()) + return nullptr; + + // Anything stronger than unordered is currently unimplemented. + if (!Load->isUnordered()) + return nullptr; + + // Return the full value of the load if available. + return FindAvailableLoadedValue(Load->getPointerOperand(), Load->getType(), + Load->isAtomic(), ScanBB, ScanFrom, + MaxInstsToScan, AA, AATags, IsLoadCSE); +} |