diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Transforms/Scalar/LoopUnswitch.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp b/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp index 60910bab090..6d99caf1dff 100644 --- a/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp +++ b/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp @@ -500,6 +500,20 @@ bool LoopUnswitch::processCurrentLoop() { return true; } + // Do not unswitch loops containing convergent operations, as we might be + // making them control dependent on the unswitch value when they were not + // before. + // FIXME: This could be refined to only bail if the convergent operation is + // not already control-dependent on the unswitch value. + for (const auto BB : currentLoop->blocks()) { + for (const auto &I : *BB) { + const auto CI = dyn_cast<CallInst>(&I); + if (!CI) continue; + if (CI->isConvergent()) + return false; + } + } + // Do not do non-trivial unswitch while optimizing for size. // FIXME: Use Function::optForSize(). if (OptimizeForSize || |