diff --git a/llvm/lib/Transforms/Utils/LoopRotationUtils.cpp b/llvm/lib/Transforms/Utils/LoopRotationUtils.cpp --- a/llvm/lib/Transforms/Utils/LoopRotationUtils.cpp +++ b/llvm/lib/Transforms/Utils/LoopRotationUtils.cpp @@ -462,9 +462,8 @@ for (BasicBlock *ExitPred : ExitPreds) { // We only need to split loop exit edges. Loop *PredLoop = LI->getLoopFor(ExitPred); - if (!PredLoop || PredLoop->contains(Exit)) - continue; - if (isa(ExitPred->getTerminator())) + if (!PredLoop || PredLoop->contains(Exit) || + ExitPred->getTerminator()->isIndirectTerminator()) continue; SplitLatchEdge |= L->getLoopLatch() == ExitPred; BasicBlock *ExitSplit = SplitCriticalEdge( diff --git a/llvm/test/Transforms/LoopRotate/callbr.ll b/llvm/test/Transforms/LoopRotate/callbr.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/LoopRotate/callbr.ll @@ -0,0 +1,84 @@ +; RUN: opt < %s -S -loop-rotate -o - -verify-loop-info -verify-dom-info | FileCheck %s +; RUN: opt < %s -S -loop-rotate -o - -verify-loop-info -verify-dom-info -enable-mssa-loop-dependency=true | FileCheck %s + +@d = external dso_local local_unnamed_addr global i64, align 8 +@f = external dso_local local_unnamed_addr global i32, align 4 +@g = external dso_local local_unnamed_addr global i32, align 4 +@i = external dso_local local_unnamed_addr global i32, align 4 +@h = external dso_local local_unnamed_addr global i32, align 4 + +define dso_local i32 @o() #0 { + %1 = alloca [1 x i32], align 4 + %2 = load i8*, i8** bitcast (i64* @d to i8**), align 8, !tbaa !1 + br label %3 + +;