/// runOnFunction - Process all loops in the function, inner-most out. bool LCSSA::runOnLoop(Loop *TheLoop, LPPassManager &LPM) { L = TheLoop; DT = &getAnalysis<DominatorTree>(); LI = &getAnalysis<LoopInfo>(); SE = getAnalysisIfAvailable<ScalarEvolution>(); // Get the set of exiting blocks. SmallVector<BasicBlock*, 8> ExitBlocks; L->getExitBlocks(ExitBlocks); if (ExitBlocks.empty()) return false; // Speed up queries by creating a sorted vector of blocks. LoopBlocks.clear(); LoopBlocks.insert(LoopBlocks.end(), L->block_begin(), L->block_end()); array_pod_sort(LoopBlocks.begin(), LoopBlocks.end()); // Look at all the instructions in the loop, checking to see if they have uses // outside the loop. If so, rewrite those uses. bool MadeChange = false; for (Loop::block_iterator BBI = L->block_begin(), E = L->block_end(); BBI != E; ++BBI) { BasicBlock *BB = *BBI; // For large loops, avoid use-scanning by using dominance information: In // particular, if a block does not dominate any of the loop exits, then none // of the values defined in the block could be used outside the loop. if (!BlockDominatesAnExit(BB, ExitBlocks, DT)) continue; for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) { // Reject two common cases fast: instructions with no uses (like stores) // and instructions with one use that is in the same block as this. if (I->use_empty() || (I->hasOneUse() && I->use_back()->getParent() == BB && !isa<PHINode>(I->use_back()))) continue; MadeChange |= ProcessInstruction(I, ExitBlocks); } } // If we modified the code, remove any caches about the loop from SCEV to // avoid dangling entries. // FIXME: This is a big hammer, can we clear the cache more selectively? if (SE && MadeChange) SE->forgetLoop(L); assert(L->isLCSSAForm(*DT)); PredCache.clear(); return MadeChange; }
/// ApproximateLoopSize - Approximate the size of the loop after it has been /// unrolled. static unsigned ApproximateLoopSize(const Loop *L) { unsigned Size = 0; for (unsigned i = 0, e = L->getBlocks().size(); i != e; ++i) { BasicBlock *BB = L->getBlocks()[i]; Instruction *Term = BB->getTerminator(); for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) { if (isa<PHINode>(I) && BB == L->getHeader()) { // Ignore PHI nodes in the header. } else if (I->hasOneUse() && I->use_back() == Term) { // Ignore instructions only used by the loop terminator. } else { ++Size; } // TODO: Ignore expressions derived from PHI and constants if inval of phi // is a constant, or if operation is associative. This will get induction // variables. } } return Size; }