Index: lib/Transforms/Scalar/LoopRotation.cpp =================================================================== --- lib/Transforms/Scalar/LoopRotation.cpp +++ lib/Transforms/Scalar/LoopRotation.cpp @@ -485,10 +485,22 @@ DomTreeNode *Node = HeaderChildren[I]; BasicBlock *BB = Node->getBlock(); - pred_iterator PI = pred_begin(BB); - BasicBlock *NearestDom = *PI; - for (pred_iterator PE = pred_end(BB); PI != PE; ++PI) - NearestDom = DT->findNearestCommonDominator(NearestDom, *PI); + BasicBlock *NearestDom = nullptr; + for (BasicBlock *Pred : predecessors(BB)) { + // Consider only reachable basic blocks. + if (!DT->getNode(Pred)) + continue; + + if (!NearestDom) { + NearestDom = Pred; + continue; + } + + NearestDom = DT->findNearestCommonDominator(NearestDom, Pred); + assert(NearestDom && "No NearestCommonDominator found"); + } + + assert(NearestDom && "Nearest dominator not found"); // Remember if this changes the DomTree. if (Node->getIDom()->getBlock() != NearestDom) { Index: test/Transforms/LoopRotate/pr33701.ll =================================================================== --- /dev/null +++ test/Transforms/LoopRotate/pr33701.ll @@ -0,0 +1,27 @@ +; RUN: opt < %s -loop-rotate -verify-dom-info -verify-loop-info -disable-output + +define void @func() { +bb0: + br label %bb1 + +bb1: ; preds = %bb4, %bb0 + %0 = phi i16 [ %2, %bb4 ], [ 0, %bb0 ] + %1 = icmp sle i16 %0, 2 + br i1 %1, label %bb2, label %bb5 + +bb2: ; preds = %bb1 + br i1 undef, label %bb6, label %bb4 + +bb3: ; No predecessors! + br label %bb6 + +bb4: ; preds = %bb2 + %2 = add i16 undef, 1 + br label %bb1 + +bb5: ; preds = %bb1 + br label %bb6 + +bb6: ; preds = %bb5, %bb3, %bb2 + unreachable +}