diff options
author | Owen Anderson <resistor@mac.com> | 2007-11-01 05:29:16 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2007-11-01 05:29:16 +0000 |
commit | 7ebba512c3417f0eb52ab68b39831e3a85105d66 (patch) | |
tree | 96437563e3c87c5066ebf3680d5753ae3936d54f /lib/Transforms | |
parent | b5c91641b554c43b859e1b75679797c5356045b6 (diff) |
Fix test/Transforms/DeadStoreElimination/PartialStore.ll, which had been
silently failing because of an incorrect run line for some time.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@43605 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r-- | lib/Transforms/Scalar/DeadStoreElimination.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/lib/Transforms/Scalar/DeadStoreElimination.cpp b/lib/Transforms/Scalar/DeadStoreElimination.cpp index 1e5381db9a..2e1d9ade0a 100644 --- a/lib/Transforms/Scalar/DeadStoreElimination.cpp +++ b/lib/Transforms/Scalar/DeadStoreElimination.cpp @@ -63,14 +63,18 @@ namespace { /// from allocas, it is safe to ignore GEP indices, since /// either the store will be in the alloca, and thus dead, /// or beyond the end of the alloca, and thus undefined. - void TranslatePointerBitCasts(Value*& v) { + void TranslatePointerBitCasts(Value*& v, bool zeroGepsOnly = false) { assert(isa<PointerType>(v->getType()) && "Translating a non-pointer type?"); while (true) { if (BitCastInst* C = dyn_cast<BitCastInst>(v)) v = C->getOperand(0); else if (GetElementPtrInst* G = dyn_cast<GetElementPtrInst>(v)) - v = G->getOperand(0); + if (!zeroGepsOnly || G->hasAllZeroIndices()) { + v = G->getOperand(0); + } else { + break; + } else break; } @@ -95,7 +99,8 @@ FunctionPass *llvm::createDeadStoreEliminationPass() { return new DSE(); } bool DSE::runOnBasicBlock(BasicBlock &BB) { MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>(); - + TargetData &TD = getAnalysis<TargetData>(); + // Record the last-seen store to this pointer DenseMap<Value*, StoreInst*> lastStore; // Record instructions possibly made dead by deleting a store @@ -119,6 +124,7 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) { } else pointer = cast<FreeInst>(BBI)->getPointerOperand(); + TranslatePointerBitCasts(pointer, true); StoreInst*& last = lastStore[pointer]; bool deletedStore = false; @@ -130,7 +136,9 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) { while (dep != MemoryDependenceAnalysis::None && dep != MemoryDependenceAnalysis::NonLocal && isa<StoreInst>(dep)) { - if (dep != last) { + if (dep != last || + TD.getTypeSize(last->getOperand(0)->getType()) > + TD.getTypeSize(BBI->getOperand(0)->getType())) { dep = MD.getDependency(BBI, dep); continue; } |