1 //===- InductionVars.cpp - Induction Variable Cannonicalization code --------=//
3 // This file implements induction variable cannonicalization of loops.
5 // Specifically, after this executes, the following is true:
6 // - There is a single induction variable for each loop (at least loops that
7 // used to contain at least one induction variable)
8 // * This induction variable starts at 0 and steps by 1 per iteration
9 // * This induction variable is represented by the first PHI node in the
10 // Header block, allowing it to be found easily.
11 // - All other preexisting induction variables are adjusted to operate in
12 // terms of this primary induction variable
13 // - Induction variables with a step size of 0 have been eliminated.
15 // This code assumes the following is true to perform its full job:
16 // - The CFG has been simplified to not have multiple entrances into an
17 // interval header. Interval headers should only have two predecessors,
18 // one from inside of the loop and one from outside of the loop.
20 //===----------------------------------------------------------------------===//
22 #include "llvm/Transforms/Scalar/InductionVars.h"
23 #include "llvm/ConstantVals.h"
24 #include "llvm/Analysis/IntervalPartition.h"
25 #include "llvm/Assembly/Writer.h"
26 #include "llvm/SymbolTable.h"
27 #include "llvm/iPHINode.h"
28 #include "llvm/Function.h"
29 #include "llvm/BasicBlock.h"
30 #include "llvm/InstrTypes.h"
31 #include "llvm/Support/CFG.h"
32 #include "Support/STLExtras.h"
37 // isLoopInvariant - Return true if the specified value/basic block source is
38 // an interval invariant computation.
40 static bool isLoopInvariant(cfg::Interval *Int, Value *V) {
41 assert(isa<Constant>(V) || isa<Instruction>(V) || isa<FunctionArgument>(V));
43 if (!isa<Instruction>(V))
44 return true; // Constants and arguments are always loop invariant
46 BasicBlock *ValueBlock = cast<Instruction>(V)->getParent();
47 assert(ValueBlock && "Instruction not embedded in basic block!");
49 // For now, only consider values from outside of the interval, regardless of
50 // whether the expression could be lifted out of the loop by some LICM.
52 // TODO: invoke LICM library if we find out it would be useful.
54 return !Int->contains(ValueBlock);
58 // isLinearInductionVariableH - Return isLIV if the expression V is a linear
59 // expression defined in terms of loop invariant computations, and a single
60 // instance of the PHI node PN. Return isLIC if the expression V is a loop
61 // invariant computation. Return isNLIV if the expression is a negated linear
62 // induction variable. Return isOther if it is neither.
64 // Currently allowed operators are: ADD, SUB, NEG
65 // TODO: This should allow casts!
67 enum LIVType { isLIV, isLIC, isNLIV, isOther };
69 // neg - Negate the sign of a LIV expression.
70 inline LIVType neg(LIVType T) {
71 assert(T == isLIV || T == isNLIV && "Negate Only works on LIV expressions");
72 return T == isLIV ? isNLIV : isLIV;
75 static LIVType isLinearInductionVariableH(cfg::Interval *Int, Value *V,
77 if (V == PN) { return isLIV; } // PHI node references are (0+PHI)
78 if (isLoopInvariant(Int, V)) return isLIC;
80 // loop variant computations must be instructions!
81 Instruction *I = cast<Instruction>(V);
82 switch (I->getOpcode()) { // Handle each instruction seperately
83 case Instruction::Add:
84 case Instruction::Sub: {
85 Value *SubV1 = cast<BinaryOperator>(I)->getOperand(0);
86 Value *SubV2 = cast<BinaryOperator>(I)->getOperand(1);
87 LIVType SubLIVType1 = isLinearInductionVariableH(Int, SubV1, PN);
88 if (SubLIVType1 == isOther) return isOther; // Early bailout
89 LIVType SubLIVType2 = isLinearInductionVariableH(Int, SubV2, PN);
91 switch (SubLIVType2) {
92 case isOther: return isOther; // Unknown subexpression type
93 case isLIC: return SubLIVType1; // Constant offset, return type #1
96 // So now we know that we have a linear induction variable on the RHS of
97 // the ADD or SUB instruction. SubLIVType1 cannot be isOther, so it is
98 // either a Loop Invariant computation, or a LIV type.
99 if (SubLIVType1 == isLIC) {
100 // Loop invariant computation, we know this is a LIV then.
101 return (I->getOpcode() == Instruction::Add) ?
102 SubLIVType2 : neg(SubLIVType2);
105 // If the LHS is also a LIV Expression, we cannot add two LIVs together
106 if (I->getOpcode() == Instruction::Add) return isOther;
108 // We can only subtract two LIVs if they are the same type, which yields
109 // a LIC, because the LIVs cancel each other out.
110 return (SubLIVType1 == SubLIVType2) ? isLIC : isOther;
115 default: // Any other instruction is not a LINEAR induction var
120 // isLinearInductionVariable - Return true if the specified expression is a
121 // "linear induction variable", which is an expression involving a single
122 // instance of the PHI node and a loop invariant value that is added or
123 // subtracted to the PHI node. This is calculated by walking the SSA graph
125 static inline bool isLinearInductionVariable(cfg::Interval *Int, Value *V,
127 return isLinearInductionVariableH(Int, V, PN) == isLIV;
131 // isSimpleInductionVar - Return true iff the cannonical induction variable PN
132 // has an initializer of the constant value 0, and has a step size of constant
134 static inline bool isSimpleInductionVar(PHINode *PN) {
135 assert(PN->getNumIncomingValues() == 2 && "Must have cannonical PHI node!");
136 Value *Initializer = PN->getIncomingValue(0);
137 if (!isa<Constant>(Initializer)) return false;
139 if (Initializer->getType()->isSigned()) { // Signed constant value...
140 if (((ConstantSInt*)Initializer)->getValue() != 0) return false;
141 } else if (Initializer->getType()->isUnsigned()) { // Unsigned constant value
142 if (((ConstantUInt*)Initializer)->getValue() != 0) return false;
144 return false; // Not signed or unsigned? Must be FP type or something
147 Value *StepExpr = PN->getIncomingValue(1);
148 if (!isa<Instruction>(StepExpr) ||
149 cast<Instruction>(StepExpr)->getOpcode() != Instruction::Add)
152 BinaryOperator *I = cast<BinaryOperator>(StepExpr);
153 assert(isa<PHINode>(I->getOperand(0)) &&
154 "PHI node should be first operand of ADD instruction!");
156 // Get the right hand side of the ADD node. See if it is a constant 1.
157 Value *StepSize = I->getOperand(1);
158 if (!isa<Constant>(StepSize)) return false;
160 if (StepSize->getType()->isSigned()) { // Signed constant value...
161 if (((ConstantSInt*)StepSize)->getValue() != 1) return false;
162 } else if (StepSize->getType()->isUnsigned()) { // Unsigned constant value
163 if (((ConstantUInt*)StepSize)->getValue() != 1) return false;
165 return false; // Not signed or unsigned? Must be FP type or something
168 // At this point, we know the initializer is a constant value 0 and the step
169 // size is a constant value 1. This is our simple induction variable!
173 // InjectSimpleInductionVariable - Insert a cannonical induction variable into
174 // the interval header Header. This assumes that the flow graph is in
175 // simplified form (so we know that the header block has exactly 2 predecessors)
177 // TODO: This should inherit the largest type that is being used by the already
178 // present induction variables (instead of always using uint)
180 static PHINode *InjectSimpleInductionVariable(cfg::Interval *Int) {
181 std::string PHIName, AddName;
183 BasicBlock *Header = Int->getHeaderNode();
184 Function *M = Header->getParent();
186 if (M->hasSymbolTable()) {
187 // Only name the induction variable if the method isn't stripped.
188 PHIName = M->getSymbolTable()->getUniqueName(Type::UIntTy, "ind_var");
189 AddName = M->getSymbolTable()->getUniqueName(Type::UIntTy, "ind_var_next");
192 // Create the neccesary instructions...
193 PHINode *PN = new PHINode(Type::UIntTy, PHIName);
194 Constant *One = ConstantUInt::get(Type::UIntTy, 1);
195 Constant *Zero = ConstantUInt::get(Type::UIntTy, 0);
196 BinaryOperator *AddNode = BinaryOperator::create(Instruction::Add,
199 // Figure out which predecessors I have to play with... there should be
200 // exactly two... one of which is a loop predecessor, and one of which is not.
202 pred_iterator PI = pred_begin(Header);
203 assert(PI != pred_end(Header) && "Header node should have 2 preds!");
204 BasicBlock *Pred1 = *PI; ++PI;
205 assert(PI != pred_end(Header) && "Header node should have 2 preds!");
206 BasicBlock *Pred2 = *PI;
207 assert(++PI == pred_end(Header) && "Header node should have 2 preds!");
209 // Make Pred1 be the loop entrance predecessor, Pred2 be the Loop predecessor
210 if (Int->contains(Pred1)) std::swap(Pred1, Pred2);
212 assert(!Int->contains(Pred1) && "Pred1 should be loop entrance!");
213 assert( Int->contains(Pred2) && "Pred2 should be looping edge!");
215 // Link the instructions into the PHI node...
216 PN->addIncoming(Zero, Pred1); // The initializer is first argument
217 PN->addIncoming(AddNode, Pred2); // The step size is second PHI argument
219 // Insert the PHI node into the Header of the loop. It shall be the first
220 // instruction, because the "Simple" Induction Variable must be first in the
223 BasicBlock::InstListType &IL = Header->getInstList();
226 // Insert the Add instruction as the first (non-phi) instruction in the
227 // header node's basic block.
228 BasicBlock::iterator I = IL.begin();
229 while (isa<PHINode>(*I)) ++I;
230 IL.insert(I, AddNode);
234 // ProcessInterval - This function is invoked once for each interval in the
235 // IntervalPartition of the program. It looks for auxilliary induction
236 // variables in loops. If it finds one, it:
237 // * Cannonicalizes the induction variable. This consists of:
238 // A. Making the first element of the PHI node be the loop invariant
239 // computation, and the second element be the linear induction portion.
240 // B. Changing the first element of the linear induction portion of the PHI
241 // node to be of the form ADD(PHI, <loop invariant expr>).
242 // * Add the induction variable PHI to a list of induction variables found.
244 // After this, a list of cannonical induction variables is known. This list
245 // is searched to see if there is an induction variable that counts from
246 // constant 0 with a step size of constant 1. If there is not one, one is
247 // injected into the loop. Thus a "simple" induction variable is always known
249 // One a simple induction variable is known, all other induction variables are
250 // modified to refer to the "simple" induction variable.
252 static bool ProcessInterval(cfg::Interval *Int) {
253 if (!Int->isLoop()) return false; // Not a loop? Ignore it!
255 std::vector<PHINode *> InductionVars;
257 BasicBlock *Header = Int->getHeaderNode();
258 // Loop over all of the PHI nodes in the interval header...
259 for (BasicBlock::iterator I = Header->begin(), E = Header->end();
260 I != E && isa<PHINode>(*I); ++I) {
261 PHINode *PN = cast<PHINode>(*I);
262 if (PN->getNumIncomingValues() != 2) { // These should be eliminated by now.
263 cerr << "Found interval header with more than 2 predecessors! Ignoring\n";
264 return false; // Todo, make an assertion.
267 // For this to be an induction variable, one of the arguments must be a
268 // loop invariant expression, and the other must be an expression involving
269 // the PHI node, along with possible additions and subtractions of loop
272 BasicBlock *BB1 = PN->getIncomingBlock(0);
273 Value *V1 = PN->getIncomingValue(0);
274 BasicBlock *BB2 = PN->getIncomingBlock(1);
275 Value *V2 = PN->getIncomingValue(1);
277 // Figure out which computation is loop invariant...
278 if (!isLoopInvariant(Int, V1)) {
279 // V1 is *not* loop invariant. Check to see if V2 is:
280 if (isLoopInvariant(Int, V2)) {
281 // They *are* loop invariant. Exchange BB1/BB2 and V1/V2 so that
282 // V1 is always the loop invariant computation.
283 std::swap(V1, V2); std::swap(BB1, BB2);
285 // Neither value is loop invariant. Must not be an induction variable.
286 // This case can happen if there is an unreachable loop in the CFG that
287 // has two tail loops in it that was not split by the cleanup phase
293 // At this point, we know that BB1/V1 are loop invariant. We don't know
294 // anything about BB2/V2. Check now to see if V2 is a linear induction
297 cerr << "Found loop invariant computation: " << V1 << "\n";
299 if (!isLinearInductionVariable(Int, V2, PN))
300 continue; // No, it is not a linear ind var, ignore the PHI node.
301 cerr << "Found linear induction variable: " << V2;
303 // TODO: Cannonicalize V2
305 // Add this PHI node to the list of induction variables found...
306 InductionVars.push_back(PN);
309 // No induction variables found?
310 if (InductionVars.empty()) return false;
312 // Search to see if there is already a "simple" induction variable.
313 std::vector<PHINode*>::iterator It =
314 find_if(InductionVars.begin(), InductionVars.end(), isSimpleInductionVar);
316 PHINode *PrimaryIndVar;
318 // A simple induction variable was not found, inject one now...
319 if (It == InductionVars.end()) {
320 PrimaryIndVar = InjectSimpleInductionVariable(Int);
322 // Move the PHI node for this induction variable to the start of the PHI
323 // list in HeaderNode... we do not need to do this for the inserted case
324 // because the inserted node will always be placed at the beginning of
328 BasicBlock::iterator i =
329 find(Header->begin(), Header->end(), PrimaryIndVar);
330 assert(i != Header->end() &&
331 "How could Primary IndVar not be in the header!?!!?");
333 if (i != Header->begin())
334 std::iter_swap(i, Header->begin());
337 // Now we know that there is a simple induction variable PrimaryIndVar.
338 // Simplify all of the other induction variables to use this induction
339 // variable as their counter, and destroy the PHI nodes that correspond to
345 cerr << "Found Interval Header with indvars (primary indvar should be first "
346 << "phi): \n" << Header << "\nPrimaryIndVar: " << PrimaryIndVar;
348 return false; // TODO: true;
352 // ProcessIntervalPartition - This function loops over the interval partition
353 // processing each interval with ProcessInterval
355 static bool ProcessIntervalPartition(cfg::IntervalPartition &IP) {
356 // This currently just prints out information about the interval structure
359 static unsigned N = 0;
360 cerr << "\n***********Interval Partition #" << (++N) << "************\n\n";
361 copy(IP.begin(), IP.end(), ostream_iterator<cfg::Interval*>(cerr, "\n"));
363 cerr << "\n*********** PERFORMING WORK ************\n\n";
365 // Loop over all of the intervals in the partition and look for induction
366 // variables in intervals that represent loops.
368 return reduce_apply(IP.begin(), IP.end(), bitwise_or<bool>(), false,
369 std::ptr_fun(ProcessInterval));
372 // DoInductionVariableCannonicalize - Simplify induction variables in loops.
373 // This function loops over an interval partition of a program, reducing it
374 // until the graph is gone.
376 bool InductionVariableCannonicalize::doIt(Function *M,
377 cfg::IntervalPartition &IP) {
378 bool Changed = false;
381 while (!IP->isDegeneratePartition()) {
382 Changed |= ProcessIntervalPartition(*IP);
384 // Calculate the reduced version of this graph until we get to an
385 // irreducible graph or a degenerate graph...
387 cfg::IntervalPartition *NewIP = new cfg::IntervalPartition(*IP, false);
388 if (NewIP->size() == IP->size()) {
389 cerr << "IRREDUCIBLE GRAPH FOUND!!!\n";
402 bool InductionVariableCannonicalize::runOnMethod(Function *F) {
403 return doIt(F, getAnalysis<cfg::IntervalPartition>());
406 // getAnalysisUsageInfo - This function works on the call graph of a module.
407 // It is capable of updating the call graph to reflect the new state of the
410 void InductionVariableCannonicalize::getAnalysisUsageInfo(
411 Pass::AnalysisSet &Required,
412 Pass::AnalysisSet &Destroyed,
413 Pass::AnalysisSet &Provided) {
414 Required.push_back(cfg::IntervalPartition::ID);