diff options
author | Bill Wendling <isanbard@gmail.com> | 2012-04-18 06:00:09 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2012-04-18 06:00:09 +0000 |
commit | 135604129646650ef9abcd12a38b2d8976d3493c (patch) | |
tree | d3bd46a54927463f069518ee7ade75df1b1c74e3 /lib | |
parent | a963c81819bed30d54174cdaf5a7e58696838d5a (diff) | |
download | external_llvm-135604129646650ef9abcd12a38b2d8976d3493c.zip external_llvm-135604129646650ef9abcd12a38b2d8976d3493c.tar.gz external_llvm-135604129646650ef9abcd12a38b2d8976d3493c.tar.bz2 |
Use a heavy hammer to fix PR12573.
If the loop contains invoke instructions, whose unwind edge escapes the loop,
then don't try to unswitch the loop. Doing so may cause the unwind edge to be
split, which not only is non-trivial but doesn't preserve loop simplify
information.
Fixes PR12573
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@154987 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Transforms/Scalar/LoopUnswitch.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/lib/Transforms/Scalar/LoopUnswitch.cpp b/lib/Transforms/Scalar/LoopUnswitch.cpp index ee23268..00ecc74 100644 --- a/lib/Transforms/Scalar/LoopUnswitch.cpp +++ b/lib/Transforms/Scalar/LoopUnswitch.cpp @@ -409,6 +409,15 @@ bool LoopUnswitch::processCurrentLoop() { if (!currentLoop->isSafeToClone()) return false; + // Loops with invokes, whose unwind edge escapes the loop, cannot be + // unswitched because splitting their edges are non-trivial and don't preserve + // loop simplify information. + for (Loop::block_iterator I = currentLoop->block_begin(), + E = currentLoop->block_end(); I != E; ++I) + if (const InvokeInst *II = dyn_cast<InvokeInst>((*I)->getTerminator())) + if (!currentLoop->contains(II->getUnwindDest())) + return false; + // Without dedicated exits, splitting the exit edge may fail. if (!currentLoop->hasDedicatedExits()) return false; |