diff options
| author | Dale Johannesen <dalej@apple.com> | 2010-03-31 20:37:15 +0000 |
|---|---|---|
| committer | Dale Johannesen <dalej@apple.com> | 2010-03-31 20:37:15 +0000 |
| commit | b67a6e662040c9dac7e2c2676ab1487991784fa5 (patch) | |
| tree | bbf1346544bd43c2a1b06e6eca137fd567bdf941 /llvm/lib/Transforms | |
| parent | 6882a5eea1ebf5bc6e495254a3bc24d17beb464e (diff) | |
| download | bcm5719-llvm-b67a6e662040c9dac7e2c2676ab1487991784fa5.tar.gz bcm5719-llvm-b67a6e662040c9dac7e2c2676ab1487991784fa5.zip | |
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.
llvm-svn: 100044
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp b/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp index 6dd02d28729..93e9bfbe35a 100644 --- a/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp +++ b/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp @@ -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; } |

