diff options
| author | Owen Anderson <resistor@mac.com> | 2007-08-06 23:26:03 +0000 |
|---|---|---|
| committer | Owen Anderson <resistor@mac.com> | 2007-08-06 23:26:03 +0000 |
| commit | 4898513d96d69a9f7139f7a7a73bf1b4e67167c0 (patch) | |
| tree | ead944a8b444f7e0956febbec326a30190a7f1ad /llvm/lib | |
| parent | a010822b4570cbd7b5603c1d44a48f84637f2cf4 (diff) | |
| download | bcm5719-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.cpp | 15 |
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)); |

