mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-08 03:18:19 +00:00
Fix a nasty dangling-pointer heisenbug that could
generate wrong code pretty much anywhere AFAICT. A case that hits the bug reproducibly is impossible, but the situation was like this: Addr = ... Store -> Addr Addr2 = GEP , 0, 0 Store -> Addr2 Handling the first store, the code changed replaced Addr with a sunkaddr and deleted Addr, but not its table entry. Code in OptimizedBlock replaced Addr2 with a bitcast; if that happened to reuse the memory of Addr, the old table entry was erroneously found when handling the second store. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@100044 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -714,8 +714,12 @@ bool CodeGenPrepare::OptimizeMemoryInst(Instruction *MemoryInst, Value *Addr,
|
|||||||
|
|
||||||
MemoryInst->replaceUsesOfWith(Addr, SunkAddr);
|
MemoryInst->replaceUsesOfWith(Addr, SunkAddr);
|
||||||
|
|
||||||
if (Addr->use_empty())
|
if (Addr->use_empty()) {
|
||||||
RecursivelyDeleteTriviallyDeadInstructions(Addr);
|
RecursivelyDeleteTriviallyDeadInstructions(Addr);
|
||||||
|
// This address is now available for reassignment, so erase the table entry;
|
||||||
|
// we don't want to match some completely different instruction.
|
||||||
|
SunkAddrs[Addr] = 0;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user