diff options
author | Chris Lattner <sabre@nondot.org> | 2008-11-27 08:18:12 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-11-27 08:18:12 +0000 |
commit | ee6e10bc8e389ed1a09c33c8cec15b3aa13e813b (patch) | |
tree | 2972423f39b2eac7840dc9b6655e09a9fe4ea17e /lib/Transforms/Utils/BasicBlockUtils.cpp | |
parent | 52c95856b4a40ccae6c4b0e13b2a04101e1f79c9 (diff) |
enhance FindAvailableLoadedValue to make use of AliasAnalysis
if it has it.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60167 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Utils/BasicBlockUtils.cpp')
-rw-r--r-- | lib/Transforms/Utils/BasicBlockUtils.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/lib/Transforms/Utils/BasicBlockUtils.cpp b/lib/Transforms/Utils/BasicBlockUtils.cpp index aafeface3e..d38099f4eb 100644 --- a/lib/Transforms/Utils/BasicBlockUtils.cpp +++ b/lib/Transforms/Utils/BasicBlockUtils.cpp @@ -20,6 +20,7 @@ #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Analysis/LoopInfo.h" #include "llvm/Analysis/Dominators.h" +#include "llvm/Target/TargetData.h" #include <algorithm> using namespace llvm; @@ -390,6 +391,13 @@ Value *llvm::FindAvailableLoadedValue(Value *Ptr, BasicBlock *ScanBB, unsigned MaxInstsToScan, AliasAnalysis *AA) { if (MaxInstsToScan == 0) MaxInstsToScan = ~0U; + + // If we're using alias analysis to disambiguate get the size of *Ptr. + unsigned AccessSize = 0; + if (AA) { + const Type *AccessTy = cast<PointerType>(Ptr->getType())->getElementType(); + AccessSize = AA->getTargetData().getTypeStoreSizeInBits(AccessTy); + } while (ScanFrom != ScanBB->begin()) { // Don't scan huge blocks. @@ -415,14 +423,25 @@ Value *llvm::FindAvailableLoadedValue(Value *Ptr, BasicBlock *ScanBB, isa<GlobalVariable>(SI->getOperand(1)))) continue; + // If we have alias analysis and it says the store won't modify the loaded + // value, ignore the store. + if (AA && + (AA->getModRefInfo(SI, Ptr, AccessSize) & AliasAnalysis::Mod) == 0) + continue; + // Otherwise the store that may or may not alias the pointer, bail out. ++ScanFrom; return 0; } - // If this is some other instruction that may clobber Ptr, bail out. if (Inst->mayWriteToMemory()) { + // If alias analysis claims that it really won't modify the load, + // ignore it. + if (AA && + (AA->getModRefInfo(Inst, Ptr, AccessSize) & AliasAnalysis::Mod) == 0) + continue; + // May modify the pointer, bail out. ++ScanFrom; return 0; |