improve DSE when TargetData is not around, based on work by
authorChris Lattner <sabre@nondot.org>
Wed, 4 Nov 2009 23:20:12 +0000 (23:20 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 4 Nov 2009 23:20:12 +0000 (23:20 +0000)
Hans Wennborg!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@86067 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/DeadStoreElimination.cpp
lib/Transforms/Scalar/JumpThreading.cpp
test/Transforms/DeadStoreElimination/no-targetdata.ll [new file with mode: 0644]

index 60b12fd8679ed92a2b172a188f5a398ae08f044e..90436f40661c97ea9172cb271bff66b8c2d47058 100644 (file)
@@ -78,6 +78,21 @@ static RegisterPass<DSE> X("dse", "Dead Store Elimination");
 
 FunctionPass *llvm::createDeadStoreEliminationPass() { return new DSE(); }
 
+/// isValueAtLeastAsBigAs - Return true if V1 is greater than or equal to the
+/// stored size of V2.  This returns false if we don't know.
+///
+static bool isValueAtLeastAsBigAs(Value *V1, Value *V2, const TargetData *TD) {
+  const Type *V1Ty = V1->getType(), *V2Ty = V2->getType();
+  
+  // Exactly the same type, must have exactly the same size.
+  if (V1Ty == V2Ty) return true;
+  
+  // If we don't have target data, we don't know.
+  if (TD == 0) return false;
+  
+  return TD->getTypeStoreSize(V1Ty) >= TD->getTypeStoreSize(V2Ty);
+}
+
 bool DSE::runOnBasicBlock(BasicBlock &BB) {
   MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>();
   TD = getAnalysisIfAvailable<TargetData>();
@@ -118,9 +133,7 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) {
     // If this is a store-store dependence, then the previous store is dead so
     // long as this store is at least as big as it.
     if (StoreInst *DepStore = dyn_cast<StoreInst>(InstDep.getInst()))
-      if (TD &&
-          TD->getTypeStoreSize(DepStore->getOperand(0)->getType()) <=
-          TD->getTypeStoreSize(SI->getOperand(0)->getType())) {
+      if (isValueAtLeastAsBigAs(SI->getOperand(0), DepStore->getOperand(0),TD)){
         // Delete the store and now-dead instructions that feed it.
         DeleteDeadInstruction(DepStore);
         NumFastStores++;
index 8b11edd891fd57f6e22cfc1518e1ab7141fad105..10c9ec6d5a4cfee8841a822386bfb65c445f6932 100644 (file)
@@ -68,9 +68,6 @@ namespace {
     static char ID; // Pass identification
     JumpThreading() : FunctionPass(&ID) {}
 
-    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
-    }
-
     bool runOnFunction(Function &F);
     void FindLoopHeaders(Function &F);
     
diff --git a/test/Transforms/DeadStoreElimination/no-targetdata.ll b/test/Transforms/DeadStoreElimination/no-targetdata.ll
new file mode 100644 (file)
index 0000000..42c4e1b
--- /dev/null
@@ -0,0 +1,15 @@
+; RUN: opt %s -dse -S | FileCheck %s
+
+declare void @test1f()
+
+define void @test1(i32* noalias %p) {
+       store i32 1, i32* %p;
+       call void @test1f()
+       store i32 2, i32 *%p
+       ret void
+; CHECK: define void @test1
+; CHECK-NOT: store
+; CHECK-NEXT: call void
+; CHECK-NEXT: store i32 2
+; CHECK-NEXT: ret void
+}
\ No newline at end of file