Author: resistor Date: Mon Aug 6 18:26:03 2007 New Revision: 40882 URL: http://llvm.org/viewvc/llvm-project?rev=40882&view=rev Log: Improve the accuracy of memdep for determining the dependencies of loads. This brings GVN to parity with GCSE+LoadVN.
Modified: llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp Modified: llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp?rev=40882&r1=40881&r2=40882&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp (original) +++ llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp Mon Aug 6 18:26:03 2007 @@ -275,8 +275,14 @@ 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 @@ 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)); _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits