mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-12 14:17:59 +00:00
Fix an obscure read-after-free bug that Duncan found.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46738 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
131d5c9f4a
commit
a8701a6c62
@ -463,15 +463,17 @@ void MemoryDependenceAnalysis::removeInstruction(Instruction* rem) {
|
||||
reverseDep[depGraphLocal[rem].first].erase(rem);
|
||||
|
||||
if (depGraphEntry->second.first != NonLocal &&
|
||||
depGraphEntry->second.first != None &&
|
||||
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 &&
|
||||
} else if ( (depGraphEntry->second.first == NonLocal ||
|
||||
depGraphEntry->second.first == None ) &&
|
||||
depGraphEntry->second.second ) {
|
||||
// If we have a confirmed non-local flag, use it
|
||||
newDep = NonLocal;
|
||||
newDep = depGraphEntry->second.first;
|
||||
} else {
|
||||
// Otherwise, use the immediate successor of rem
|
||||
// NOTE: This is because, when getDependence is called, it will first
|
||||
@ -480,14 +482,22 @@ void MemoryDependenceAnalysis::removeInstruction(Instruction* rem) {
|
||||
RI++;
|
||||
newDep = RI;
|
||||
}
|
||||
|
||||
SmallPtrSet<Instruction*, 4>& set = reverseDep[rem];
|
||||
for (SmallPtrSet<Instruction*, 4>::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(newDep, !newDep);
|
||||
}
|
||||
} 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;
|
||||
}
|
||||
|
||||
SmallPtrSet<Instruction*, 4>& set = reverseDep[rem];
|
||||
for (SmallPtrSet<Instruction*, 4>::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(newDep, (newDep == NonLocal ||
|
||||
newDep == None));
|
||||
}
|
||||
|
||||
depGraphLocal.erase(rem);
|
||||
|
Loading…
Reference in New Issue
Block a user