when folding duplicate conditions, delete the
authorChris Lattner <sabre@nondot.org>
Sun, 11 Oct 2009 18:39:58 +0000 (18:39 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 11 Oct 2009 18:39:58 +0000 (18:39 +0000)
now-probably-dead instruction tree feeding it.

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

lib/Transforms/Scalar/JumpThreading.cpp
test/Transforms/JumpThreading/basic.ll
test/Transforms/JumpThreading/dup-cond.ll [deleted file]

index 210d6ef5a22625d82b6c6a487260a61ae266cbcb..8b11edd891fd57f6e22cfc1518e1ab7141fad105 100644 (file)
@@ -450,9 +450,11 @@ bool JumpThreading::ProcessBranchOnDuplicateCond(BasicBlock *PredBB,
           << "' folding condition to '" << BranchDir << "': "
           << *BB->getTerminator() << '\n');
     ++NumFolds;
+    Value *OldCond = DestBI->getCondition();
     DestBI->setCondition(ConstantInt::get(Type::getInt1Ty(BB->getContext()),
                                           BranchDir));
     ConstantFoldTerminator(BB);
+    RecursivelyDeleteTriviallyDeadInstructions(OldCond);
     return true;
   }
  
index 50433db152da376e243ba41fd75ceb7b55e8b9b0..3d936b8f30fc010f35e4bcb8e4fcc1ee35a79a39 100644 (file)
@@ -139,3 +139,36 @@ F2:
        ret i32 %B
 }
 
+
+;; Lexically duplicated conditionals should be threaded.
+
+
+define i32 @test6(i32 %A) {
+; CHECK: @test6
+       %tmp455 = icmp eq i32 %A, 42
+       br i1 %tmp455, label %BB1, label %BB2
+        
+BB2:
+; CHECK: call i32 @f1()
+; CHECK-NEXT: call void @f3()
+; CHECK-NEXT: ret i32 4
+       call i32 @f1()
+       br label %BB1
+        
+
+BB1:
+       %tmp459 = icmp eq i32 %A, 42
+       br i1 %tmp459, label %BB3, label %BB4
+
+BB3:
+       call i32 @f2()
+        ret i32 3
+
+BB4:
+       call void @f3()
+       ret i32 4
+}
+
+
+
+
diff --git a/test/Transforms/JumpThreading/dup-cond.ll b/test/Transforms/JumpThreading/dup-cond.ll
deleted file mode 100644 (file)
index 0d14c8a..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-; RUN: opt < %s -jump-threading -die -S | grep icmp | count 1
-
-declare void @f1()
-declare void @f2()
-declare void @f3()
-
-define i32 @test(i32 %A) {
-       %tmp455 = icmp eq i32 %A, 42
-       br i1 %tmp455, label %BB1, label %BB2
-        
-BB2:
-       call void @f1()
-       br label %BB1
-        
-
-BB1:
-       %tmp459 = icmp eq i32 %A, 42
-       br i1 %tmp459, label %BB3, label %BB4
-
-BB3:
-       call void @f2()
-        ret i32 3
-
-BB4:
-       call void @f3()
-       ret i32 4
-}
-
-
-