IndVarSimplify.cpp revision 5d461d20aea308471f2a31b718a274bfee28b60c
16148c02591bd83da7b957589c4bbf6f9720d503fChris Lattner//===- IndVarSimplify.cpp - Induction Variable Elimination ----------------===//
2b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//
3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//                     The LLVM Compiler Infrastructure
4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//
5b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// This file was developed by the LLVM research group and is distributed under
6b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details.
7b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//
8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===//
96148c02591bd83da7b957589c4bbf6f9720d503fChris Lattner//
1040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner// This transformation analyzes and transforms the induction variables (and
1140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner// computations derived from them) into simpler forms suitable for subsequent
1240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner// analysis and transformation.
1340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner//
1440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner// This transformation make the following changes to each loop with an
1540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner// identifiable induction variable:
1640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner//   1. All loops are transformed to have a SINGLE canonical induction variable
1740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner//      which starts at zero and steps by one.
1840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner//   2. The canonical induction variable is guaranteed to be the first PHI node
1940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner//      in the loop header block.
2040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner//   3. Any pointer arithmetic recurrences are raised to use array subscripts.
2140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner//
2240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner// If the trip count of a loop is computable, this pass also makes the following
2340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner// changes:
2440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner//   1. The exit condition for the loop is canonicalized to compare the
2540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner//      induction value against the exit value.  This turns loops like:
2640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner//        'for (i = 7; i*i < 1000; ++i)' into 'for (i = 0; i != 25; ++i)'
2740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner//   2. Any use outside of the loop of an expression derived from the indvar
2840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner//      is changed to compute the derived value outside of the loop, eliminating
2940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner//      the dependence on the exit value of the induction variable.  If the only
3040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner//      purpose of the loop is to compute the exit value of some derived
3140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner//      expression, this transformation will make the loop dead.
3240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner//
3340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner// This transformation should be followed by strength reduction after all of the
3440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner// desired loop transformations have been performed.  Additionally, on targets
3540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner// where it is profitable, the loop could be transformed to count down to zero
3640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner// (the "do loop" optimization).
376148c02591bd83da7b957589c4bbf6f9720d503fChris Lattner//
386148c02591bd83da7b957589c4bbf6f9720d503fChris Lattner//===----------------------------------------------------------------------===//
396148c02591bd83da7b957589c4bbf6f9720d503fChris Lattner
40022103b3f33febb7e54b8fdf2c9bc461eea78cbaChris Lattner#include "llvm/Transforms/Scalar.h"
4140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner#include "llvm/BasicBlock.h"
4259fdaeeae8f183e18bb6ad5c382ca23e28e6aaf6Chris Lattner#include "llvm/Constants.h"
4318b3c97bc773b24a66eb779e85da1820b0f16b31Chris Lattner#include "llvm/Instructions.h"
4440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner#include "llvm/Type.h"
4559fdaeeae8f183e18bb6ad5c382ca23e28e6aaf6Chris Lattner#include "llvm/Analysis/ScalarEvolutionExpressions.h"
4647df12d80db90e125e9f2ff764286ee11665476dJohn Criswell#include "llvm/Analysis/LoopInfo.h"
47455889aa79e3463a4b0f2161e3d9d72a683268b6Chris Lattner#include "llvm/Support/CFG.h"
4847df12d80db90e125e9f2ff764286ee11665476dJohn Criswell#include "llvm/Transforms/Utils/Local.h"
4940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner#include "Support/CommandLine.h"
50a92f696b74a99325026ebbdbffd2a44317e0c10bChris Lattner#include "Support/Statistic.h"
5147df12d80db90e125e9f2ff764286ee11665476dJohn Criswellusing namespace llvm;
52d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
535e76140536ba66fadeced1cd892f79616f407e3cChris Lattnernamespace {
54a92f696b74a99325026ebbdbffd2a44317e0c10bChris Lattner  Statistic<> NumRemoved ("indvars", "Number of aux indvars removed");
5540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  Statistic<> NumPointer ("indvars", "Number of pointer indvars promoted");
563adf51d022348b06a1adeef7649fa35928ad9358Chris Lattner  Statistic<> NumInserted("indvars", "Number of canonical indvars added");
5740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  Statistic<> NumReplaced("indvars", "Number of exit values replaced");
5840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  Statistic<> NumLFTR    ("indvars", "Number of loop exit tests replaced");
593324e718bc9ac2ede08a14c325848b576849542bChris Lattner
603324e718bc9ac2ede08a14c325848b576849542bChris Lattner  class IndVarSimplify : public FunctionPass {
6140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    LoopInfo        *LI;
6240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    ScalarEvolution *SE;
6315cad759fe2048ac5eb137c6bb0ab7287538677eChris Lattner    bool Changed;
643324e718bc9ac2ede08a14c325848b576849542bChris Lattner  public:
653324e718bc9ac2ede08a14c325848b576849542bChris Lattner    virtual bool runOnFunction(Function &) {
6640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      LI = &getAnalysis<LoopInfo>();
6740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      SE = &getAnalysis<ScalarEvolution>();
6815cad759fe2048ac5eb137c6bb0ab7287538677eChris Lattner      Changed = false;
6915cad759fe2048ac5eb137c6bb0ab7287538677eChris Lattner
703324e718bc9ac2ede08a14c325848b576849542bChris Lattner      // Induction Variables live in the header nodes of loops
7140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      for (LoopInfo::iterator I = LI->begin(), E = LI->end(); I != E; ++I)
72329c1c6c949d07e3fe9722ec633b4258217fd99dChris Lattner        runOnLoop(*I);
733324e718bc9ac2ede08a14c325848b576849542bChris Lattner      return Changed;
743324e718bc9ac2ede08a14c325848b576849542bChris Lattner    }
753324e718bc9ac2ede08a14c325848b576849542bChris Lattner
763324e718bc9ac2ede08a14c325848b576849542bChris Lattner    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
773324e718bc9ac2ede08a14c325848b576849542bChris Lattner      AU.addRequiredID(LoopSimplifyID);
7840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      AU.addRequired<ScalarEvolution>();
7940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      AU.addRequired<LoopInfo>();
803324e718bc9ac2ede08a14c325848b576849542bChris Lattner      AU.addPreservedID(LoopSimplifyID);
813324e718bc9ac2ede08a14c325848b576849542bChris Lattner      AU.setPreservesCFG();
823324e718bc9ac2ede08a14c325848b576849542bChris Lattner    }
8340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  private:
8440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    void runOnLoop(Loop *L);
8540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    void EliminatePointerRecurrence(PHINode *PN, BasicBlock *Preheader,
8640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                                    std::set<Instruction*> &DeadInsts);
8740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    void LinearFunctionTestReplace(Loop *L, SCEV *IterationCount,
8859fdaeeae8f183e18bb6ad5c382ca23e28e6aaf6Chris Lattner                                   ScalarEvolutionRewriter &RW);
8940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    void RewriteLoopExitValues(Loop *L);
9040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
9140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    void DeleteTriviallyDeadInstructions(std::set<Instruction*> &Insts);
923324e718bc9ac2ede08a14c325848b576849542bChris Lattner  };
933324e718bc9ac2ede08a14c325848b576849542bChris Lattner  RegisterOpt<IndVarSimplify> X("indvars", "Canonicalize Induction Variables");
945e76140536ba66fadeced1cd892f79616f407e3cChris Lattner}
95394437ff7eaccfe1de92fe14d0022ca0addf3e41Chris Lattner
963324e718bc9ac2ede08a14c325848b576849542bChris LattnerPass *llvm::createIndVarSimplifyPass() {
973324e718bc9ac2ede08a14c325848b576849542bChris Lattner  return new IndVarSimplify();
98394437ff7eaccfe1de92fe14d0022ca0addf3e41Chris Lattner}
99394437ff7eaccfe1de92fe14d0022ca0addf3e41Chris Lattner
1003324e718bc9ac2ede08a14c325848b576849542bChris Lattner
10140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner/// DeleteTriviallyDeadInstructions - If any of the instructions is the
10240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner/// specified set are trivially dead, delete them and see if this makes any of
10340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner/// their operands subsequently dead.
10440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattnervoid IndVarSimplify::
10540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris LattnerDeleteTriviallyDeadInstructions(std::set<Instruction*> &Insts) {
10640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  while (!Insts.empty()) {
10740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    Instruction *I = *Insts.begin();
10840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    Insts.erase(Insts.begin());
10940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    if (isInstructionTriviallyDead(I)) {
11040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i)
11140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner        if (Instruction *U = dyn_cast<Instruction>(I->getOperand(i)))
11240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner          Insts.insert(U);
11340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      SE->deleteInstructionFromRecords(I);
11440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      I->getParent()->getInstList().erase(I);
11540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      Changed = true;
11640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    }
11740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  }
11840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner}
1193324e718bc9ac2ede08a14c325848b576849542bChris Lattner
1206148c02591bd83da7b957589c4bbf6f9720d503fChris Lattner
12140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner/// EliminatePointerRecurrence - Check to see if this is a trivial GEP pointer
12240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner/// recurrence.  If so, change it into an integer recurrence, permitting
12340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner/// analysis by the SCEV routines.
12440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattnervoid IndVarSimplify::EliminatePointerRecurrence(PHINode *PN,
12540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                                                BasicBlock *Preheader,
12640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                                            std::set<Instruction*> &DeadInsts) {
12740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  assert(PN->getNumIncomingValues() == 2 && "Noncanonicalized loop!");
12840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  unsigned PreheaderIdx = PN->getBasicBlockIndex(Preheader);
12940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  unsigned BackedgeIdx = PreheaderIdx^1;
13040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  if (GetElementPtrInst *GEPI =
13140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      dyn_cast<GetElementPtrInst>(PN->getIncomingValue(BackedgeIdx)))
13240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    if (GEPI->getOperand(0) == PN) {
13340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      assert(GEPI->getNumOperands() == 2 && "GEP types must mismatch!");
13440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
13540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      // Okay, we found a pointer recurrence.  Transform this pointer
13640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      // recurrence into an integer recurrence.  Compute the value that gets
13740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      // added to the pointer at every iteration.
13840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      Value *AddedVal = GEPI->getOperand(1);
13940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
14040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      // Insert a new integer PHI node into the top of the block.
14140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      PHINode *NewPhi = new PHINode(AddedVal->getType(),
14240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                                    PN->getName()+".rec", PN);
14340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      NewPhi->addIncoming(Constant::getNullValue(NewPhi->getType()),
14440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                          Preheader);
14540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      // Create the new add instruction.
14640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      Value *NewAdd = BinaryOperator::create(Instruction::Add, NewPhi,
14740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                                             AddedVal,
14840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                                             GEPI->getName()+".rec", GEPI);
14940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      NewPhi->addIncoming(NewAdd, PN->getIncomingBlock(BackedgeIdx));
15040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
15140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      // Update the existing GEP to use the recurrence.
15240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      GEPI->setOperand(0, PN->getIncomingValue(PreheaderIdx));
15340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
15440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      // Update the GEP to use the new recurrence we just inserted.
15540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      GEPI->setOperand(1, NewAdd);
15640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
15740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      // Finally, if there are any other users of the PHI node, we must
15840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      // insert a new GEP instruction that uses the pre-incremented version
15940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      // of the induction amount.
16040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      if (!PN->use_empty()) {
16140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner        BasicBlock::iterator InsertPos = PN; ++InsertPos;
16240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner        while (isa<PHINode>(InsertPos)) ++InsertPos;
16340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner        std::string Name = PN->getName(); PN->setName("");
16440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner        Value *PreInc =
16540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner          new GetElementPtrInst(PN->getIncomingValue(PreheaderIdx),
16640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                                std::vector<Value*>(1, NewPhi), Name,
16740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                                InsertPos);
16840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner        PN->replaceAllUsesWith(PreInc);
16940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      }
17040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
17140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      // Delete the old PHI for sure, and the GEP if its otherwise unused.
17240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      DeadInsts.insert(PN);
1733324e718bc9ac2ede08a14c325848b576849542bChris Lattner
17440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      ++NumPointer;
17540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      Changed = true;
17640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    }
17740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner}
1783324e718bc9ac2ede08a14c325848b576849542bChris Lattner
17940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner/// LinearFunctionTestReplace - This method rewrites the exit condition of the
18059fdaeeae8f183e18bb6ad5c382ca23e28e6aaf6Chris Lattner/// loop to be a canonical != comparison against the incremented loop induction
18159fdaeeae8f183e18bb6ad5c382ca23e28e6aaf6Chris Lattner/// variable.  This pass is able to rewrite the exit tests of any loop where the
18259fdaeeae8f183e18bb6ad5c382ca23e28e6aaf6Chris Lattner/// SCEV analysis can determine a loop-invariant trip count of the loop, which
18359fdaeeae8f183e18bb6ad5c382ca23e28e6aaf6Chris Lattner/// is actually a much broader range than just linear tests.
18440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattnervoid IndVarSimplify::LinearFunctionTestReplace(Loop *L, SCEV *IterationCount,
18540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                                               ScalarEvolutionRewriter &RW) {
18640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // Find the exit block for the loop.  We can currently only handle loops with
18740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // a single exit.
188f1ab4b4eac5603d19c20f4a508f93a118a52bdd5Chris Lattner  std::vector<BasicBlock*> ExitBlocks;
189f1ab4b4eac5603d19c20f4a508f93a118a52bdd5Chris Lattner  L->getExitBlocks(ExitBlocks);
190f1ab4b4eac5603d19c20f4a508f93a118a52bdd5Chris Lattner  if (ExitBlocks.size() != 1) return;
191f1ab4b4eac5603d19c20f4a508f93a118a52bdd5Chris Lattner  BasicBlock *ExitBlock = ExitBlocks[0];
19240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
19340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // Make sure there is only one predecessor block in the loop.
19440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  BasicBlock *ExitingBlock = 0;
19540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  for (pred_iterator PI = pred_begin(ExitBlock), PE = pred_end(ExitBlock);
19640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner       PI != PE; ++PI)
19740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    if (L->contains(*PI)) {
19840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      if (ExitingBlock == 0)
19940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner        ExitingBlock = *PI;
20040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      else
20140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner        return;  // Multiple exits from loop to this block.
20240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    }
20340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  assert(ExitingBlock && "Loop info is broken");
20440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
20540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  if (!isa<BranchInst>(ExitingBlock->getTerminator()))
20640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    return;  // Can't rewrite non-branch yet
20740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  BranchInst *BI = cast<BranchInst>(ExitingBlock->getTerminator());
20840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  assert(BI->isConditional() && "Must be conditional to be part of loop!");
20940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
21040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  std::set<Instruction*> InstructionsToDelete;
21140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  if (Instruction *Cond = dyn_cast<Instruction>(BI->getCondition()))
21240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    InstructionsToDelete.insert(Cond);
21340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
214d244057a48660c3cd30d219118ece3f947947790Chris Lattner  // If the exiting block is not the same as the backedge block, we must compare
215d244057a48660c3cd30d219118ece3f947947790Chris Lattner  // against the preincremented value, otherwise we prefer to compare against
216d244057a48660c3cd30d219118ece3f947947790Chris Lattner  // the post-incremented value.
217d244057a48660c3cd30d219118ece3f947947790Chris Lattner  BasicBlock *Header = L->getHeader();
218d244057a48660c3cd30d219118ece3f947947790Chris Lattner  pred_iterator HPI = pred_begin(Header);
219d244057a48660c3cd30d219118ece3f947947790Chris Lattner  assert(HPI != pred_end(Header) && "Loop with zero preds???");
220d244057a48660c3cd30d219118ece3f947947790Chris Lattner  if (!L->contains(*HPI)) ++HPI;
221d244057a48660c3cd30d219118ece3f947947790Chris Lattner  assert(HPI != pred_end(Header) && L->contains(*HPI) &&
222d244057a48660c3cd30d219118ece3f947947790Chris Lattner         "No backedge in loop?");
223d244057a48660c3cd30d219118ece3f947947790Chris Lattner
224d244057a48660c3cd30d219118ece3f947947790Chris Lattner  SCEVHandle TripCount = IterationCount;
225d244057a48660c3cd30d219118ece3f947947790Chris Lattner  Value *IndVar;
226d244057a48660c3cd30d219118ece3f947947790Chris Lattner  if (*HPI == ExitingBlock) {
227d244057a48660c3cd30d219118ece3f947947790Chris Lattner    // The IterationCount expression contains the number of times that the
228d244057a48660c3cd30d219118ece3f947947790Chris Lattner    // backedge actually branches to the loop header.  This is one less than the
229d244057a48660c3cd30d219118ece3f947947790Chris Lattner    // number of times the loop executes, so add one to it.
230d244057a48660c3cd30d219118ece3f947947790Chris Lattner    Constant *OneC = ConstantInt::get(IterationCount->getType(), 1);
231d244057a48660c3cd30d219118ece3f947947790Chris Lattner    TripCount = SCEVAddExpr::get(IterationCount, SCEVUnknown::get(OneC));
232d244057a48660c3cd30d219118ece3f947947790Chris Lattner    IndVar = L->getCanonicalInductionVariableIncrement();
233d244057a48660c3cd30d219118ece3f947947790Chris Lattner  } else {
234d244057a48660c3cd30d219118ece3f947947790Chris Lattner    // We have to use the preincremented value...
235d244057a48660c3cd30d219118ece3f947947790Chris Lattner    IndVar = L->getCanonicalInductionVariable();
236d244057a48660c3cd30d219118ece3f947947790Chris Lattner  }
23759fdaeeae8f183e18bb6ad5c382ca23e28e6aaf6Chris Lattner
23840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // Expand the code for the iteration count into the preheader of the loop.
23940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  BasicBlock *Preheader = L->getLoopPreheader();
24059fdaeeae8f183e18bb6ad5c382ca23e28e6aaf6Chris Lattner  Value *ExitCnt = RW.ExpandCodeFor(TripCount, Preheader->getTerminator(),
24140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                                    IndVar->getType());
24240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
24340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // Insert a new setne or seteq instruction before the branch.
24440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  Instruction::BinaryOps Opcode;
24540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  if (L->contains(BI->getSuccessor(0)))
24640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    Opcode = Instruction::SetNE;
24740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  else
24840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    Opcode = Instruction::SetEQ;
24940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
25040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  Value *Cond = new SetCondInst(Opcode, IndVar, ExitCnt, "exitcond", BI);
25140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  BI->setCondition(Cond);
25240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  ++NumLFTR;
25340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  Changed = true;
25440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
25540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  DeleteTriviallyDeadInstructions(InstructionsToDelete);
25640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner}
2573324e718bc9ac2ede08a14c325848b576849542bChris Lattner
2583324e718bc9ac2ede08a14c325848b576849542bChris Lattner
25940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner/// RewriteLoopExitValues - Check to see if this loop has a computable
26040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner/// loop-invariant execution count.  If so, this means that we can compute the
26140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner/// final value of any expressions that are recurrent in the loop, and
26240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner/// substitute the exit values from the loop into any instructions outside of
26340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner/// the loop that use the final values of the current expressions.
26440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattnervoid IndVarSimplify::RewriteLoopExitValues(Loop *L) {
26540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  BasicBlock *Preheader = L->getLoopPreheader();
26640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
26740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // Scan all of the instructions in the loop, looking at those that have
26840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // extra-loop users and which are recurrences.
26940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  ScalarEvolutionRewriter Rewriter(*SE, *LI);
27040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
27140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // We insert the code into the preheader of the loop if the loop contains
27240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // multiple exit blocks, or in the exit block if there is exactly one.
27340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  BasicBlock *BlockToInsertInto;
274f1ab4b4eac5603d19c20f4a508f93a118a52bdd5Chris Lattner  std::vector<BasicBlock*> ExitBlocks;
275f1ab4b4eac5603d19c20f4a508f93a118a52bdd5Chris Lattner  L->getExitBlocks(ExitBlocks);
276f1ab4b4eac5603d19c20f4a508f93a118a52bdd5Chris Lattner  if (ExitBlocks.size() == 1)
277f1ab4b4eac5603d19c20f4a508f93a118a52bdd5Chris Lattner    BlockToInsertInto = ExitBlocks[0];
27840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  else
27940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    BlockToInsertInto = Preheader;
28040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  BasicBlock::iterator InsertPt = BlockToInsertInto->begin();
28140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  while (isa<PHINode>(InsertPt)) ++InsertPt;
28240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
28320aa098ba694aa7e3f5fb5a52d22dba7c1e857aeChris Lattner  bool HasConstantItCount = isa<SCEVConstant>(SE->getIterationCount(L));
28420aa098ba694aa7e3f5fb5a52d22dba7c1e857aeChris Lattner
28540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  std::set<Instruction*> InstructionsToDelete;
28640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
28740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  for (unsigned i = 0, e = L->getBlocks().size(); i != e; ++i)
28840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    if (LI->getLoopFor(L->getBlocks()[i]) == L) {  // Not in a subloop...
28940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      BasicBlock *BB = L->getBlocks()[i];
29040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I)
29140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner        if (I->getType()->isInteger()) {      // Is an integer instruction
29240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner          SCEVHandle SH = SE->getSCEV(I);
29320aa098ba694aa7e3f5fb5a52d22dba7c1e857aeChris Lattner          if (SH->hasComputableLoopEvolution(L) ||    // Varies predictably
29420aa098ba694aa7e3f5fb5a52d22dba7c1e857aeChris Lattner              HasConstantItCount) {
29540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner            // Find out if this predictably varying value is actually used
29640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner            // outside of the loop.  "extra" as opposed to "intra".
29740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner            std::vector<User*> ExtraLoopUsers;
29840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner            for (Value::use_iterator UI = I->use_begin(), E = I->use_end();
29940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                 UI != E; ++UI)
30040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner              if (!L->contains(cast<Instruction>(*UI)->getParent()))
30140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                ExtraLoopUsers.push_back(*UI);
30240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner            if (!ExtraLoopUsers.empty()) {
30340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner              // Okay, this instruction has a user outside of the current loop
30440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner              // and varies predictably in this loop.  Evaluate the value it
30540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner              // contains when the loop exits, and insert code for it.
30620aa098ba694aa7e3f5fb5a52d22dba7c1e857aeChris Lattner              SCEVHandle ExitValue = SE->getSCEVAtScope(I, L->getParentLoop());
30740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner              if (!isa<SCEVCouldNotCompute>(ExitValue)) {
30840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                Changed = true;
30940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                ++NumReplaced;
31040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                Value *NewVal = Rewriter.ExpandCodeFor(ExitValue, InsertPt,
31140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                                                       I->getType());
31240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
31340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                // Rewrite any users of the computed value outside of the loop
31440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                // with the newly computed value.
31540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                for (unsigned i = 0, e = ExtraLoopUsers.size(); i != e; ++i)
31640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                  ExtraLoopUsers[i]->replaceUsesOfWith(I, NewVal);
31740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
31840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                // If this instruction is dead now, schedule it to be removed.
31940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                if (I->use_empty())
32040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                  InstructionsToDelete.insert(I);
32140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner              }
32240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner            }
32340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner          }
32440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner        }
3253324e718bc9ac2ede08a14c325848b576849542bChris Lattner    }
3266148c02591bd83da7b957589c4bbf6f9720d503fChris Lattner
32740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  DeleteTriviallyDeadInstructions(InstructionsToDelete);
32840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner}
32915cad759fe2048ac5eb137c6bb0ab7287538677eChris Lattner
33015cad759fe2048ac5eb137c6bb0ab7287538677eChris Lattner
33140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattnervoid IndVarSimplify::runOnLoop(Loop *L) {
33240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // First step.  Check to see if there are any trivial GEP pointer recurrences.
33340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // If there are, change them into integer recurrences, permitting analysis by
33440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // the SCEV routines.
33515cad759fe2048ac5eb137c6bb0ab7287538677eChris Lattner  //
33640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  BasicBlock *Header    = L->getHeader();
33740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  BasicBlock *Preheader = L->getLoopPreheader();
33840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
33940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  std::set<Instruction*> DeadInsts;
34040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  for (BasicBlock::iterator I = Header->begin();
34140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner       PHINode *PN = dyn_cast<PHINode>(I); ++I)
34240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    if (isa<PointerType>(PN->getType()))
34340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      EliminatePointerRecurrence(PN, Preheader, DeadInsts);
34415cad759fe2048ac5eb137c6bb0ab7287538677eChris Lattner
34540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  if (!DeadInsts.empty())
34640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    DeleteTriviallyDeadInstructions(DeadInsts);
347394437ff7eaccfe1de92fe14d0022ca0addf3e41Chris Lattner
348394437ff7eaccfe1de92fe14d0022ca0addf3e41Chris Lattner
34940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // Next, transform all loops nesting inside of this loop.
35040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  for (LoopInfo::iterator I = L->begin(), E = L->end(); I != E; ++I)
35140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    runOnLoop(*I);
352394437ff7eaccfe1de92fe14d0022ca0addf3e41Chris Lattner
35340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // Check to see if this loop has a computable loop-invariant execution count.
35440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // If so, this means that we can compute the final value of any expressions
35540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // that are recurrent in the loop, and substitute the exit values from the
35640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // loop into any instructions outside of the loop that use the final values of
35740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // the current expressions.
358394437ff7eaccfe1de92fe14d0022ca0addf3e41Chris Lattner  //
35940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  SCEVHandle IterationCount = SE->getIterationCount(L);
36040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  if (!isa<SCEVCouldNotCompute>(IterationCount))
36140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    RewriteLoopExitValues(L);
36240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
36340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // Next, analyze all of the induction variables in the loop, canonicalizing
36440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // auxillary induction variables.
36540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  std::vector<std::pair<PHINode*, SCEVHandle> > IndVars;
36640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
36740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  for (BasicBlock::iterator I = Header->begin();
36840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner       PHINode *PN = dyn_cast<PHINode>(I); ++I)
36940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    if (PN->getType()->isInteger()) {  // FIXME: when we have fast-math, enable!
37040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      SCEVHandle SCEV = SE->getSCEV(PN);
37140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      if (SCEV->hasComputableLoopEvolution(L))
37240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner        if (SE->shouldSubstituteIndVar(SCEV))  // HACK!
37340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner          IndVars.push_back(std::make_pair(PN, SCEV));
37440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    }
375f016ea4ff80c56c467247a90567dd07bddb590f3Chris Lattner
37640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // If there are no induction variables in the loop, there is nothing more to
37740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // do.
378f50af088f19f525f3d1026eb61db77e0037a9f43Chris Lattner  if (IndVars.empty()) {
379f50af088f19f525f3d1026eb61db77e0037a9f43Chris Lattner    // Actually, if we know how many times the loop iterates, lets insert a
380f50af088f19f525f3d1026eb61db77e0037a9f43Chris Lattner    // canonical induction variable to help subsequent passes.
381f50af088f19f525f3d1026eb61db77e0037a9f43Chris Lattner    if (!isa<SCEVCouldNotCompute>(IterationCount)) {
382f50af088f19f525f3d1026eb61db77e0037a9f43Chris Lattner      ScalarEvolutionRewriter Rewriter(*SE, *LI);
383f50af088f19f525f3d1026eb61db77e0037a9f43Chris Lattner      Rewriter.GetOrInsertCanonicalInductionVariable(L,
384f50af088f19f525f3d1026eb61db77e0037a9f43Chris Lattner                                                     IterationCount->getType());
385f50af088f19f525f3d1026eb61db77e0037a9f43Chris Lattner      LinearFunctionTestReplace(L, IterationCount, Rewriter);
386f50af088f19f525f3d1026eb61db77e0037a9f43Chris Lattner    }
387f50af088f19f525f3d1026eb61db77e0037a9f43Chris Lattner    return;
388f50af088f19f525f3d1026eb61db77e0037a9f43Chris Lattner  }
389f016ea4ff80c56c467247a90567dd07bddb590f3Chris Lattner
39040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // Compute the type of the largest recurrence expression.
39140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  //
39240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  const Type *LargestType = IndVars[0].first->getType();
39340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  for (unsigned i = 1, e = IndVars.size(); i != e; ++i) {
39440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    const Type *Ty = IndVars[i].first->getType();
39540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    if (Ty->getPrimitiveSize() > LargestType->getPrimitiveSize())
39640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      LargestType = Ty;
397500597a1c39e91a3020587318ed61e737b6c613aChris Lattner  }
398394437ff7eaccfe1de92fe14d0022ca0addf3e41Chris Lattner
39940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // Create a rewriter object which we'll use to transform the code with.
40040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  ScalarEvolutionRewriter Rewriter(*SE, *LI);
40140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
40240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // Now that we know the largest of of the induction variables in this loop,
40340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // insert a canonical induction variable of the largest size.
404006118fe8c73d8009d7952b84cabd50882ed0033Chris Lattner  LargestType = LargestType->getUnsignedVersion();
40540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  Value *IndVar = Rewriter.GetOrInsertCanonicalInductionVariable(L,LargestType);
40640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  ++NumInserted;
40740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  Changed = true;
40840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
40940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  if (!isa<SCEVCouldNotCompute>(IterationCount))
41059fdaeeae8f183e18bb6ad5c382ca23e28e6aaf6Chris Lattner    LinearFunctionTestReplace(L, IterationCount, Rewriter);
41140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
41240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // Now that we have a canonical induction variable, we can rewrite any
41340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // recurrences in terms of the induction variable.  Start with the auxillary
41440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // induction variables, and recursively rewrite any of their uses.
41540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  BasicBlock::iterator InsertPt = Header->begin();
41640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  while (isa<PHINode>(InsertPt)) ++InsertPt;
41740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
4185d461d20aea308471f2a31b718a274bfee28b60cChris Lattner  // If there were induction variables of other sizes, cast the primary
4195d461d20aea308471f2a31b718a274bfee28b60cChris Lattner  // induction variable to the right size for them, avoiding the need for the
4205d461d20aea308471f2a31b718a274bfee28b60cChris Lattner  // code evaluation methods to insert induction variables of different sizes.
4215d461d20aea308471f2a31b718a274bfee28b60cChris Lattner  std::map<unsigned, Value*> InsertedSizes;
4225d461d20aea308471f2a31b718a274bfee28b60cChris Lattner  InsertedSizes[LargestType->getPrimitiveSize()] = IndVar;
42340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  while (!IndVars.empty()) {
42440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    PHINode *PN = IndVars.back().first;
4255d461d20aea308471f2a31b718a274bfee28b60cChris Lattner
4265d461d20aea308471f2a31b718a274bfee28b60cChris Lattner    const Type *Ty = PN->getType()->getUnsignedVersion();
4275d461d20aea308471f2a31b718a274bfee28b60cChris Lattner    Value *&IV = InsertedSizes[Ty->getPrimitiveSize()];
4285d461d20aea308471f2a31b718a274bfee28b60cChris Lattner    if (IV == 0) {
4295d461d20aea308471f2a31b718a274bfee28b60cChris Lattner      // Insert a new cast instruction, which will hold this recurrence.
4305d461d20aea308471f2a31b718a274bfee28b60cChris Lattner      std::string Name = PN->getName();
4315d461d20aea308471f2a31b718a274bfee28b60cChris Lattner      PN->setName("");
4325d461d20aea308471f2a31b718a274bfee28b60cChris Lattner      IV = new CastInst(IndVar, Ty, Name, InsertPt);
4335d461d20aea308471f2a31b718a274bfee28b60cChris Lattner    }
4345d461d20aea308471f2a31b718a274bfee28b60cChris Lattner
4355d461d20aea308471f2a31b718a274bfee28b60cChris Lattner    Value *V = IV;
4365d461d20aea308471f2a31b718a274bfee28b60cChris Lattner    if (PN->getType() != Ty)
4375d461d20aea308471f2a31b718a274bfee28b60cChris Lattner      V = new CastInst(V, PN->getType(), V->getName(), InsertPt);
4385d461d20aea308471f2a31b718a274bfee28b60cChris Lattner
43940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    // Replace the old PHI Node with the inserted computation.
4405d461d20aea308471f2a31b718a274bfee28b60cChris Lattner    PN->replaceAllUsesWith(V);
44140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    DeadInsts.insert(PN);
44240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    IndVars.pop_back();
44340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    ++NumRemoved;
44440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    Changed = true;
445500597a1c39e91a3020587318ed61e737b6c613aChris Lattner  }
446ba4f3f6a419326df190599421fa149c90235cb72Chris Lattner
44740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  DeleteTriviallyDeadInstructions(DeadInsts);
44840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
44940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // TODO: In the future we could replace all instructions in the loop body with
45040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // simpler expressions.  It's not clear how useful this would be though or if
45140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // the code expansion cost would be worth it!  We probably shouldn't do this
45240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // until we have a way to reuse expressions already in the code.
45340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner#if 0
45440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  for (unsigned i = 0, e = L->getBlocks().size(); i != e; ++i)
45540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    if (LI->getLoopFor(L->getBlocks()[i]) == L) {  // Not in a subloop...
45640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      BasicBlock *BB = L->getBlocks()[i];
45740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I)
45840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner        if (I->getType()->isInteger() &&      // Is an integer instruction
45940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner            !Rewriter.isInsertedInstruction(I)) {
46040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner          SCEVHandle SH = SE->getSCEV(I);
46140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner        }
462394437ff7eaccfe1de92fe14d0022ca0addf3e41Chris Lattner    }
46340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner#endif
4646148c02591bd83da7b957589c4bbf6f9720d503fChris Lattner}
465