From: Chandler Carruth Date: Thu, 13 Aug 2015 09:56:20 +0000 (+0000) Subject: [LIR] Start leveraging the fundamental guarantees of a loop in X-Git-Tag: studio-1.4~72 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8ae7b81559125ba6e144dcc61c4c13ba0981e01f;p=platform%2Fupstream%2Fllvm.git [LIR] Start leveraging the fundamental guarantees of a loop in simplified form to remove redundant checks and simplify the code for popcount recognition. We don't actually need to handle all of these cases. I've left a FIXME for one in particular until I finish inspecting to make sure we don't actually *rely* on the predicate in any way. llvm-svn: 244879 --- diff --git a/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp b/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp index e3fe253..f2f37ee 100644 --- a/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp +++ b/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp @@ -830,29 +830,32 @@ bool LoopIdiomRecognize::recognizePopcount() { // non-compact loop. Therefore, recognizing popcount idiom only makes sense // in a compact loop. - // Give up if the loop has multiple blocks or multiple backedges. - if (CurLoop->getNumBackEdges() != 1 || CurLoop->getNumBlocks() != 1) + assert(CurLoop->isLoopSimplifyForm() && + "Loop passes require simplified form!"); + + // Give up if the loop has multiple blocks. + if (CurLoop->getNumBlocks() != 1) return false; - BasicBlock *LoopBody = *(CurLoop->block_begin()); - if (LoopBody->size() >= 20) { - // The loop is too big, bail out. + // If the loop is too big, bail out. + BasicBlock &LoopBB = *CurLoop->getHeader(); + if (LoopBB.size() >= 20) return false; - } // It should have a preheader containing nothing but an unconditional branch. - BasicBlock *PH = CurLoop->getLoopPreheader(); - if (!PH) - return false; - if (&PH->front() != PH->getTerminator()) + BasicBlock &PH = *CurLoop->getLoopPreheader(); + if (&PH.front() != PH.getTerminator()) return false; - auto *EntryBI = dyn_cast(PH->getTerminator()); + // FIXME: Technically, it shouldn't matter what instruction we use as + // a terminator, the only property needed is the definition of a preheader: + // a single loop predecessor whose only successor is the loop header. + auto *EntryBI = dyn_cast(PH.getTerminator()); if (!EntryBI || EntryBI->isConditional()) return false; // It should have a precondition block where the generated popcount instrinsic // function can be inserted. - auto *PreCondBB = PH->getSinglePredecessor(); + auto *PreCondBB = PH.getSinglePredecessor(); if (!PreCondBB) return false; auto *PreCondBI = dyn_cast(PreCondBB->getTerminator());