From d3d9111ede31031fd5798ae0740b0afd2380da50 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 28 Nov 2008 22:51:08 +0000 Subject: Fix PR3141 by ensuring that MemoryDependenceAnalysis::removeInstruction properly updates the reverse dependency map when it installs updated dependencies for instructions that depend on the removed instruction. llvm-svn: 60222 --- llvm/lib/Analysis/MemoryDependenceAnalysis.cpp | 40 ++++++++++++++++++-------- 1 file changed, 28 insertions(+), 12 deletions(-) (limited to 'llvm/lib/Analysis') diff --git a/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp b/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp index 27c43c735e9..9c269053c12 100644 --- a/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp +++ b/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp @@ -545,6 +545,7 @@ void MemoryDependenceAnalysis::removeInstruction(Instruction *RemInst) { if (IsConfirmed) { // If we have a confirmed non-local flag, use it. if (LocalDepInst == NonLocal || LocalDepInst == None) { + // The only time this dependency is confirmed is if it is non-local. NewDependency = LocalDepInst; NewDependencyConfirmed = true; } else { @@ -565,18 +566,34 @@ void MemoryDependenceAnalysis::removeInstruction(Instruction *RemInst) { if (NewDependency == 0) NewDependency = next(BasicBlock::iterator(RemInst)); - SmallPtrSet& set = reverseDep[RemInst]; - for (SmallPtrSet::iterator I = set.begin(), E = set.end(); - I != E; ++I) { - // Insert the new dependencies - // Mark it as unconfirmed as long as it is not the non-local flag - depGraphLocal[*I] = std::make_pair(NewDependency, NewDependencyConfirmed); + // Loop over all of the things that depend on the instruction we're removing. + // + reverseDepMapType::iterator ReverseDepIt = reverseDep.find(RemInst); + if (ReverseDepIt != reverseDep.end()) { + SmallPtrSet &ReverseDeps = ReverseDepIt->second; + for (SmallPtrSet::iterator I = ReverseDeps.begin(), + E = ReverseDeps.end(); I != E; ++I) { + Instruction *InstDependingOnRemInst = *I; + + // If we thought the instruction depended on itself (possible for + // unconfirmed dependencies) ignore the update. + if (InstDependingOnRemInst == RemInst) continue; + + // Insert the new dependencies. + depGraphLocal[InstDependingOnRemInst] = + std::make_pair(NewDependency, NewDependencyConfirmed); + + // If our NewDependency is an instruction, make sure to remember that new + // things depend on it. + if (NewDependency != NonLocal && NewDependency != None) + reverseDep[NewDependency].insert(InstDependingOnRemInst); + } + reverseDep.erase(RemInst); } - reverseDep.erase(RemInst); - - if (reverseDepNonLocal.count(RemInst)) { - SmallPtrSet& set = reverseDepNonLocal[RemInst]; + ReverseDepIt = reverseDepNonLocal.find(RemInst); + if (ReverseDepIt != reverseDepNonLocal.end()) { + SmallPtrSet& set = ReverseDepIt->second; for (SmallPtrSet::iterator I = set.begin(), E = set.end(); I != E; ++I) for (DenseMap::iterator DI = @@ -584,10 +601,9 @@ void MemoryDependenceAnalysis::removeInstruction(Instruction *RemInst) { DI != DE; ++DI) if (DI->second == RemInst) DI->second = Dirty; - + reverseDepNonLocal.erase(RemInst); } - reverseDepNonLocal.erase(RemInst); depGraphNonLocal.erase(RemInst); getAnalysis().deleteValue(RemInst); -- cgit v1.2.3