aboutsummaryrefslogtreecommitdiff
path: root/lib/Transforms
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-04-25 04:12:29 +0000
committerChris Lattner <sabre@nondot.org>2008-04-25 04:12:29 +0000
commiteede65ce6cb29c8f3a701be8606e95c9a213efff (patch)
tree7ca4d995844361522f706b262efca29ef027329a /lib/Transforms
parent877ee973e2d6ade85e38babbd303d96347c7dc8e (diff)
Don't infininitely thread branches when a threaded edge
goes back to the block, e.g.: Threading edge through bool from 'bb37.us.thread3829' to 'bb37.us' with cost: 1, across block: bb37.us: ; preds = %bb37.us.thread3829, %bb37.us, %bb33 %D1361.1.us = phi i32 [ %tmp36, %bb33 ], [ %D1361.1.us, %bb37.us ], [ 0, %bb37.us.thread3829 ] ; <i32> [#uses=2] %tmp39.us = icmp eq i32 %D1361.1.us, 0 ; <i1> [#uses=1] br i1 %tmp39.us, label %bb37.us, label %bb42.us git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50251 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r--lib/Transforms/Scalar/JumpThreading.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/lib/Transforms/Scalar/JumpThreading.cpp b/lib/Transforms/Scalar/JumpThreading.cpp
index 92e40e66d4..be94025404 100644
--- a/lib/Transforms/Scalar/JumpThreading.cpp
+++ b/lib/Transforms/Scalar/JumpThreading.cpp
@@ -250,6 +250,13 @@ bool JumpThreading::ProcessJumpOnPHI(PHINode *PN) {
SuccBB = SI->getSuccessor(SI->findCaseValue(PredCst));
}
+ // If threading to the same block as we come from, we would infinite loop.
+ if (SuccBB == BB) {
+ DOUT << " Not threading BB '" << BB->getNameStart()
+ << "' - would thread to self!\n";
+ return false;
+ }
+
// And finally, do it!
DOUT << " Threading edge from '" << PredBB->getNameStart() << "' to '"
<< SuccBB->getNameStart() << "' with cost: " << JumpThreadCost
@@ -319,6 +326,13 @@ bool JumpThreading::ProcessBranchOnLogical(Value *V, BasicBlock *BB,
// 'true' block.
BasicBlock *SuccBB = BB->getTerminator()->getSuccessor(isAnd);
+ // If threading to the same block as we come from, we would infinite loop.
+ if (SuccBB == BB) {
+ DOUT << " Not threading BB '" << BB->getNameStart()
+ << "' - would thread to self!\n";
+ return false;
+ }
+
// And finally, do it!
DOUT << " Threading edge through bool from '" << PredBB->getNameStart()
<< "' to '" << SuccBB->getNameStart() << "' with cost: "
@@ -390,6 +404,14 @@ bool JumpThreading::ProcessBranchOnCompare(CmpInst *Cmp, BasicBlock *BB) {
// Next, get our successor.
BasicBlock *SuccBB = BB->getTerminator()->getSuccessor(!TrueDirection);
+ // If threading to the same block as we come from, we would infinite loop.
+ if (SuccBB == BB) {
+ DOUT << " Not threading BB '" << BB->getNameStart()
+ << "' - would thread to self!\n";
+ return false;
+ }
+
+
// And finally, do it!
DOUT << " Threading edge through bool from '" << PredBB->getNameStart()
<< "' to '" << SuccBB->getNameStart() << "' with cost: "