Index: llvm/lib/Analysis/LoopInfo.cpp =================================================================== --- llvm/lib/Analysis/LoopInfo.cpp +++ llvm/lib/Analysis/LoopInfo.cpp @@ -210,25 +210,17 @@ } else { // Go through each predecessor of the loop header and check the // terminator for the metadata. - BasicBlock *H = getHeader(); - for (BasicBlock *BB : this->blocks()) { - TerminatorInst *TI = BB->getTerminator(); - MDNode *MD = nullptr; + for (BasicBlock *BB : predecessors(getHeader())) { + if (!this->contains(BB)) + continue; - // Check if this terminator branches to the loop header. - for (BasicBlock *Successor : TI->successors()) { - if (Successor == H) { - MD = TI->getMetadata(LLVMContext::MD_loop); - break; - } + TerminatorInst *TI = BB->getTerminator(); + if (MDNode *MD = TI->getMetadata(LLVMContext::MD_loop)) { + if (!LoopID) + LoopID = MD; + else if (MD != LoopID) // Multiple MD_loop found => corrupt metadata. + return nullptr; } - if (!MD) - return nullptr; - - if (!LoopID) - LoopID = MD; - else if (MD != LoopID) - return nullptr; } } if (!LoopID || LoopID->getNumOperands() == 0 || @@ -247,13 +239,13 @@ return; } - BasicBlock *H = getHeader(); - for (BasicBlock *BB : this->blocks()) { + // Set metadata on all the back-edges. + for (BasicBlock *BB : predecessors(getHeader())) { + if (!this->contains(BB)) + continue; + TerminatorInst *TI = BB->getTerminator(); - for (BasicBlock *Successor : TI->successors()) { - if (Successor == H) - TI->setMetadata(LLVMContext::MD_loop, LoopID); - } + TI->setMetadata(LLVMContext::MD_loop, LoopID); } }