diff options
author | Chris Lattner <sabre@nondot.org> | 2008-12-07 18:42:51 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-12-07 18:42:51 +0000 |
commit | 4a15a66b70ee9dd60fc6bc3c9dfecf0030c6e9a9 (patch) | |
tree | 2757d35fafc89d799651ff09c51d9a72792386d3 /lib | |
parent | 0d67d6076961e91fac2cf49e2c87336efaa201f0 (diff) | |
download | external_llvm-4a15a66b70ee9dd60fc6bc3c9dfecf0030c6e9a9.zip external_llvm-4a15a66b70ee9dd60fc6bc3c9dfecf0030c6e9a9.tar.gz external_llvm-4a15a66b70ee9dd60fc6bc3c9dfecf0030c6e9a9.tar.bz2 |
factor some code better.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60673 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Analysis/MemoryDependenceAnalysis.cpp | 34 |
1 files changed, 17 insertions, 17 deletions
diff --git a/lib/Analysis/MemoryDependenceAnalysis.cpp b/lib/Analysis/MemoryDependenceAnalysis.cpp index c7b9c25..457e94f 100644 --- a/lib/Analysis/MemoryDependenceAnalysis.cpp +++ b/lib/Analysis/MemoryDependenceAnalysis.cpp @@ -647,6 +647,16 @@ void MemoryDependenceAnalysis::removeInstruction(Instruction *RemInst) { // Loop over all of the things that depend on the instruction we're removing. // SmallVector<std::pair<Instruction*, Instruction*>, 8> ReverseDepsToAdd; + + // If we find RemInst as a clobber or Def in any of the maps for other values, + // we need to replace its entry with a dirty version of the instruction after + // it. If RemInst is a terminator, we use a null dirty value. + // + // Using a dirty version of the instruction after RemInst saves having to scan + // the entire block to get to this point. + MemDepResult NewDirtyVal; + if (!RemInst->isTerminator()) + NewDirtyVal = MemDepResult::getDirty(++BasicBlock::iterator(RemInst)); ReverseDepMapType::iterator ReverseDepIt = ReverseLocalDeps.find(RemInst); if (ReverseDepIt != ReverseLocalDeps.end()) { @@ -655,22 +665,18 @@ void MemoryDependenceAnalysis::removeInstruction(Instruction *RemInst) { assert(!ReverseDeps.empty() && !isa<TerminatorInst>(RemInst) && "Nothing can locally depend on a terminator"); - // Anything that was locally dependent on RemInst is now going to be - // dependent on the instruction after RemInst. It will have the dirty flag - // set so it will rescan. This saves having to scan the entire block to get - // to this point. - Instruction *NewDepInst = ++BasicBlock::iterator(RemInst); - for (SmallPtrSet<Instruction*, 4>::iterator I = ReverseDeps.begin(), E = ReverseDeps.end(); I != E; ++I) { Instruction *InstDependingOnRemInst = *I; assert(InstDependingOnRemInst != RemInst && "Already removed our local dep info"); - LocalDeps[InstDependingOnRemInst] = MemDepResult::getDirty(NewDepInst); + LocalDeps[InstDependingOnRemInst] = NewDirtyVal; // Make sure to remember that new things depend on NewDepInst. - ReverseDepsToAdd.push_back(std::make_pair(NewDepInst, + assert(NewDirtyVal.getInst() && "There is no way something else can have " + "a local dep on this if it is a terminator!"); + ReverseDepsToAdd.push_back(std::make_pair(NewDirtyVal.getInst(), InstDependingOnRemInst)); } @@ -701,12 +707,10 @@ void MemoryDependenceAnalysis::removeInstruction(Instruction *RemInst) { if (DI->second.getInst() != RemInst) continue; // Convert to a dirty entry for the subsequent instruction. - Instruction *NextI = 0; - if (!RemInst->isTerminator()) { - NextI = ++BasicBlock::iterator(RemInst); + DI->second = NewDirtyVal; + + if (Instruction *NextI = NewDirtyVal.getInst()) ReverseDepsToAdd.push_back(std::make_pair(NextI, *I)); - } - DI->second = MemDepResult::getDirty(NextI); } } @@ -737,10 +741,6 @@ void MemoryDependenceAnalysis::removeInstruction(Instruction *RemInst) { NonLocalDepInfo &NLPDI = NonLocalPointerDeps[P]; - MemDepResult NewDirtyVal; - if (!RemInst->isTerminator()) - NewDirtyVal = MemDepResult::getDirty(++BasicBlock::iterator(RemInst)); - // Update any entries for RemInst to use the instruction after it. for (NonLocalDepInfo::iterator DI = NLPDI.begin(), DE = NLPDI.end(); DI != DE; ++DI) { |