diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Analysis/LoopInfo.cpp | 19 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LoopUnswitch.cpp | 5 |
2 files changed, 8 insertions, 16 deletions
diff --git a/llvm/lib/Analysis/LoopInfo.cpp b/llvm/lib/Analysis/LoopInfo.cpp index 277bd0dbb0f..2ac1ae2e5cf 100644 --- a/llvm/lib/Analysis/LoopInfo.cpp +++ b/llvm/lib/Analysis/LoopInfo.cpp @@ -195,23 +195,10 @@ bool Loop::isSafeToClone() const { if (isa<IndirectBrInst>(BB->getTerminator())) return false; - if (const InvokeInst *II = dyn_cast<InvokeInst>(BB->getTerminator())) { - if (II->cannotDuplicate()) - return false; - // Return false if any loop blocks contain invokes to EH-pads other than - // landingpads; we don't know how to split those edges yet. - auto *FirstNonPHI = II->getUnwindDest()->getFirstNonPHI(); - if (FirstNonPHI->isEHPad() && !isa<LandingPadInst>(FirstNonPHI)) - return false; - } - for (Instruction &I : *BB) { - if (const CallInst *CI = dyn_cast<CallInst>(&I)) { - if (CI->cannotDuplicate()) + for (Instruction &I : *BB) + if (auto CS = CallSite(&I)) + if (CS.cannotDuplicate()) return false; - } - if (I.getType()->isTokenTy() && I.isUsedOutsideOfBlock(BB)) - return false; - } } return true; } diff --git a/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp b/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp index 310f41ed7df..0e861b638d6 100644 --- a/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp +++ b/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp @@ -500,6 +500,11 @@ bool LoopUnswitch::processCurrentLoop() { if (!CS) continue; if (CS.hasFnAttr(Attribute::Convergent)) return false; + // Return false if any loop blocks contain invokes whose predecessor edges + // we cannot split. + if (auto *II = dyn_cast<InvokeInst>(&I)) + if (!II->getUnwindDest()->canSplitPredecessors()) + return false; } } |

