blob: 0225cd5e3d52cc1c86a33ae9eb16825b912bb9ca [file] [log] [blame]
Chris Lattnerd213f0f2001-06-20 19:27:11 +00001//===- InductionVars.cpp - Induction Variable Cannonicalization code --------=//
2//
3// This file implements induction variable cannonicalization of loops.
4//
5// Specifically, after this executes, the following is true:
Chris Lattner364b1472001-06-22 02:24:38 +00006// - There is a single induction variable for each loop (at least loops that
7// used to contain at least one induction variable)
Chris Lattner3b34c592001-06-27 23:36:09 +00008// * 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
Chris Lattner364b1472001-06-22 02:24:38 +000010// Header block, allowing it to be found easily.
Chris Lattnerd213f0f2001-06-20 19:27:11 +000011// - All other preexisting induction variables are adjusted to operate in
12// terms of this primary induction variable
Chris Lattnerd473a0a2001-06-25 07:32:19 +000013// - Induction variables with a step size of 0 have been eliminated.
Chris Lattnerd213f0f2001-06-20 19:27:11 +000014//
Chris Lattner364b1472001-06-22 02:24:38 +000015// 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.
19//
Chris Lattnerd213f0f2001-06-20 19:27:11 +000020//===----------------------------------------------------------------------===//
21
Chris Lattner59b6b8e2002-01-21 23:17:48 +000022#include "llvm/Transforms/Scalar/InductionVars.h"
Chris Lattnere9bb2df2001-12-03 22:26:30 +000023#include "llvm/ConstantVals.h"
Chris Lattnerc9f39b22001-06-24 04:05:45 +000024#include "llvm/Analysis/IntervalPartition.h"
Chris Lattner7061dc52001-12-03 18:02:31 +000025#include "llvm/iPHINode.h"
Chris Lattner79df7c02002-03-26 18:01:55 +000026#include "llvm/Function.h"
Chris Lattner221d6882002-02-12 21:07:25 +000027#include "llvm/BasicBlock.h"
Chris Lattner455889a2002-02-12 22:39:50 +000028#include "llvm/InstrTypes.h"
Chris Lattner237e6d12002-04-08 22:03:00 +000029#include "llvm/Type.h"
Chris Lattner455889a2002-02-12 22:39:50 +000030#include "llvm/Support/CFG.h"
Chris Lattnercee8f9a2001-11-27 00:03:19 +000031#include "Support/STLExtras.h"
Chris Lattnerc9f39b22001-06-24 04:05:45 +000032#include <algorithm>
Chris Lattner697954c2002-01-20 22:54:45 +000033#include <iostream>
34using std::cerr;
Chris Lattnerd213f0f2001-06-20 19:27:11 +000035
Chris Lattner364b1472001-06-22 02:24:38 +000036// isLoopInvariant - Return true if the specified value/basic block source is
37// an interval invariant computation.
38//
Chris Lattner1b7f7dc2002-04-28 16:21:30 +000039static bool isLoopInvariant(Interval *Int, Value *V) {
Chris Lattner73e21422002-04-09 19:48:49 +000040 assert(isa<Constant>(V) || isa<Instruction>(V) || isa<Argument>(V));
Chris Lattnerd213f0f2001-06-20 19:27:11 +000041
Chris Lattner1d87bcf2001-10-01 20:11:19 +000042 if (!isa<Instruction>(V))
Chris Lattner364b1472001-06-22 02:24:38 +000043 return true; // Constants and arguments are always loop invariant
44
Chris Lattnerb00c5822001-10-02 03:41:24 +000045 BasicBlock *ValueBlock = cast<Instruction>(V)->getParent();
Chris Lattner364b1472001-06-22 02:24:38 +000046 assert(ValueBlock && "Instruction not embedded in basic block!");
47
48 // For now, only consider values from outside of the interval, regardless of
49 // whether the expression could be lifted out of the loop by some LICM.
50 //
51 // TODO: invoke LICM library if we find out it would be useful.
52 //
53 return !Int->contains(ValueBlock);
54}
55
56
57// isLinearInductionVariableH - Return isLIV if the expression V is a linear
58// expression defined in terms of loop invariant computations, and a single
59// instance of the PHI node PN. Return isLIC if the expression V is a loop
60// invariant computation. Return isNLIV if the expression is a negated linear
61// induction variable. Return isOther if it is neither.
62//
63// Currently allowed operators are: ADD, SUB, NEG
64// TODO: This should allow casts!
65//
66enum LIVType { isLIV, isLIC, isNLIV, isOther };
67//
68// neg - Negate the sign of a LIV expression.
69inline LIVType neg(LIVType T) {
70 assert(T == isLIV || T == isNLIV && "Negate Only works on LIV expressions");
71 return T == isLIV ? isNLIV : isLIV;
72}
73//
Chris Lattner1b7f7dc2002-04-28 16:21:30 +000074static LIVType isLinearInductionVariableH(Interval *Int, Value *V,
Chris Lattner364b1472001-06-22 02:24:38 +000075 PHINode *PN) {
76 if (V == PN) { return isLIV; } // PHI node references are (0+PHI)
77 if (isLoopInvariant(Int, V)) return isLIC;
78
Chris Lattner3b34c592001-06-27 23:36:09 +000079 // loop variant computations must be instructions!
Chris Lattner9636a912001-10-01 16:18:37 +000080 Instruction *I = cast<Instruction>(V);
Chris Lattnera41f50d2001-07-07 19:24:15 +000081 switch (I->getOpcode()) { // Handle each instruction seperately
Chris Lattner364b1472001-06-22 02:24:38 +000082 case Instruction::Add:
83 case Instruction::Sub: {
Chris Lattnerb00c5822001-10-02 03:41:24 +000084 Value *SubV1 = cast<BinaryOperator>(I)->getOperand(0);
85 Value *SubV2 = cast<BinaryOperator>(I)->getOperand(1);
Chris Lattner364b1472001-06-22 02:24:38 +000086 LIVType SubLIVType1 = isLinearInductionVariableH(Int, SubV1, PN);
87 if (SubLIVType1 == isOther) return isOther; // Early bailout
88 LIVType SubLIVType2 = isLinearInductionVariableH(Int, SubV2, PN);
89
90 switch (SubLIVType2) {
91 case isOther: return isOther; // Unknown subexpression type
92 case isLIC: return SubLIVType1; // Constant offset, return type #1
93 case isLIV:
94 case isNLIV:
95 // So now we know that we have a linear induction variable on the RHS of
96 // the ADD or SUB instruction. SubLIVType1 cannot be isOther, so it is
97 // either a Loop Invariant computation, or a LIV type.
98 if (SubLIVType1 == isLIC) {
99 // Loop invariant computation, we know this is a LIV then.
Chris Lattnera41f50d2001-07-07 19:24:15 +0000100 return (I->getOpcode() == Instruction::Add) ?
Chris Lattner364b1472001-06-22 02:24:38 +0000101 SubLIVType2 : neg(SubLIVType2);
102 }
103
104 // If the LHS is also a LIV Expression, we cannot add two LIVs together
Chris Lattnera41f50d2001-07-07 19:24:15 +0000105 if (I->getOpcode() == Instruction::Add) return isOther;
Chris Lattner364b1472001-06-22 02:24:38 +0000106
107 // We can only subtract two LIVs if they are the same type, which yields
108 // a LIC, because the LIVs cancel each other out.
109 return (SubLIVType1 == SubLIVType2) ? isLIC : isOther;
110 }
111 // NOT REACHED
112 }
113
114 default: // Any other instruction is not a LINEAR induction var
115 return isOther;
116 }
117}
118
119// isLinearInductionVariable - Return true if the specified expression is a
120// "linear induction variable", which is an expression involving a single
121// instance of the PHI node and a loop invariant value that is added or
122// subtracted to the PHI node. This is calculated by walking the SSA graph
123//
Chris Lattner1b7f7dc2002-04-28 16:21:30 +0000124static inline bool isLinearInductionVariable(Interval *Int, Value *V,
Chris Lattner364b1472001-06-22 02:24:38 +0000125 PHINode *PN) {
126 return isLinearInductionVariableH(Int, V, PN) == isLIV;
127}
128
129
130// isSimpleInductionVar - Return true iff the cannonical induction variable PN
131// has an initializer of the constant value 0, and has a step size of constant
132// 1.
133static inline bool isSimpleInductionVar(PHINode *PN) {
134 assert(PN->getNumIncomingValues() == 2 && "Must have cannonical PHI node!");
135 Value *Initializer = PN->getIncomingValue(0);
Chris Lattnere9bb2df2001-12-03 22:26:30 +0000136 if (!isa<Constant>(Initializer)) return false;
Chris Lattner364b1472001-06-22 02:24:38 +0000137
Chris Lattnerc9f39b22001-06-24 04:05:45 +0000138 if (Initializer->getType()->isSigned()) { // Signed constant value...
Chris Lattnere9bb2df2001-12-03 22:26:30 +0000139 if (((ConstantSInt*)Initializer)->getValue() != 0) return false;
Chris Lattnerc9f39b22001-06-24 04:05:45 +0000140 } else if (Initializer->getType()->isUnsigned()) { // Unsigned constant value
Chris Lattnere9bb2df2001-12-03 22:26:30 +0000141 if (((ConstantUInt*)Initializer)->getValue() != 0) return false;
Chris Lattnerc9f39b22001-06-24 04:05:45 +0000142 } else {
143 return false; // Not signed or unsigned? Must be FP type or something
144 }
145
Chris Lattnerd473a0a2001-06-25 07:32:19 +0000146 Value *StepExpr = PN->getIncomingValue(1);
Chris Lattner1d87bcf2001-10-01 20:11:19 +0000147 if (!isa<Instruction>(StepExpr) ||
Chris Lattnerb00c5822001-10-02 03:41:24 +0000148 cast<Instruction>(StepExpr)->getOpcode() != Instruction::Add)
Chris Lattner3b34c592001-06-27 23:36:09 +0000149 return false;
150
Chris Lattnerb00c5822001-10-02 03:41:24 +0000151 BinaryOperator *I = cast<BinaryOperator>(StepExpr);
152 assert(isa<PHINode>(I->getOperand(0)) &&
Chris Lattner364b1472001-06-22 02:24:38 +0000153 "PHI node should be first operand of ADD instruction!");
154
155 // Get the right hand side of the ADD node. See if it is a constant 1.
156 Value *StepSize = I->getOperand(1);
Chris Lattnere9bb2df2001-12-03 22:26:30 +0000157 if (!isa<Constant>(StepSize)) return false;
Chris Lattner364b1472001-06-22 02:24:38 +0000158
Chris Lattnerc9f39b22001-06-24 04:05:45 +0000159 if (StepSize->getType()->isSigned()) { // Signed constant value...
Chris Lattnere9bb2df2001-12-03 22:26:30 +0000160 if (((ConstantSInt*)StepSize)->getValue() != 1) return false;
Chris Lattnerc9f39b22001-06-24 04:05:45 +0000161 } else if (StepSize->getType()->isUnsigned()) { // Unsigned constant value
Chris Lattnere9bb2df2001-12-03 22:26:30 +0000162 if (((ConstantUInt*)StepSize)->getValue() != 1) return false;
Chris Lattnerc9f39b22001-06-24 04:05:45 +0000163 } else {
164 return false; // Not signed or unsigned? Must be FP type or something
165 }
Chris Lattner364b1472001-06-22 02:24:38 +0000166
Chris Lattnerc9f39b22001-06-24 04:05:45 +0000167 // At this point, we know the initializer is a constant value 0 and the step
168 // size is a constant value 1. This is our simple induction variable!
169 return true;
Chris Lattnerda956802001-06-21 05:27:22 +0000170}
171
Chris Lattnerd473a0a2001-06-25 07:32:19 +0000172// InjectSimpleInductionVariable - Insert a cannonical induction variable into
173// the interval header Header. This assumes that the flow graph is in
174// simplified form (so we know that the header block has exactly 2 predecessors)
175//
176// TODO: This should inherit the largest type that is being used by the already
177// present induction variables (instead of always using uint)
178//
Chris Lattner1b7f7dc2002-04-28 16:21:30 +0000179static PHINode *InjectSimpleInductionVariable(Interval *Int) {
Chris Lattner697954c2002-01-20 22:54:45 +0000180 std::string PHIName, AddName;
Chris Lattnerd473a0a2001-06-25 07:32:19 +0000181
182 BasicBlock *Header = Int->getHeaderNode();
Chris Lattner79df7c02002-03-26 18:01:55 +0000183 Function *M = Header->getParent();
Chris Lattnerd473a0a2001-06-25 07:32:19 +0000184
185 if (M->hasSymbolTable()) {
Chris Lattnerf57b8452002-04-27 06:56:12 +0000186 // Only name the induction variable if the function isn't stripped.
Chris Lattner237e6d12002-04-08 22:03:00 +0000187 PHIName = "ind_var";
188 AddName = "ind_var_next";
Chris Lattnerd473a0a2001-06-25 07:32:19 +0000189 }
190
191 // Create the neccesary instructions...
192 PHINode *PN = new PHINode(Type::UIntTy, PHIName);
Chris Lattnere9bb2df2001-12-03 22:26:30 +0000193 Constant *One = ConstantUInt::get(Type::UIntTy, 1);
194 Constant *Zero = ConstantUInt::get(Type::UIntTy, 0);
Chris Lattnerd473a0a2001-06-25 07:32:19 +0000195 BinaryOperator *AddNode = BinaryOperator::create(Instruction::Add,
196 PN, One, AddName);
197
198 // Figure out which predecessors I have to play with... there should be
199 // exactly two... one of which is a loop predecessor, and one of which is not.
200 //
Chris Lattner455889a2002-02-12 22:39:50 +0000201 pred_iterator PI = pred_begin(Header);
202 assert(PI != pred_end(Header) && "Header node should have 2 preds!");
Chris Lattnerd473a0a2001-06-25 07:32:19 +0000203 BasicBlock *Pred1 = *PI; ++PI;
Chris Lattner455889a2002-02-12 22:39:50 +0000204 assert(PI != pred_end(Header) && "Header node should have 2 preds!");
Chris Lattnerd473a0a2001-06-25 07:32:19 +0000205 BasicBlock *Pred2 = *PI;
Chris Lattner455889a2002-02-12 22:39:50 +0000206 assert(++PI == pred_end(Header) && "Header node should have 2 preds!");
Chris Lattnerd473a0a2001-06-25 07:32:19 +0000207
208 // Make Pred1 be the loop entrance predecessor, Pred2 be the Loop predecessor
Chris Lattner697954c2002-01-20 22:54:45 +0000209 if (Int->contains(Pred1)) std::swap(Pred1, Pred2);
Chris Lattnerd473a0a2001-06-25 07:32:19 +0000210
211 assert(!Int->contains(Pred1) && "Pred1 should be loop entrance!");
212 assert( Int->contains(Pred2) && "Pred2 should be looping edge!");
213
214 // Link the instructions into the PHI node...
215 PN->addIncoming(Zero, Pred1); // The initializer is first argument
216 PN->addIncoming(AddNode, Pred2); // The step size is second PHI argument
217
218 // Insert the PHI node into the Header of the loop. It shall be the first
219 // instruction, because the "Simple" Induction Variable must be first in the
220 // block.
221 //
222 BasicBlock::InstListType &IL = Header->getInstList();
223 IL.push_front(PN);
224
225 // Insert the Add instruction as the first (non-phi) instruction in the
226 // header node's basic block.
Chris Lattner3b34c592001-06-27 23:36:09 +0000227 BasicBlock::iterator I = IL.begin();
Chris Lattnerb00c5822001-10-02 03:41:24 +0000228 while (isa<PHINode>(*I)) ++I;
Chris Lattnerd473a0a2001-06-25 07:32:19 +0000229 IL.insert(I, AddNode);
Chris Lattnerd473a0a2001-06-25 07:32:19 +0000230 return PN;
231}
232
Chris Lattner364b1472001-06-22 02:24:38 +0000233// ProcessInterval - This function is invoked once for each interval in the
234// IntervalPartition of the program. It looks for auxilliary induction
235// variables in loops. If it finds one, it:
236// * Cannonicalizes the induction variable. This consists of:
237// A. Making the first element of the PHI node be the loop invariant
238// computation, and the second element be the linear induction portion.
239// B. Changing the first element of the linear induction portion of the PHI
240// node to be of the form ADD(PHI, <loop invariant expr>).
241// * Add the induction variable PHI to a list of induction variables found.
242//
243// After this, a list of cannonical induction variables is known. This list
244// is searched to see if there is an induction variable that counts from
245// constant 0 with a step size of constant 1. If there is not one, one is
246// injected into the loop. Thus a "simple" induction variable is always known
247//
248// One a simple induction variable is known, all other induction variables are
249// modified to refer to the "simple" induction variable.
250//
Chris Lattner1b7f7dc2002-04-28 16:21:30 +0000251static bool ProcessInterval(Interval *Int) {
Chris Lattner364b1472001-06-22 02:24:38 +0000252 if (!Int->isLoop()) return false; // Not a loop? Ignore it!
253
Chris Lattner697954c2002-01-20 22:54:45 +0000254 std::vector<PHINode *> InductionVars;
Chris Lattner364b1472001-06-22 02:24:38 +0000255
256 BasicBlock *Header = Int->getHeaderNode();
257 // Loop over all of the PHI nodes in the interval header...
Chris Lattner3b34c592001-06-27 23:36:09 +0000258 for (BasicBlock::iterator I = Header->begin(), E = Header->end();
Chris Lattnerb00c5822001-10-02 03:41:24 +0000259 I != E && isa<PHINode>(*I); ++I) {
260 PHINode *PN = cast<PHINode>(*I);
Chris Lattner364b1472001-06-22 02:24:38 +0000261 if (PN->getNumIncomingValues() != 2) { // These should be eliminated by now.
262 cerr << "Found interval header with more than 2 predecessors! Ignoring\n";
263 return false; // Todo, make an assertion.
264 }
265
266 // For this to be an induction variable, one of the arguments must be a
267 // loop invariant expression, and the other must be an expression involving
268 // the PHI node, along with possible additions and subtractions of loop
269 // invariant values.
270 //
271 BasicBlock *BB1 = PN->getIncomingBlock(0);
272 Value *V1 = PN->getIncomingValue(0);
273 BasicBlock *BB2 = PN->getIncomingBlock(1);
274 Value *V2 = PN->getIncomingValue(1);
275
276 // Figure out which computation is loop invariant...
277 if (!isLoopInvariant(Int, V1)) {
278 // V1 is *not* loop invariant. Check to see if V2 is:
279 if (isLoopInvariant(Int, V2)) {
280 // They *are* loop invariant. Exchange BB1/BB2 and V1/V2 so that
281 // V1 is always the loop invariant computation.
Chris Lattner697954c2002-01-20 22:54:45 +0000282 std::swap(V1, V2); std::swap(BB1, BB2);
Chris Lattner364b1472001-06-22 02:24:38 +0000283 } else {
284 // Neither value is loop invariant. Must not be an induction variable.
285 // This case can happen if there is an unreachable loop in the CFG that
286 // has two tail loops in it that was not split by the cleanup phase
287 // before.
288 continue;
289 }
290 }
291
292 // At this point, we know that BB1/V1 are loop invariant. We don't know
293 // anything about BB2/V2. Check now to see if V2 is a linear induction
294 // variable.
295 //
Chris Lattner697954c2002-01-20 22:54:45 +0000296 cerr << "Found loop invariant computation: " << V1 << "\n";
Chris Lattner364b1472001-06-22 02:24:38 +0000297
298 if (!isLinearInductionVariable(Int, V2, PN))
299 continue; // No, it is not a linear ind var, ignore the PHI node.
300 cerr << "Found linear induction variable: " << V2;
301
302 // TODO: Cannonicalize V2
303
304 // Add this PHI node to the list of induction variables found...
305 InductionVars.push_back(PN);
306 }
307
308 // No induction variables found?
309 if (InductionVars.empty()) return false;
310
Chris Lattner364b1472001-06-22 02:24:38 +0000311 // Search to see if there is already a "simple" induction variable.
Chris Lattner697954c2002-01-20 22:54:45 +0000312 std::vector<PHINode*>::iterator It =
Chris Lattner364b1472001-06-22 02:24:38 +0000313 find_if(InductionVars.begin(), InductionVars.end(), isSimpleInductionVar);
314
Chris Lattnerc9f39b22001-06-24 04:05:45 +0000315 PHINode *PrimaryIndVar;
316
Chris Lattner364b1472001-06-22 02:24:38 +0000317 // A simple induction variable was not found, inject one now...
318 if (It == InductionVars.end()) {
Chris Lattnerd473a0a2001-06-25 07:32:19 +0000319 PrimaryIndVar = InjectSimpleInductionVariable(Int);
Chris Lattnerc9f39b22001-06-24 04:05:45 +0000320 } else {
321 // Move the PHI node for this induction variable to the start of the PHI
322 // list in HeaderNode... we do not need to do this for the inserted case
323 // because the inserted node will always be placed at the beginning of
324 // HeaderNode.
325 //
326 PrimaryIndVar = *It;
Chris Lattner3b34c592001-06-27 23:36:09 +0000327 BasicBlock::iterator i =
328 find(Header->begin(), Header->end(), PrimaryIndVar);
329 assert(i != Header->end() &&
Chris Lattnerc9f39b22001-06-24 04:05:45 +0000330 "How could Primary IndVar not be in the header!?!!?");
331
Chris Lattner3b34c592001-06-27 23:36:09 +0000332 if (i != Header->begin())
Chris Lattner697954c2002-01-20 22:54:45 +0000333 std::iter_swap(i, Header->begin());
Chris Lattner364b1472001-06-22 02:24:38 +0000334 }
335
Chris Lattnerc9f39b22001-06-24 04:05:45 +0000336 // Now we know that there is a simple induction variable PrimaryIndVar.
337 // Simplify all of the other induction variables to use this induction
338 // variable as their counter, and destroy the PHI nodes that correspond to
339 // the old indvars.
Chris Lattner364b1472001-06-22 02:24:38 +0000340 //
341 // TODO
342
Chris Lattnerc9f39b22001-06-24 04:05:45 +0000343
344 cerr << "Found Interval Header with indvars (primary indvar should be first "
Chris Lattner3b34c592001-06-27 23:36:09 +0000345 << "phi): \n" << Header << "\nPrimaryIndVar: " << PrimaryIndVar;
Chris Lattnerc9f39b22001-06-24 04:05:45 +0000346
Chris Lattner364b1472001-06-22 02:24:38 +0000347 return false; // TODO: true;
348}
349
350
351// ProcessIntervalPartition - This function loops over the interval partition
352// processing each interval with ProcessInterval
353//
Chris Lattner1b7f7dc2002-04-28 16:21:30 +0000354static bool ProcessIntervalPartition(IntervalPartition &IP) {
Chris Lattnerda956802001-06-21 05:27:22 +0000355 // This currently just prints out information about the interval structure
Chris Lattnerf57b8452002-04-27 06:56:12 +0000356 // of the function...
Chris Lattnerd473a0a2001-06-25 07:32:19 +0000357#if 0
Chris Lattnerda956802001-06-21 05:27:22 +0000358 static unsigned N = 0;
359 cerr << "\n***********Interval Partition #" << (++N) << "************\n\n";
Chris Lattner1b7f7dc2002-04-28 16:21:30 +0000360 copy(IP.begin(), IP.end(), ostream_iterator<Interval*>(cerr, "\n"));
Chris Lattnerda956802001-06-21 05:27:22 +0000361
362 cerr << "\n*********** PERFORMING WORK ************\n\n";
Chris Lattnerd473a0a2001-06-25 07:32:19 +0000363#endif
Chris Lattnerda956802001-06-21 05:27:22 +0000364 // Loop over all of the intervals in the partition and look for induction
365 // variables in intervals that represent loops.
366 //
367 return reduce_apply(IP.begin(), IP.end(), bitwise_or<bool>(), false,
Chris Lattner697954c2002-01-20 22:54:45 +0000368 std::ptr_fun(ProcessInterval));
Chris Lattnerd213f0f2001-06-20 19:27:11 +0000369}
370
Chris Lattner364b1472001-06-22 02:24:38 +0000371// DoInductionVariableCannonicalize - Simplify induction variables in loops.
372// This function loops over an interval partition of a program, reducing it
373// until the graph is gone.
Chris Lattnerd213f0f2001-06-20 19:27:11 +0000374//
Chris Lattner1b7f7dc2002-04-28 16:21:30 +0000375bool InductionVariableCannonicalize::doIt(Function *M, IntervalPartition &IP) {
376
Chris Lattnerda956802001-06-21 05:27:22 +0000377 bool Changed = false;
Chris Lattnerd213f0f2001-06-20 19:27:11 +0000378
Chris Lattner793c6b82002-01-31 00:45:11 +0000379#if 0
Chris Lattnerda956802001-06-21 05:27:22 +0000380 while (!IP->isDegeneratePartition()) {
381 Changed |= ProcessIntervalPartition(*IP);
Chris Lattner56832052001-06-20 22:44:38 +0000382
Chris Lattnerda956802001-06-21 05:27:22 +0000383 // Calculate the reduced version of this graph until we get to an
384 // irreducible graph or a degenerate graph...
385 //
Chris Lattner1b7f7dc2002-04-28 16:21:30 +0000386 IntervalPartition *NewIP = new IntervalPartition(*IP, false);
Chris Lattnerda956802001-06-21 05:27:22 +0000387 if (NewIP->size() == IP->size()) {
388 cerr << "IRREDUCIBLE GRAPH FOUND!!!\n";
389 return Changed;
390 }
391 delete IP;
392 IP = NewIP;
393 }
Chris Lattner56832052001-06-20 22:44:38 +0000394
Chris Lattnerda956802001-06-21 05:27:22 +0000395 delete IP;
Chris Lattner793c6b82002-01-31 00:45:11 +0000396#endif
Chris Lattnerda956802001-06-21 05:27:22 +0000397 return Changed;
Chris Lattnerd213f0f2001-06-20 19:27:11 +0000398}
Chris Lattner793c6b82002-01-31 00:45:11 +0000399
400
Chris Lattnerf57b8452002-04-27 06:56:12 +0000401bool InductionVariableCannonicalize::runOnFunction(Function *F) {
Chris Lattner1b7f7dc2002-04-28 16:21:30 +0000402 return doIt(F, getAnalysis<IntervalPartition>());
Chris Lattner793c6b82002-01-31 00:45:11 +0000403}
404
Chris Lattnerf57b8452002-04-27 06:56:12 +0000405// getAnalysisUsage - This function works on the call graph of a module.
Chris Lattner793c6b82002-01-31 00:45:11 +0000406// It is capable of updating the call graph to reflect the new state of the
407// module.
408//
Chris Lattnerf57b8452002-04-27 06:56:12 +0000409void InductionVariableCannonicalize::getAnalysisUsage(AnalysisUsage &AU) const {
Chris Lattner1b7f7dc2002-04-28 16:21:30 +0000410 AU.addRequired(IntervalPartition::ID);
Chris Lattner793c6b82002-01-31 00:45:11 +0000411}