diff options
author | Dan Gohman <gohman@apple.com> | 2009-11-20 20:51:18 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2009-11-20 20:51:18 +0000 |
commit | fbffe635282804ad2e30248368ddc2ec9dc65b6a (patch) | |
tree | 45a8941be29ffbefe8887e9e9da52c1bc977512b /llvm/lib/Transforms/Utils/LoopSimplify.cpp | |
parent | d15302afa04f5abaad8fd36217d10de9dd3d7a85 (diff) | |
download | bcm5719-llvm-fbffe635282804ad2e30248368ddc2ec9dc65b6a.tar.gz bcm5719-llvm-fbffe635282804ad2e30248368ddc2ec9dc65b6a.zip |
Make Loop::getLoopLatch() work on loops which don't have preheaders, as
it may be used in contexts where preheader insertion may have failed due
to an indirectbr.
Make LoopSimplify's LoopSimplify::SeparateNestedLoop properly fail in
the case that it would require splitting an indirectbr edge.
These fix PR5502.
llvm-svn: 89484
Diffstat (limited to 'llvm/lib/Transforms/Utils/LoopSimplify.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/LoopSimplify.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Utils/LoopSimplify.cpp b/llvm/lib/Transforms/Utils/LoopSimplify.cpp index 44a2c1f8518..690972dc558 100644 --- a/llvm/lib/Transforms/Utils/LoopSimplify.cpp +++ b/llvm/lib/Transforms/Utils/LoopSimplify.cpp @@ -477,8 +477,13 @@ Loop *LoopSimplify::SeparateNestedLoop(Loop *L, LPPassManager &LPM) { SmallVector<BasicBlock*, 8> OuterLoopPreds; for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) if (PN->getIncomingValue(i) != PN || - !L->contains(PN->getIncomingBlock(i))) + !L->contains(PN->getIncomingBlock(i))) { + // We can't split indirectbr edges. + if (isa<IndirectBrInst>(PN->getIncomingBlock(i)->getTerminator())) + return 0; + OuterLoopPreds.push_back(PN->getIncomingBlock(i)); + } BasicBlock *Header = L->getHeader(); BasicBlock *NewBB = SplitBlockPredecessors(Header, &OuterLoopPreds[0], |