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
This commit is contained in:
Owen Anderson
2007-11-01 05:29:16 +00:00
parent b5c91641b5
commit 7ebba512c3
2 changed files with 13 additions and 5 deletions

View File

@@ -63,14 +63,18 @@ namespace {
/// from allocas, it is safe to ignore GEP indices, since /// from allocas, it is safe to ignore GEP indices, since
/// either the store will be in the alloca, and thus dead, /// either the store will be in the alloca, and thus dead,
/// or beyond the end of the alloca, and thus undefined. /// 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()) && assert(isa<PointerType>(v->getType()) &&
"Translating a non-pointer type?"); "Translating a non-pointer type?");
while (true) { while (true) {
if (BitCastInst* C = dyn_cast<BitCastInst>(v)) if (BitCastInst* C = dyn_cast<BitCastInst>(v))
v = C->getOperand(0); v = C->getOperand(0);
else if (GetElementPtrInst* G = dyn_cast<GetElementPtrInst>(v)) else if (GetElementPtrInst* G = dyn_cast<GetElementPtrInst>(v))
v = G->getOperand(0); if (!zeroGepsOnly || G->hasAllZeroIndices()) {
v = G->getOperand(0);
} else {
break;
}
else else
break; break;
} }
@@ -95,7 +99,8 @@ FunctionPass *llvm::createDeadStoreEliminationPass() { return new DSE(); }
bool DSE::runOnBasicBlock(BasicBlock &BB) { bool DSE::runOnBasicBlock(BasicBlock &BB) {
MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>(); MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>();
TargetData &TD = getAnalysis<TargetData>();
// Record the last-seen store to this pointer // Record the last-seen store to this pointer
DenseMap<Value*, StoreInst*> lastStore; DenseMap<Value*, StoreInst*> lastStore;
// Record instructions possibly made dead by deleting a store // Record instructions possibly made dead by deleting a store
@@ -119,6 +124,7 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) {
} else } else
pointer = cast<FreeInst>(BBI)->getPointerOperand(); pointer = cast<FreeInst>(BBI)->getPointerOperand();
TranslatePointerBitCasts(pointer, true);
StoreInst*& last = lastStore[pointer]; StoreInst*& last = lastStore[pointer];
bool deletedStore = false; bool deletedStore = false;
@@ -130,7 +136,9 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) {
while (dep != MemoryDependenceAnalysis::None && while (dep != MemoryDependenceAnalysis::None &&
dep != MemoryDependenceAnalysis::NonLocal && dep != MemoryDependenceAnalysis::NonLocal &&
isa<StoreInst>(dep)) { 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); dep = MD.getDependency(BBI, dep);
continue; continue;
} }

View File

@@ -1,5 +1,5 @@
; RUN: llvm-upgrade < %s | llvm-as | opt -dse | llvm-dis | \ ; RUN: llvm-upgrade < %s | llvm-as | opt -dse | llvm-dis | \
; RUN: not grep {store sbyte} ; RUN: not grep {store i8}
; Ensure that the dead store is deleted in this case. It is wholely ; Ensure that the dead store is deleted in this case. It is wholely
; overwritten by the second store. ; overwritten by the second store.
int %test() { int %test() {