//===- LoopIndexSplit.cpp - Loop Index Splitting Pass ---------------------===// // // The LLVM Compiler Infrastructure // // This file was developed by Devang Patel and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file implements Loop Index Splitting Pass. // //===----------------------------------------------------------------------===// #define DEBUG_TYPE "loop-index-split" #include "llvm/Transforms/Scalar.h" #include "llvm/Function.h" #include "llvm/Analysis/LoopPass.h" #include "llvm/Analysis/ScalarEvolutionExpander.h" #include "llvm/Support/Compiler.h" #include "llvm/ADT/Statistic.h" using namespace llvm; STATISTIC(NumIndexSplit, "Number of loops index split"); namespace { class VISIBILITY_HIDDEN LoopIndexSplit : public LoopPass { public: static char ID; // Pass ID, replacement for typeid LoopIndexSplit() : LoopPass((intptr_t)&ID) {} // Index split Loop L. Return true if loop is split. bool runOnLoop(Loop *L, LPPassManager &LPM); void getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); AU.addPreserved(); AU.addRequiredID(LCSSAID); AU.addPreservedID(LCSSAID); AU.addPreserved(); AU.addRequiredID(LoopSimplifyID); AU.addPreservedID(LoopSimplifyID); } private: /// Find condition inside a loop that is suitable candidate for index split. void findSplitCondition(); /// processOneIterationLoop - Current loop L contains compare instruction /// that compares induction variable, IndVar, agains loop invariant. If /// entire (i.e. meaningful) loop body is dominated by this compare /// instruction then loop body is executed only for one iteration. In /// such case eliminate loop structure surrounding this loop body. For bool processOneIterationLoop(LPPassManager &LPM); // If loop header includes loop variant instruction operands then // this loop may not be eliminated. bool safeHeader(BasicBlock *BB); // If Exit block includes loop variant instructions then this // loop may not be eliminated. bool safeExitBlock(BasicBlock *BB); bool splitLoop(); private: // Current Loop. Loop *L; ScalarEvolution *SE; // Induction variable whose range is being split by this transformation. PHINode *IndVar; // Induction variable's range is split at this value. Value *SplitValue; // Induction variable's final loop exit value. Value *ExitValue; // This compare instruction compares IndVar against SplitValue. ICmpInst *SplitCondition; // Loop exit condition. ICmpInst *ExitCondition; }; char LoopIndexSplit::ID = 0; RegisterPass X ("loop-index-split", "Index Split Loops"); } LoopPass *llvm::createLoopIndexSplitPass() { return new LoopIndexSplit(); } // Index split Loop L. Return true if loop is split. bool LoopIndexSplit::runOnLoop(Loop *IncomingLoop, LPPassManager &LPM) { bool Changed = false; L = IncomingLoop; SplitCondition = NULL; SE = &getAnalysis(); findSplitCondition(); if (!SplitCondition) return false; if (SplitCondition->getPredicate() == ICmpInst::ICMP_EQ) // If it is possible to eliminate loop then do so. Changed = processOneIterationLoop(LPM); else Changed = splitLoop(); if (Changed) ++NumIndexSplit; return Changed; } /// Find condition inside a loop that is suitable candidate for index split. void LoopIndexSplit::findSplitCondition() { BasicBlock *Header = L->getHeader(); for (BasicBlock::iterator I = Header->begin(); isa(I); ++I) { PHINode *PN = cast(I); if (!PN->getType()->isInteger()) continue; SCEVHandle SCEV = SE->getSCEV(PN); if (!isa(SCEV)) continue; // If this phi node is used in a compare instruction then it is a // split condition candidate. for (Value::use_iterator UI = PN->use_begin(), E = PN->use_end(); UI != E; ++UI) { if (ICmpInst *CI = dyn_cast(*UI)) { SplitCondition = CI; break; } } // Valid SplitCondition's one operand is phi node and the other operand // is loop invariant. if (SplitCondition) { if (SplitCondition->getOperand(0) != PN) SplitValue = SplitCondition->getOperand(0); else SplitValue = SplitCondition->getOperand(1); SCEVHandle ValueSCEV = SE->getSCEV(SplitValue); // If SplitValue is not invariant then SplitCondition is not appropriate. if (!ValueSCEV->isLoopInvariant(L)) SplitCondition = NULL; } // We are looking for only one split condition. if (SplitCondition) { IndVar = PN; break; } } } /// processOneIterationLoop - Current loop L contains compare instruction /// that compares induction variable, IndVar, against loop invariant. If /// entire (i.e. meaningful) loop body is dominated by this compare /// instruction then loop body is executed only once. In such case eliminate /// loop structure surrounding this loop body. For example, /// for (int i = start; i < end; ++i) { /// if ( i == somevalue) { /// loop_body /// } /// } /// can be transformed into /// if (somevalue >= start && somevalue < end) { /// i = somevalue; /// loop_body /// } bool LoopIndexSplit::processOneIterationLoop(LPPassManager &LPM) { BasicBlock *Header = L->getHeader(); // First of all, check if SplitCondition dominates entire loop body // or not. // If SplitCondition is not in loop header then this loop is not suitable // for this transformation. if (SplitCondition->getParent() != Header) return false; // If one of the Header block's successor is not an exit block then this // loop is not a suitable candidate. BasicBlock *ExitBlock = NULL; for (succ_iterator SI = succ_begin(Header), E = succ_end(Header); SI != E; ++SI) { if (L->isLoopExit(*SI)) { ExitBlock = *SI; break; } } if (!ExitBlock) return false; // If loop header includes loop variant instruction operands then // this loop may not be eliminated. if (!safeHeader(Header)) return false; // If Exit block includes loop variant instructions then this // loop may not be eliminated. if (!safeExitBlock(ExitBlock)) return false; // Update CFG. // As a first step to break this loop, remove Latch to Header edge. BasicBlock *Latch = L->getLoopLatch(); BasicBlock *LatchSucc = NULL; BranchInst *BR = dyn_cast(Latch->getTerminator()); if (!BR) return false; Header->removePredecessor(Latch); for (succ_iterator SI = succ_begin(Latch), E = succ_end(Latch); SI != E; ++SI) { if (Header != *SI) LatchSucc = *SI; } BR->setUnconditionalDest(LatchSucc); BasicBlock *Preheader = L->getLoopPreheader(); Instruction *Terminator = Header->getTerminator(); Value *StartValue = IndVar->getIncomingValueForBlock(Preheader); // Replace split condition in header. // Transform // SplitCondition : icmp eq i32 IndVar, SplitValue // into // c1 = icmp uge i32 SplitValue, StartValue // c2 = icmp ult i32 vSplitValue, ExitValue // and i32 c1, c2 bool SignedPredicate = ExitCondition->isSignedPredicate(); Instruction *C1 = new ICmpInst(SignedPredicate ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE, SplitValue, StartValue, "lisplit", Terminator); Instruction *C2 = new ICmpInst(SignedPredicate ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT, SplitValue, ExitValue, "lisplit", Terminator); Instruction *NSplitCond = BinaryOperator::createAnd(C1, C2, "lisplit", Terminator); SplitCondition->replaceAllUsesWith(NSplitCond); SplitCondition->eraseFromParent(); // Now, clear latch block. Remove instructions that are responsible // to increment induction variable. Instruction *LTerminator = Latch->getTerminator(); for (BasicBlock::iterator LB = Latch->begin(), LE = Latch->end(); LB != LE; ) { Instruction *I = LB; ++LB; if (isa(I) || I == LTerminator) continue; I->replaceAllUsesWith(UndefValue::get(I->getType())); I->eraseFromParent(); } LPM.deleteLoopFromQueue(L); return true; } // If loop header includes loop variant instruction operands then // this loop can not be eliminated. This is used by processOneIterationLoop(). bool LoopIndexSplit::safeHeader(BasicBlock *Header) { Instruction *Terminator = Header->getTerminator(); for(BasicBlock::iterator BI = Header->begin(), BE = Header->end(); BI != BE; ++BI) { Instruction *I = BI; // PHI Nodes are OK. FIXME : Handle last value assignments. if (isa(I)) continue; // SplitCondition itself is OK. if (I == SplitCondition) continue; // Terminator is also harmless. if (I == Terminator) continue; // Otherwise we have a instruction that may not be safe. return false; } return true; } // If Exit block includes loop variant instructions then this // loop may not be eliminated. This is used by processOneIterationLoop(). bool LoopIndexSplit::safeExitBlock(BasicBlock *ExitBlock) { Instruction *IndVarIncrement = NULL; for (BasicBlock::iterator BI = ExitBlock->begin(), BE = ExitBlock->end(); BI != BE; ++BI) { Instruction *I = BI; // PHI Nodes are OK. FIXME : Handle last value assignments. if (isa(I)) continue; // Check if I is induction variable increment instruction. if (BinaryOperator *BOp = dyn_cast(I)) { if (BOp->getOpcode() != Instruction::Add) return false; Value *Op0 = BOp->getOperand(0); Value *Op1 = BOp->getOperand(1); PHINode *PN = NULL; ConstantInt *CI = NULL; if ((PN = dyn_cast(Op0))) { if ((CI = dyn_cast(Op1))) IndVarIncrement = I; } else if ((PN = dyn_cast(Op1))) { if ((CI = dyn_cast(Op0))) IndVarIncrement = I; } if (IndVarIncrement && PN == IndVar && CI->isOne()) continue; } // I is an Exit condition if next instruction is block terminator. // Exit condition is OK if it compares loop invariant exit value, // which is checked below. else if (ICmpInst *EC = dyn_cast(I)) { ++BI; Instruction *N = BI; if (N == ExitBlock->getTerminator()) { ExitCondition = EC; continue; } } // Otherwise we have instruction that may not be safe. return false; } // Check if Exit condition is comparing induction variable against // loop invariant value. If one operand is induction variable and // the other operand is loop invaraint then Exit condition is safe. if (ExitCondition) { Value *Op0 = ExitCondition->getOperand(0); Value *Op1 = ExitCondition->getOperand(1); Instruction *Insn0 = dyn_cast(Op0); Instruction *Insn1 = dyn_cast(Op1); if (Insn0 && Insn0 == IndVarIncrement) ExitValue = Op1; else if (Insn1 && Insn1 == IndVarIncrement) ExitValue = Op0; SCEVHandle ValueSCEV = SE->getSCEV(ExitValue); if (!ValueSCEV->isLoopInvariant(L)) return false; } // We could not find any reason to consider ExitBlock unsafe. return true; } bool LoopIndexSplit::splitLoop() { // FIXME :) return false; }