Meinersbur created this revision. Meinersbur added reviewers: hfinkel, jdoerfert.
getLoopID has different control flow for two cases: If there is a single loop latch and for any other number of loop latches (0 and more than one). The latter case should return the same result if there is a single latch. We can save an iteration over the loop's basic blocks (which is what getLoopLatch does) by handling both cases with the same code. Repository: rC Clang https://reviews.llvm.org/D52118 Files: lib/Analysis/LoopInfo.cpp Index: lib/Analysis/LoopInfo.cpp =================================================================== --- lib/Analysis/LoopInfo.cpp +++ lib/Analysis/LoopInfo.cpp @@ -213,26 +213,21 @@ MDNode *Loop::getLoopID() const { MDNode *LoopID = nullptr; - if (BasicBlock *Latch = getLoopLatch()) { - LoopID = Latch->getTerminator()->getMetadata(LLVMContext::MD_loop); - } else { - assert(!getLoopLatch() && - "The loop should have no single latch at this point"); - // Go through the latch blocks and check the terminator for the metadata. - SmallVector<BasicBlock *, 4> LatchesBlocks; - getLoopLatches(LatchesBlocks); - for (BasicBlock *BB : LatchesBlocks) { - TerminatorInst *TI = BB->getTerminator(); - MDNode *MD = TI->getMetadata(LLVMContext::MD_loop); - - if (!MD) - return nullptr; - - if (!LoopID) - LoopID = MD; - else if (MD != LoopID) - return nullptr; - } + + // Go through the latch blocks and check the terminator for the metadata. + SmallVector<BasicBlock *, 4> LatchesBlocks; + getLoopLatches(LatchesBlocks); + for (BasicBlock *BB : LatchesBlocks) { + TerminatorInst *TI = BB->getTerminator(); + MDNode *MD = TI->getMetadata(LLVMContext::MD_loop); + + if (!MD) + return nullptr; + + if (!LoopID) + LoopID = MD; + else if (MD != LoopID) + return nullptr; } if (!LoopID || LoopID->getNumOperands() == 0 || LoopID->getOperand(0) != LoopID)
Index: lib/Analysis/LoopInfo.cpp =================================================================== --- lib/Analysis/LoopInfo.cpp +++ lib/Analysis/LoopInfo.cpp @@ -213,26 +213,21 @@ MDNode *Loop::getLoopID() const { MDNode *LoopID = nullptr; - if (BasicBlock *Latch = getLoopLatch()) { - LoopID = Latch->getTerminator()->getMetadata(LLVMContext::MD_loop); - } else { - assert(!getLoopLatch() && - "The loop should have no single latch at this point"); - // Go through the latch blocks and check the terminator for the metadata. - SmallVector<BasicBlock *, 4> LatchesBlocks; - getLoopLatches(LatchesBlocks); - for (BasicBlock *BB : LatchesBlocks) { - TerminatorInst *TI = BB->getTerminator(); - MDNode *MD = TI->getMetadata(LLVMContext::MD_loop); - - if (!MD) - return nullptr; - - if (!LoopID) - LoopID = MD; - else if (MD != LoopID) - return nullptr; - } + + // Go through the latch blocks and check the terminator for the metadata. + SmallVector<BasicBlock *, 4> LatchesBlocks; + getLoopLatches(LatchesBlocks); + for (BasicBlock *BB : LatchesBlocks) { + TerminatorInst *TI = BB->getTerminator(); + MDNode *MD = TI->getMetadata(LLVMContext::MD_loop); + + if (!MD) + return nullptr; + + if (!LoopID) + LoopID = MD; + else if (MD != LoopID) + return nullptr; } if (!LoopID || LoopID->getNumOperands() == 0 || LoopID->getOperand(0) != LoopID)
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits