[llvm] r244879 - [LIR] Start leveraging the fundamental guarantees of a loop in

Chandler Carruth via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 13 02:56:21 PDT 2015


Author: chandlerc
Date: Thu Aug 13 04:56:20 2015
New Revision: 244879

URL: http://llvm.org/viewvc/llvm-project?rev=244879&view=rev
Log:
[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.

Modified:
    llvm/trunk/lib/Transforms/Scalar/LoopIdiomRecognize.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/LoopIdiomRecognize.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopIdiomRecognize.cpp?rev=244879&r1=244878&r2=244879&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/LoopIdiomRecognize.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LoopIdiomRecognize.cpp Thu Aug 13 04:56:20 2015
@@ -830,29 +830,32 @@ bool LoopIdiomRecognize::recognizePopcou
   // 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<BranchInst>(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<BranchInst>(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<BranchInst>(PreCondBB->getTerminator());




More information about the llvm-commits mailing list