aboutsummaryrefslogtreecommitdiff
path: root/lib/Transforms/Utils/BasicBlockUtils.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-11-27 08:18:12 +0000
committerChris Lattner <sabre@nondot.org>2008-11-27 08:18:12 +0000
commitee6e10bc8e389ed1a09c33c8cec15b3aa13e813b (patch)
tree2972423f39b2eac7840dc9b6655e09a9fe4ea17e /lib/Transforms/Utils/BasicBlockUtils.cpp
parent52c95856b4a40ccae6c4b0e13b2a04101e1f79c9 (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.cpp21
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;