24 #define DEBUG_TYPE "loop-unroll"
41 "Number of loops unrolled with run-time trip counts");
61 assert(Latch != 0 &&
"Loop must have a latch");
113 assert(Exit != 0 &&
"Loop must have a single exit block only");
140 std::vector<BasicBlock *> &NewBlocks,
156 NewBlocks.push_back(NewBB);
159 ParentLoop->addBasicBlockToLoop(NewBB, LI->
getBase());
170 PHINode *NewPHI = cast<PHINode>(VMap[
I]);
181 InVal = LVMap[InVal];
189 VMap.
erase((*BB)->getTerminator());
198 LVMap[VI->first] = VI->second;
253 const SCEV *TripCountSC =
255 if (isa<SCEVCouldNotCompute>(TripCountSC))
260 if ((Count & (Count-1)) != 0)
280 Value *TripCount = Expander.expandCodeFor(TripCountSC, TripCountSC->
getType(),
284 BinaryOperator::CreateURem(TripCount,
296 assert(PreHeaderBR->isUnconditional() &&
297 PreHeaderBR->getSuccessor(0) == PEnd &&
298 "CFG edges in Preheader are not correct");
299 PreHeaderBR->eraseFromParent();
316 for (
unsigned leftOverIters = Count-1; leftOverIters > 0; --leftOverIters) {
317 std::vector<BasicBlock*> NewBlocks;
322 CloneLoopBlocks(L, (leftOverIters == Count-1), LastLoopBB, PEnd, NewBlocks,
323 LoopBlocks, VMap, LVMap, LI);
324 LastLoopBB = cast<BasicBlock>(VMap[Latch]);
328 NewBlocks[0], F->
end());
332 if (leftOverIters == Count-1) {
335 CompareBB = NewBlocks[0];
342 ParentLoop->addBasicBlockToLoop(NewBB, LI->
getBase());
354 VMap[NewPH] = CompareBB;
359 for (
unsigned i = 0, e = NewBlocks.size(); i != e; ++i) {
361 E = NewBlocks[i]->
end();
I != E; ++
I) {
370 ConnectProlog(L, TripCount, Count, LastLoopBB, PEnd, PH, NewPH, LVMap,
372 NumRuntimeUnrolled++;
BasicBlock * getUniqueExitBlock() const
BasicBlock * SplitEdge(BasicBlock *From, BasicBlock *To, Pass *P)
void addIncoming(Value *V, BasicBlock *BB)
const SCEV * getConstant(ConstantInt *V)
enable_if_c<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
const_iterator begin(StringRef path)
Get begin iterator over path.
LoopT * getParentLoop() const
const Function * getParent() const
Return the enclosing method, or null if none.
void RemapInstruction(Instruction *I, ValueToValueMapTy &VM, RemapFlags Flags=RF_None, ValueMapTypeRemapper *TypeMapper=0, ValueMaterializer *Materializer=0)
BlockT * getHeader() const
LoopInfoBase< BlockT, LoopT > * LI
static Constant * getNullValue(Type *Ty)
StringRef getName() const
BlockT * getLoopLatch() const
AnalysisType * getAnalysisIfAvailable() const
static BranchInst * Create(BasicBlock *IfTrue, Instruction *InsertBefore=0)
bool isLoopSimplifyForm() const
Interval::succ_iterator succ_begin(Interval *I)
BasicBlock * SplitBlockPredecessors(BasicBlock *BB, ArrayRef< BasicBlock * > Preds, const char *Suffix, Pass *P=0)
void setSuccessor(unsigned idx, BasicBlock *B)
void perform(LoopInfo *LI)
Traverse the loop blocks and store the DFS result.
Interval::succ_iterator succ_end(Interval *I)
BlockT * getLoopPreheader() const
void insertBefore(Instruction *InsertPos)
LLVM Basic Block Representation.
static void ConnectProlog(Loop *L, Value *TripCount, unsigned Count, BasicBlock *LastPrologBB, BasicBlock *PrologEnd, BasicBlock *OrigPH, BasicBlock *NewPH, ValueToValueMapTy &LVMap, Pass *P)
Interval::pred_iterator pred_begin(Interval *I)
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", Instruction *InsertBefore=0)
bool contains(const LoopT *L) const
const InstListType & getInstList() const
Return the underlying instruction list container.
Represent an integer comparison operator.
std::vector< BasicBlock * >::const_reverse_iterator RPOIterator
BlockT * getExitingBlock() const
Interval::pred_iterator pred_end(Interval *I)
static void CloneLoopBlocks(Loop *L, bool FirstCopy, BasicBlock *InsertTop, BasicBlock *InsertBot, std::vector< BasicBlock * > &NewBlocks, LoopBlocksDFS &LoopBlocks, ValueToValueMapTy &VMap, ValueToValueMapTy &LVMap, LoopInfo *LI)
iterator erase(iterator where)
const BasicBlockListType & getBasicBlockList() const
void setIncomingBlock(unsigned i, BasicBlock *BB)
Value * getIncomingValue(unsigned i) const
STATISTIC(NumRuntimeUnrolled,"Number of loops unrolled with run-time trip counts")
static Constant * get(Type *Ty, uint64_t V, bool isSigned=false)
virtual Pass * getAsPass()
void splice(iterator where, iplist &L2)
BasicBlock * SplitBlock(BasicBlock *Old, Instruction *SplitPt, Pass *P)
Value * getIncomingValueForBlock(const BasicBlock *BB) const
const SCEV * getAddExpr(SmallVectorImpl< const SCEV * > &Ops, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap)
bool UnrollRuntimeLoopProlog(Loop *L, unsigned Count, LoopInfo *LI, LPPassManager *LPM)
void forgetLoop(const Loop *L)
BasicBlock * CloneBasicBlock(const BasicBlock *BB, ValueToValueMapTy &VMap, const Twine &NameSuffix="", Function *F=0, ClonedCodeInfo *CodeInfo=0)
TerminatorInst * getTerminator()
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
bool isLandingPad() const
Return true if this basic block is a landing pad.
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=0, BasicBlock *InsertBefore=0)
Creates a new BasicBlock.
RPOIterator beginRPO() const
Reverse iterate over the cached postorder blocks.
const SCEV * getBackedgeTakenCount(const Loop *L)
LLVMContext & getContext() const
Get the context in which this basic block lives.
LLVM Value Representation.
void SplitLandingPadPredecessors(BasicBlock *OrigBB, ArrayRef< BasicBlock * > Preds, const char *Suffix, const char *Suffix2, Pass *P, SmallVectorImpl< BasicBlock * > &NewBBs)
void setIncomingValue(unsigned i, Value *V)
int getBasicBlockIndex(const BasicBlock *BB) const
LoopInfoBase< BasicBlock, Loop > & getBase()
RPOIterator endRPO() const
bool erase(const KeyT &Val)