summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2007-08-06 23:26:03 +0000
committerOwen Anderson <resistor@mac.com>2007-08-06 23:26:03 +0000
commit4898513d96d69a9f7139f7a7a73bf1b4e67167c0 (patch)
treeead944a8b444f7e0956febbec326a30190a7f1ad /llvm/lib
parenta010822b4570cbd7b5603c1d44a48f84637f2cf4 (diff)
downloadbcm5719-llvm-4898513d96d69a9f7139f7a7a73bf1b4e67167c0.tar.gz
bcm5719-llvm-4898513d96d69a9f7139f7a7a73bf1b4e67167c0.zip
Improve the accuracy of memdep for determining the dependencies of loads.
This brings GVN to parity with GCSE+LoadVN. llvm-svn: 40882
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Analysis/MemoryDependenceAnalysis.cpp15
1 files changed, 13 insertions, 2 deletions
diff --git a/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp b/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp
index 47e47e5cba1..53d229528d9 100644
--- a/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp
+++ b/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp
@@ -275,8 +275,14 @@ Instruction* MemoryDependenceAnalysis::getDependency(Instruction* query,
pointerSize = ~0UL;
} else if (CallSite::get(QI).getInstruction() != 0) {
// Call insts need special handling. Check is they can modify our pointer
- if (AA.getModRefInfo(CallSite::get(QI), dependee, dependeeSize) !=
- AliasAnalysis::NoModRef) {
+ AliasAnalysis::ModRefResult MR = AA.getModRefInfo(CallSite::get(QI),
+ dependee, dependeeSize);
+
+ if (MR != AliasAnalysis::NoModRef) {
+ // Loads don't depend on read-only calls
+ if (isa<LoadInst>(query) && MR == AliasAnalysis::Ref)
+ continue;
+
if (!start || block) {
depGraphLocal.insert(std::make_pair(query, std::make_pair(QI, true)));
reverseDep.insert(std::make_pair(QI, query));
@@ -294,6 +300,11 @@ Instruction* MemoryDependenceAnalysis::getDependency(Instruction* query,
dependee, dependeeSize);
if (R != AliasAnalysis::NoAlias) {
+ // May-alias loads don't depend on each other
+ if (isa<LoadInst>(query) && isa<LoadInst>(QI) &&
+ R == AliasAnalysis::MayAlias)
+ continue;
+
if (!start || block) {
depGraphLocal.insert(std::make_pair(query, std::make_pair(QI, true)));
reverseDep.insert(std::make_pair(QI, query));
OpenPOWER on IntegriCloud