summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Analysis/LoopInfo.cpp19
-rw-r--r--llvm/lib/Transforms/Scalar/LoopUnswitch.cpp5
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;
}
}
OpenPOWER on IntegriCloud