Fix test/Transforms/DeadStoreElimination/PartialStore.ll, which had been
authorOwen Anderson <resistor@mac.com>
Thu, 1 Nov 2007 05:29:16 +0000 (05:29 +0000)
committerOwen Anderson <resistor@mac.com>
Thu, 1 Nov 2007 05:29:16 +0000 (05:29 +0000)
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

lib/Transforms/Scalar/DeadStoreElimination.cpp
test/Transforms/DeadStoreElimination/PartialStore.ll

index 1e5381db9af2d4b86f3c0516331d0d697b39a43e..2e1d9ade0a728916150caef88665a073e0fece9c 100644 (file)
@@ -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;
         }
index bdc16dbcb8c24a22ec74931e033d36ce9a2cede7..14b2b0d27084457d77e208f3d88e56a8fcf30126 100644 (file)
@@ -1,5 +1,5 @@
 ; 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
 ; overwritten by the second store.
 int %test() {