diff options
author | Philip Reames <listmail@philipreames.com> | 2016-04-21 16:51:08 +0000 |
---|---|---|
committer | Philip Reames <listmail@philipreames.com> | 2016-04-21 16:51:08 +0000 |
commit | 92c43699bcc4a749c6c434e4fc56dc348d39d334 (patch) | |
tree | 4fa24c11b7f1d2d5d0117f5a0edaa0da9b96a769 /llvm/lib/Analysis/Loads.cpp | |
parent | 99bc480bc31b39c98a5192b2b9b145a692ad1207 (diff) | |
download | bcm5719-llvm-92c43699bcc4a749c6c434e4fc56dc348d39d334.tar.gz bcm5719-llvm-92c43699bcc4a749c6c434e4fc56dc348d39d334.zip |
[unordered] Add tests and conservative handling in support of future changes [NFCI]
This change adds a couple of test cases to make sure FindAvailableLoadedValue does the right thing. At the moment, the code added is dead, but separating it makes follow on changes far more obvious.
llvm-svn: 266999
Diffstat (limited to 'llvm/lib/Analysis/Loads.cpp')
-rw-r--r-- | llvm/lib/Analysis/Loads.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/Loads.cpp b/llvm/lib/Analysis/Loads.cpp index 21503ef668b..c5d23136733 100644 --- a/llvm/lib/Analysis/Loads.cpp +++ b/llvm/lib/Analysis/Loads.cpp @@ -416,6 +416,14 @@ Value *llvm::FindAvailableLoadedValue(LoadInst *Load, BasicBlock *ScanBB, 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. @@ -445,6 +453,12 @@ Value *llvm::FindAvailableLoadedValue(LoadInst *Load, BasicBlock *ScanBB, if (AreEquivalentAddressValues( LI->getPointerOperand()->stripPointerCasts(), StrippedPtr) && CastInst::isBitOrNoopPointerCastable(LI->getType(), AccessTy, DL)) { + + // We can value forward from an atomic to a non-atomic, but not the + // other way around. + if (LI->isAtomic() < Load->isAtomic()) + return nullptr; + if (AATags) LI->getAAMetadata(*AATags); return LI; @@ -458,6 +472,12 @@ Value *llvm::FindAvailableLoadedValue(LoadInst *Load, BasicBlock *ScanBB, if (AreEquivalentAddressValues(StorePtr, StrippedPtr) && CastInst::isBitOrNoopPointerCastable(SI->getValueOperand()->getType(), AccessTy, DL)) { + + // We can value forward from an atomic to a non-atomic, but not the + // other way around. + if (SI->isAtomic() < Load->isAtomic()) + return nullptr; + if (AATags) SI->getAAMetadata(*AATags); return SI->getOperand(0); |