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-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=0e593a62f657547c6a7af6dc9710fc055a9c4da0;ds=sidebyside [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@244879 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/LoopIdiomRecognize.cpp b/lib/Transforms/Scalar/LoopIdiomRecognize.cpp index e3fe2530c2b..f2f37eec53b 100644 --- a/lib/Transforms/Scalar/LoopIdiomRecognize.cpp +++ b/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());