mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-23 04:28:30 +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:
parent
4e86da71b3
commit
536d31b5b3
@ -714,8 +714,12 @@ bool CodeGenPrepare::OptimizeMemoryInst(Instruction *MemoryInst, Value *Addr,
|
||||
|
||||
MemoryInst->replaceUsesOfWith(Addr, SunkAddr);
|
||||
|
||||
if (Addr->use_empty())
|
||||
if (Addr->use_empty()) {
|
||||
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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user