[llvm] r244841 - [LIR] Remove the 'LIRUtils' abstraction which was unnecessary and adding

Chandler Carruth via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 12 16:55:56 PDT 2015


Author: chandlerc
Date: Wed Aug 12 18:55:56 2015
New Revision: 244841

URL: http://llvm.org/viewvc/llvm-project?rev=244841&view=rev
Log:
[LIR] Remove the 'LIRUtils' abstraction which was unnecessary and adding
complexity.

There is only one function that was called from multiple locations, and
that was 'getBranch' which has a reasonable one-line spelling already:
dyn_cast<BranchInst>(BB->getTerminator). We could make this shorter, but
it doesn't seem to add much value. Instead, we should avoid calling it
so many times on the same basic blocks, but that will be in a subsequent
patch.

The other functions are only called in one location, so inline them
there, and take advantage of this to use direct early exit and reduce
indentation. This makes it much more clear what is being tested for, and
in fact makes it clear now to me that there are simpler ways to do this
work. However, this patch just does the mechanical inlining. I'll clean
up the functionality of the code to leverage loop simplified form more
effectively in a follow-up.

Despite lots of early line breaks due to early-exit, this is still
shorter than it was before.

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=244841&r1=244840&r2=244841&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/LoopIdiomRecognize.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LoopIdiomRecognize.cpp Wed Aug 12 18:55:56 2015
@@ -69,22 +69,6 @@ namespace {
 
 class LoopIdiomRecognize;
 
-/// This class defines some utility functions for loop idiom recognization.
-class LIRUtil {
-public:
-  /// Return true iff the block contains nothing but an uncondition branch
-  /// (aka goto instruction).
-  static bool isAlmostEmpty(BasicBlock *);
-
-  static BranchInst *getBranch(BasicBlock *BB) {
-    return dyn_cast<BranchInst>(BB->getTerminator());
-  }
-
-  /// Derive the precondition block (i.e the block that guards the loop
-  /// preheader) from the given preheader.
-  static BasicBlock *getPrecondBb(BasicBlock *PreHead);
-};
-
 /// This class is to recoginize idioms of population-count conducted in
 /// a noncountable loop. Currently it only recognizes this pattern:
 /// \code
@@ -242,32 +226,6 @@ static void deleteDeadInstruction(Instru
 
 //===----------------------------------------------------------------------===//
 //
-//          Implementation of LIRUtil
-//
-//===----------------------------------------------------------------------===//
-
-// This function will return true iff the given block contains nothing but goto.
-// A typical usage of this function is to check if the preheader function is
-// "almost" empty such that generated intrinsic functions can be moved across
-// the preheader and be placed at the end of the precondition block without
-// the concern of breaking data dependence.
-bool LIRUtil::isAlmostEmpty(BasicBlock *BB) {
-  if (BranchInst *Br = getBranch(BB)) {
-    return Br->isUnconditional() && Br == BB->begin();
-  }
-  return false;
-}
-
-BasicBlock *LIRUtil::getPrecondBb(BasicBlock *PreHead) {
-  if (BasicBlock *BB = PreHead->getSinglePredecessor()) {
-    BranchInst *Br = getBranch(BB);
-    return Br && Br->isConditional() ? BB : nullptr;
-  }
-  return nullptr;
-}
-
-//===----------------------------------------------------------------------===//
-//
 //          Implementation of NclPopcountRecognize
 //
 //===----------------------------------------------------------------------===//
@@ -295,16 +253,24 @@ bool NclPopcountRecognize::preliminarySc
     return false;
   }
 
-  // It should have a preheader containing nothing but a goto instruction.
-  BasicBlock *PreHead = CurLoop->getLoopPreheader();
-  if (!PreHead || !LIRUtil::isAlmostEmpty(PreHead))
+  // It should have a preheader containing nothing but an unconditional branch.
+  BasicBlock *PH = CurLoop->getLoopPreheader();
+  if (!PH)
+    return false;
+  if (&PH->front() != PH->getTerminator())
+    return false;
+  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 will be inserted.
-  PreCondBB = LIRUtil::getPrecondBb(PreHead);
+  // function can be inserted.
+  PreCondBB = PH->getSinglePredecessor();
   if (!PreCondBB)
     return false;
+  auto *PreCondBI = dyn_cast<BranchInst>(PreCondBB->getTerminator());
+  if (!PreCondBI || PreCondBI->isUnconditional())
+    return false;
 
   return true;
 }
@@ -364,7 +330,8 @@ bool NclPopcountRecognize::detectIdiom(I
 
   // step 1: Check if the loop-back branch is in desirable form.
   {
-    if (Value *T = matchCondition(LIRUtil::getBranch(LoopEntry), LoopEntry))
+    if (Value *T = matchCondition(
+            dyn_cast<BranchInst>(LoopEntry->getTerminator()), LoopEntry))
       DefX2 = dyn_cast<Instruction>(T);
     else
       return false;
@@ -446,7 +413,7 @@ bool NclPopcountRecognize::detectIdiom(I
   // step 5: check if the precondition is in this form:
   //   "if (x != 0) goto loop-head ; else goto somewhere-we-don't-care;"
   {
-    BranchInst *PreCondBr = LIRUtil::getBranch(PreCondBB);
+    auto *PreCondBr = dyn_cast<BranchInst>(PreCondBB->getTerminator());
     Value *T = matchCondition(PreCondBr, CurLoop->getLoopPreheader());
     if (T != PhiX->getOperand(0) && T != PhiX->getOperand(1))
       return false;
@@ -465,7 +432,7 @@ void NclPopcountRecognize::transform(Ins
   ScalarEvolution *SE = LIR.getScalarEvolution();
   TargetLibraryInfo *TLI = LIR.getTargetLibraryInfo();
   BasicBlock *PreHead = CurLoop->getLoopPreheader();
-  BranchInst *PreCondBr = LIRUtil::getBranch(PreCondBB);
+  auto *PreCondBr = dyn_cast<BranchInst>(PreCondBB->getTerminator());
   const DebugLoc DL = CntInst->getDebugLoc();
 
   // Assuming before transformation, the loop is following:
@@ -536,7 +503,7 @@ void NclPopcountRecognize::transform(Ins
   //     do { cnt++; x &= x-1; t--) } while (t > 0);
   BasicBlock *Body = *(CurLoop->block_begin());
   {
-    BranchInst *LbBr = LIRUtil::getBranch(Body);
+    auto *LbBr = dyn_cast<BranchInst>(Body->getTerminator());
     ICmpInst *LbCond = cast<ICmpInst>(LbBr->getCondition());
     Type *Ty = TripCnt->getType();
 




More information about the llvm-commits mailing list