Fix GLIBCXX_DEBUG error owing to dereference of end iterator. There's

no guarantee that an instruction returned by getDependency exists in
the maps.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40647 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Greene 2007-07-31 20:01:27 +00:00
parent 054ab94bff
commit df464195fe
2 changed files with 41 additions and 29 deletions

View File

@ -32,9 +32,14 @@ class Instruction;
class MemoryDependenceAnalysis : public FunctionPass {
private:
DenseMap<Instruction*, std::pair<Instruction*, bool> > depGraphLocal;
std::multimap<Instruction*, Instruction*> reverseDep;
typedef DenseMap<Instruction*, std::pair<Instruction*, bool> >
depMapType;
depMapType depGraphLocal;
typedef std::multimap<Instruction*, Instruction*> reverseDepMapType;
reverseDepMapType reverseDep;
Instruction* getCallSiteDependency(CallSite C, Instruction* start,
bool local = true);

View File

@ -308,33 +308,40 @@ Instruction* MemoryDependenceAnalysis::getDependency(Instruction* query,
void MemoryDependenceAnalysis::removeInstruction(Instruction* rem) {
// Figure out the new dep for things that currently depend on rem
Instruction* newDep = NonLocal;
if (depGraphLocal[rem].first != NonLocal &&
depGraphLocal[rem].second) {
// If we have dep info for rem, set them to it
BasicBlock::iterator RI = depGraphLocal[rem].first;
RI++;
newDep = RI;
} else if (depGraphLocal[rem].first == NonLocal &&
depGraphLocal[rem].second ) {
// If we have a confirmed non-local flag, use it
newDep = NonLocal;
} else {
// Otherwise, use the immediate successor of rem
// NOTE: This is because, when getDependence is called, it will first check
// the immediate predecessor of what is in the cache.
BasicBlock::iterator RI = rem;
RI++;
newDep = RI;
depMapType::iterator depGraphEntry = depGraphLocal.find(rem);
// We assume here that it's not in the reverse map if it's not in
// the dep map. Checking it could be expensive, so don't do it.
if (depGraphEntry != depGraphLocal.end()) {
if (depGraphEntry->second.first != NonLocal &&
depGraphEntry->second.second) {
// If we have dep info for rem, set them to it
BasicBlock::iterator RI = depGraphEntry->second.first;
RI++;
newDep = RI;
} else if (depGraphEntry->second.first == NonLocal &&
depGraphEntry->second.second ) {
// If we have a confirmed non-local flag, use it
newDep = NonLocal;
} else {
// Otherwise, use the immediate successor of rem
// NOTE: This is because, when getDependence is called, it will first check
// the immediate predecessor of what is in the cache.
BasicBlock::iterator RI = rem;
RI++;
newDep = RI;
}
std::multimap<Instruction*, Instruction*>::iterator I = reverseDep.find(rem);
while (I != reverseDep.end() && I->first == rem) {
// Insert the new dependencies
// Mark it as unconfirmed as long as it is not the non-local flag
depGraphLocal[I->second] = std::make_pair(newDep, !newDep);
reverseDep.erase(I);
I = reverseDep.find(rem);
}
}
std::multimap<Instruction*, Instruction*>::iterator I = reverseDep.find(rem);
while (I->first == rem) {
// Insert the new dependencies
// Mark it as unconfirmed as long as it is not the non-local flag
depGraphLocal[I->second] = std::make_pair(newDep, !newDep);
reverseDep.erase(I);
I = reverseDep.find(rem);
}
getAnalysis<AliasAnalysis>().deleteValue(rem);
}