| Index: lib/Transforms/Scalar/CodeGenPrepare.cpp
|
| diff --git a/lib/Transforms/Scalar/CodeGenPrepare.cpp b/lib/Transforms/Scalar/CodeGenPrepare.cpp
|
| index f0d29c88a82ea91613e7d620b73a9010b6abeb8f..615c5174492616885ecc75d5f5b9634707f67e36 100644
|
| --- a/lib/Transforms/Scalar/CodeGenPrepare.cpp
|
| +++ b/lib/Transforms/Scalar/CodeGenPrepare.cpp
|
| @@ -18,7 +18,6 @@
|
| #include "llvm/ADT/DenseMap.h"
|
| #include "llvm/ADT/SmallSet.h"
|
| #include "llvm/ADT/Statistic.h"
|
| -#include "llvm/ADT/ValueMap.h"
|
| #include "llvm/Analysis/DominatorInternals.h"
|
| #include "llvm/Analysis/Dominators.h"
|
| #include "llvm/Analysis/InstructionSimplify.h"
|
| @@ -89,7 +88,7 @@ namespace {
|
| /// Keeps track of non-local addresses that have been sunk into a block.
|
| /// This allows us to avoid inserting duplicate code for blocks with
|
| /// multiple load/stores of the same address.
|
| - ValueMap<Value*, Value*> SunkAddrs;
|
| + DenseMap<Value*, Value*> SunkAddrs;
|
|
|
| /// ModifiedDT - If CFG is modified in anyway, dominator tree may need to
|
| /// be updated.
|
| @@ -1654,6 +1653,10 @@ bool CodeGenPrepare::OptimizeMemoryInst(Instruction *MemoryInst, Value *Addr,
|
| // start of the block.
|
| CurInstIterator = BB->begin();
|
| SunkAddrs.clear();
|
| + } else {
|
| + // 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;
|
| }
|
| }
|
| ++NumMemoryInsts;
|
|
|