Skip to content

Commit

Permalink
Revert "[LIR] Start leveraging the fundamental guarantees of a loop..."
Browse files Browse the repository at this point in the history
This reverts commit r244879, as it broke the test-suite on
SingleSource/Regression/C/2004-03-15-IndirectGoto in AArch64.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@244885 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
rengolin committed Aug 13, 2015
1 parent b260fa8 commit 26f2b35
Showing 1 changed file with 12 additions and 15 deletions.
27 changes: 12 additions & 15 deletions lib/Transforms/Scalar/LoopIdiomRecognize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -830,32 +830,29 @@ bool LoopIdiomRecognize::recognizePopcount() {
// non-compact loop. Therefore, recognizing popcount idiom only makes sense
// in a compact loop.

assert(CurLoop->isLoopSimplifyForm() &&
"Loop passes require simplified form!");

// Give up if the loop has multiple blocks.
if (CurLoop->getNumBlocks() != 1)
// Give up if the loop has multiple blocks or multiple backedges.
if (CurLoop->getNumBackEdges() != 1 || CurLoop->getNumBlocks() != 1)
return false;

// If the loop is too big, bail out.
BasicBlock &LoopBB = *CurLoop->getHeader();
if (LoopBB.size() >= 20)
BasicBlock *LoopBody = *(CurLoop->block_begin());
if (LoopBody->size() >= 20) {
// The loop is too big, bail out.
return false;
}

// It should have a preheader containing nothing but an unconditional branch.
BasicBlock &PH = *CurLoop->getLoopPreheader();
if (&PH.front() != PH.getTerminator())
BasicBlock *PH = CurLoop->getLoopPreheader();
if (!PH)
return false;
if (&PH->front() != PH->getTerminator())
return false;
// 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());
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());
Expand Down

0 comments on commit 26f2b35

Please sign in to comment.