aboutsummaryrefslogtreecommitdiff
path: root/lib/Transforms
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2007-11-01 05:29:16 +0000
committerOwen Anderson <resistor@mac.com>2007-11-01 05:29:16 +0000
commit7ebba512c3417f0eb52ab68b39831e3a85105d66 (patch)
tree96437563e3c87c5066ebf3680d5753ae3936d54f /lib/Transforms
parentb5c91641b554c43b859e1b75679797c5356045b6 (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.cpp16
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;
}