summaryrefslogtreecommitdiff
path: root/lib/Transforms/Utils/LoopUnroll.cpp
diff options
context:
space:
mode:
authorAndrew Trick <atrick@apple.com>2012-04-10 05:14:42 +0000
committerAndrew Trick <atrick@apple.com>2012-04-10 05:14:42 +0000
commitd9fc1ce8096f7138c60edc3a6655583bf209780e (patch)
treef03561dfeb2555e6e05b5a4ed8ce54f6c618ce96 /lib/Transforms/Utils/LoopUnroll.cpp
parent64c0748eb34272a6548980b3277aedebb6e6d265 (diff)
downloadllvm-d9fc1ce8096f7138c60edc3a6655583bf209780e.tar.gz
llvm-d9fc1ce8096f7138c60edc3a6655583bf209780e.tar.bz2
llvm-d9fc1ce8096f7138c60edc3a6655583bf209780e.tar.xz
Fix 12513: Loop unrolling breaks with indirect branches.
Take this opportunity to generalize the indirectbr bailout logic for loop transformations. CFG transformations will never get indirectbr right, and there's no point trying. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@154386 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Utils/LoopUnroll.cpp')
-rw-r--r--lib/Transforms/Utils/LoopUnroll.cpp6
1 files changed, 6 insertions, 0 deletions
diff --git a/lib/Transforms/Utils/LoopUnroll.cpp b/lib/Transforms/Utils/LoopUnroll.cpp
index 512b689501..e15497a77a 100644
--- a/lib/Transforms/Utils/LoopUnroll.cpp
+++ b/lib/Transforms/Utils/LoopUnroll.cpp
@@ -149,6 +149,12 @@ bool llvm::UnrollLoop(Loop *L, unsigned Count, unsigned TripCount,
return false;
}
+ // Loops with indirectbr cannot be cloned.
+ if (!L->isSafeToClone()) {
+ DEBUG(dbgs() << " Can't unroll; Loop body cannot be cloned.\n");
+ return false;
+ }
+
BasicBlock *Header = L->getHeader();
BranchInst *BI = dyn_cast<BranchInst>(LatchBlock->getTerminator());