IndVarSimplify.cpp revision 20aa098ba694aa7e3f5fb5a52d22dba7c1e857ae
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.
18840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  if (L->getExitBlocks().size() != 1) return;
18940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  BasicBlock *ExitBlock = L->getExitBlocks()[0];
19040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
19140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // Make sure there is only one predecessor block in the loop.
19240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  BasicBlock *ExitingBlock = 0;
19340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  for (pred_iterator PI = pred_begin(ExitBlock), PE = pred_end(ExitBlock);
19440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner       PI != PE; ++PI)
19540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    if (L->contains(*PI)) {
19640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      if (ExitingBlock == 0)
19740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner        ExitingBlock = *PI;
19840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      else
19940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner        return;  // Multiple exits from loop to this block.
20040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    }
20140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  assert(ExitingBlock && "Loop info is broken");
20240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
20340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  if (!isa<BranchInst>(ExitingBlock->getTerminator()))
20440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    return;  // Can't rewrite non-branch yet
20540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  BranchInst *BI = cast<BranchInst>(ExitingBlock->getTerminator());
20640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  assert(BI->isConditional() && "Must be conditional to be part of loop!");
20740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
20840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  std::set<Instruction*> InstructionsToDelete;
20940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  if (Instruction *Cond = dyn_cast<Instruction>(BI->getCondition()))
21040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    InstructionsToDelete.insert(Cond);
21140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
212d244057a48660c3cd30d219118ece3f947947790Chris Lattner  // If the exiting block is not the same as the backedge block, we must compare
213d244057a48660c3cd30d219118ece3f947947790Chris Lattner  // against the preincremented value, otherwise we prefer to compare against
214d244057a48660c3cd30d219118ece3f947947790Chris Lattner  // the post-incremented value.
215d244057a48660c3cd30d219118ece3f947947790Chris Lattner  BasicBlock *Header = L->getHeader();
216d244057a48660c3cd30d219118ece3f947947790Chris Lattner  pred_iterator HPI = pred_begin(Header);
217d244057a48660c3cd30d219118ece3f947947790Chris Lattner  assert(HPI != pred_end(Header) && "Loop with zero preds???");
218d244057a48660c3cd30d219118ece3f947947790Chris Lattner  if (!L->contains(*HPI)) ++HPI;
219d244057a48660c3cd30d219118ece3f947947790Chris Lattner  assert(HPI != pred_end(Header) && L->contains(*HPI) &&
220d244057a48660c3cd30d219118ece3f947947790Chris Lattner         "No backedge in loop?");
221d244057a48660c3cd30d219118ece3f947947790Chris Lattner
222d244057a48660c3cd30d219118ece3f947947790Chris Lattner  SCEVHandle TripCount = IterationCount;
223d244057a48660c3cd30d219118ece3f947947790Chris Lattner  Value *IndVar;
224d244057a48660c3cd30d219118ece3f947947790Chris Lattner  if (*HPI == ExitingBlock) {
225d244057a48660c3cd30d219118ece3f947947790Chris Lattner    // The IterationCount expression contains the number of times that the
226d244057a48660c3cd30d219118ece3f947947790Chris Lattner    // backedge actually branches to the loop header.  This is one less than the
227d244057a48660c3cd30d219118ece3f947947790Chris Lattner    // number of times the loop executes, so add one to it.
228d244057a48660c3cd30d219118ece3f947947790Chris Lattner    Constant *OneC = ConstantInt::get(IterationCount->getType(), 1);
229d244057a48660c3cd30d219118ece3f947947790Chris Lattner    TripCount = SCEVAddExpr::get(IterationCount, SCEVUnknown::get(OneC));
230d244057a48660c3cd30d219118ece3f947947790Chris Lattner    IndVar = L->getCanonicalInductionVariableIncrement();
231d244057a48660c3cd30d219118ece3f947947790Chris Lattner  } else {
232d244057a48660c3cd30d219118ece3f947947790Chris Lattner    // We have to use the preincremented value...
233d244057a48660c3cd30d219118ece3f947947790Chris Lattner    IndVar = L->getCanonicalInductionVariable();
234d244057a48660c3cd30d219118ece3f947947790Chris Lattner  }
23559fdaeeae8f183e18bb6ad5c382ca23e28e6aaf6Chris Lattner
23640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // Expand the code for the iteration count into the preheader of the loop.
23740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  BasicBlock *Preheader = L->getLoopPreheader();
23859fdaeeae8f183e18bb6ad5c382ca23e28e6aaf6Chris Lattner  Value *ExitCnt = RW.ExpandCodeFor(TripCount, Preheader->getTerminator(),
23940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                                    IndVar->getType());
24040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
24140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // Insert a new setne or seteq instruction before the branch.
24240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  Instruction::BinaryOps Opcode;
24340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  if (L->contains(BI->getSuccessor(0)))
24440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    Opcode = Instruction::SetNE;
24540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  else
24640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    Opcode = Instruction::SetEQ;
24740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
24840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  Value *Cond = new SetCondInst(Opcode, IndVar, ExitCnt, "exitcond", BI);
24940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  BI->setCondition(Cond);
25040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  ++NumLFTR;
25140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  Changed = true;
25240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
25340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  DeleteTriviallyDeadInstructions(InstructionsToDelete);
25440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner}
2553324e718bc9ac2ede08a14c325848b576849542bChris Lattner
2563324e718bc9ac2ede08a14c325848b576849542bChris Lattner
25740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner/// RewriteLoopExitValues - Check to see if this loop has a computable
25840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner/// loop-invariant execution count.  If so, this means that we can compute the
25940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner/// final value of any expressions that are recurrent in the loop, and
26040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner/// substitute the exit values from the loop into any instructions outside of
26140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner/// the loop that use the final values of the current expressions.
26240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattnervoid IndVarSimplify::RewriteLoopExitValues(Loop *L) {
26340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  BasicBlock *Preheader = L->getLoopPreheader();
26440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
26540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // Scan all of the instructions in the loop, looking at those that have
26640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // extra-loop users and which are recurrences.
26740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  ScalarEvolutionRewriter Rewriter(*SE, *LI);
26840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
26940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // We insert the code into the preheader of the loop if the loop contains
27040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // multiple exit blocks, or in the exit block if there is exactly one.
27140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  BasicBlock *BlockToInsertInto;
27240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  if (L->getExitBlocks().size() == 1)
27340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    BlockToInsertInto = L->getExitBlocks()[0];
27440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  else
27540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    BlockToInsertInto = Preheader;
27640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  BasicBlock::iterator InsertPt = BlockToInsertInto->begin();
27740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  while (isa<PHINode>(InsertPt)) ++InsertPt;
27840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
27920aa098ba694aa7e3f5fb5a52d22dba7c1e857aeChris Lattner  bool HasConstantItCount = isa<SCEVConstant>(SE->getIterationCount(L));
28020aa098ba694aa7e3f5fb5a52d22dba7c1e857aeChris Lattner
28140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  std::set<Instruction*> InstructionsToDelete;
28240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
28340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  for (unsigned i = 0, e = L->getBlocks().size(); i != e; ++i)
28440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    if (LI->getLoopFor(L->getBlocks()[i]) == L) {  // Not in a subloop...
28540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      BasicBlock *BB = L->getBlocks()[i];
28640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I)
28740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner        if (I->getType()->isInteger()) {      // Is an integer instruction
28840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner          SCEVHandle SH = SE->getSCEV(I);
28920aa098ba694aa7e3f5fb5a52d22dba7c1e857aeChris Lattner          if (SH->hasComputableLoopEvolution(L) ||    // Varies predictably
29020aa098ba694aa7e3f5fb5a52d22dba7c1e857aeChris Lattner              HasConstantItCount) {
29140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner            // Find out if this predictably varying value is actually used
29240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner            // outside of the loop.  "extra" as opposed to "intra".
29340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner            std::vector<User*> ExtraLoopUsers;
29440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner            for (Value::use_iterator UI = I->use_begin(), E = I->use_end();
29540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                 UI != E; ++UI)
29640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner              if (!L->contains(cast<Instruction>(*UI)->getParent()))
29740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                ExtraLoopUsers.push_back(*UI);
29840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner            if (!ExtraLoopUsers.empty()) {
29940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner              // Okay, this instruction has a user outside of the current loop
30040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner              // and varies predictably in this loop.  Evaluate the value it
30140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner              // contains when the loop exits, and insert code for it.
30220aa098ba694aa7e3f5fb5a52d22dba7c1e857aeChris Lattner              SCEVHandle ExitValue = SE->getSCEVAtScope(I, L->getParentLoop());
30340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner              if (!isa<SCEVCouldNotCompute>(ExitValue)) {
30440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                Changed = true;
30540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                ++NumReplaced;
30640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                Value *NewVal = Rewriter.ExpandCodeFor(ExitValue, InsertPt,
30740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                                                       I->getType());
30840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
30940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                // Rewrite any users of the computed value outside of the loop
31040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                // with the newly computed value.
31140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                for (unsigned i = 0, e = ExtraLoopUsers.size(); i != e; ++i)
31240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                  ExtraLoopUsers[i]->replaceUsesOfWith(I, NewVal);
31340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
31440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                // If this instruction is dead now, schedule it to be removed.
31540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                if (I->use_empty())
31640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                  InstructionsToDelete.insert(I);
31740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner              }
31840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner            }
31940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner          }
32040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner        }
3213324e718bc9ac2ede08a14c325848b576849542bChris Lattner    }
3226148c02591bd83da7b957589c4bbf6f9720d503fChris Lattner
32340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  DeleteTriviallyDeadInstructions(InstructionsToDelete);
32440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner}
32515cad759fe2048ac5eb137c6bb0ab7287538677eChris Lattner
32615cad759fe2048ac5eb137c6bb0ab7287538677eChris Lattner
32740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattnervoid IndVarSimplify::runOnLoop(Loop *L) {
32840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // First step.  Check to see if there are any trivial GEP pointer recurrences.
32940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // If there are, change them into integer recurrences, permitting analysis by
33040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // the SCEV routines.
33115cad759fe2048ac5eb137c6bb0ab7287538677eChris Lattner  //
33240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  BasicBlock *Header    = L->getHeader();
33340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  BasicBlock *Preheader = L->getLoopPreheader();
33440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
33540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  std::set<Instruction*> DeadInsts;
33640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  for (BasicBlock::iterator I = Header->begin();
33740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner       PHINode *PN = dyn_cast<PHINode>(I); ++I)
33840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    if (isa<PointerType>(PN->getType()))
33940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      EliminatePointerRecurrence(PN, Preheader, DeadInsts);
34015cad759fe2048ac5eb137c6bb0ab7287538677eChris Lattner
34140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  if (!DeadInsts.empty())
34240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    DeleteTriviallyDeadInstructions(DeadInsts);
343394437ff7eaccfe1de92fe14d0022ca0addf3e41Chris Lattner
344394437ff7eaccfe1de92fe14d0022ca0addf3e41Chris Lattner
34540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // Next, transform all loops nesting inside of this loop.
34640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  for (LoopInfo::iterator I = L->begin(), E = L->end(); I != E; ++I)
34740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    runOnLoop(*I);
348394437ff7eaccfe1de92fe14d0022ca0addf3e41Chris Lattner
34940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // Check to see if this loop has a computable loop-invariant execution count.
35040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // If so, this means that we can compute the final value of any expressions
35140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // that are recurrent in the loop, and substitute the exit values from the
35240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // loop into any instructions outside of the loop that use the final values of
35340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // the current expressions.
354394437ff7eaccfe1de92fe14d0022ca0addf3e41Chris Lattner  //
35540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  SCEVHandle IterationCount = SE->getIterationCount(L);
35640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  if (!isa<SCEVCouldNotCompute>(IterationCount))
35740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    RewriteLoopExitValues(L);
35840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
35940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // Next, analyze all of the induction variables in the loop, canonicalizing
36040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // auxillary induction variables.
36140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  std::vector<std::pair<PHINode*, SCEVHandle> > IndVars;
36240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
36340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  for (BasicBlock::iterator I = Header->begin();
36440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner       PHINode *PN = dyn_cast<PHINode>(I); ++I)
36540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    if (PN->getType()->isInteger()) {  // FIXME: when we have fast-math, enable!
36640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      SCEVHandle SCEV = SE->getSCEV(PN);
36740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      if (SCEV->hasComputableLoopEvolution(L))
36840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner        if (SE->shouldSubstituteIndVar(SCEV))  // HACK!
36940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner          IndVars.push_back(std::make_pair(PN, SCEV));
37040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    }
371f016ea4ff80c56c467247a90567dd07bddb590f3Chris Lattner
37240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // If there are no induction variables in the loop, there is nothing more to
37340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // do.
374f50af088f19f525f3d1026eb61db77e0037a9f43Chris Lattner  if (IndVars.empty()) {
375f50af088f19f525f3d1026eb61db77e0037a9f43Chris Lattner    // Actually, if we know how many times the loop iterates, lets insert a
376f50af088f19f525f3d1026eb61db77e0037a9f43Chris Lattner    // canonical induction variable to help subsequent passes.
377f50af088f19f525f3d1026eb61db77e0037a9f43Chris Lattner    if (!isa<SCEVCouldNotCompute>(IterationCount)) {
378f50af088f19f525f3d1026eb61db77e0037a9f43Chris Lattner      ScalarEvolutionRewriter Rewriter(*SE, *LI);
379f50af088f19f525f3d1026eb61db77e0037a9f43Chris Lattner      Rewriter.GetOrInsertCanonicalInductionVariable(L,
380f50af088f19f525f3d1026eb61db77e0037a9f43Chris Lattner                                                     IterationCount->getType());
381f50af088f19f525f3d1026eb61db77e0037a9f43Chris Lattner      LinearFunctionTestReplace(L, IterationCount, Rewriter);
382f50af088f19f525f3d1026eb61db77e0037a9f43Chris Lattner    }
383f50af088f19f525f3d1026eb61db77e0037a9f43Chris Lattner    return;
384f50af088f19f525f3d1026eb61db77e0037a9f43Chris Lattner  }
385f016ea4ff80c56c467247a90567dd07bddb590f3Chris Lattner
38640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // Compute the type of the largest recurrence expression.
38740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  //
38840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  const Type *LargestType = IndVars[0].first->getType();
38940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  bool DifferingSizes = false;
39040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  for (unsigned i = 1, e = IndVars.size(); i != e; ++i) {
39140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    const Type *Ty = IndVars[i].first->getType();
39240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    DifferingSizes |= Ty->getPrimitiveSize() != LargestType->getPrimitiveSize();
39340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    if (Ty->getPrimitiveSize() > LargestType->getPrimitiveSize())
39440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      LargestType = Ty;
395500597a1c39e91a3020587318ed61e737b6c613aChris Lattner  }
396394437ff7eaccfe1de92fe14d0022ca0addf3e41Chris Lattner
39740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // Create a rewriter object which we'll use to transform the code with.
39840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  ScalarEvolutionRewriter Rewriter(*SE, *LI);
39940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
40040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // Now that we know the largest of of the induction variables in this loop,
40140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // insert a canonical induction variable of the largest size.
402006118fe8c73d8009d7952b84cabd50882ed0033Chris Lattner  LargestType = LargestType->getUnsignedVersion();
40340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  Value *IndVar = Rewriter.GetOrInsertCanonicalInductionVariable(L,LargestType);
40440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  ++NumInserted;
40540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  Changed = true;
40640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
40740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  if (!isa<SCEVCouldNotCompute>(IterationCount))
40859fdaeeae8f183e18bb6ad5c382ca23e28e6aaf6Chris Lattner    LinearFunctionTestReplace(L, IterationCount, Rewriter);
40940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
41040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner#if 0
41140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // If there were induction variables of other sizes, cast the primary
41240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // induction variable to the right size for them, avoiding the need for the
41340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // code evaluation methods to insert induction variables of different sizes.
41440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // FIXME!
41540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  if (DifferingSizes) {
41640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    std::map<unsigned, Value*> InsertedSizes;
41740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    for (unsigned i = 0, e = IndVars.size(); i != e; ++i) {
41840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    }
419500597a1c39e91a3020587318ed61e737b6c613aChris Lattner  }
42040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner#endif
42140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
42240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // Now that we have a canonical induction variable, we can rewrite any
42340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // recurrences in terms of the induction variable.  Start with the auxillary
42440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // induction variables, and recursively rewrite any of their uses.
42540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  BasicBlock::iterator InsertPt = Header->begin();
42640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  while (isa<PHINode>(InsertPt)) ++InsertPt;
42740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
42840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  while (!IndVars.empty()) {
42940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    PHINode *PN = IndVars.back().first;
43040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    Value *NewVal = Rewriter.ExpandCodeFor(IndVars.back().second, InsertPt,
43140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner                                           PN->getType());
43240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    // Replace the old PHI Node with the inserted computation.
43340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    PN->replaceAllUsesWith(NewVal);
43440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    DeadInsts.insert(PN);
43540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    IndVars.pop_back();
43640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    ++NumRemoved;
43740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    Changed = true;
438500597a1c39e91a3020587318ed61e737b6c613aChris Lattner  }
439ba4f3f6a419326df190599421fa149c90235cb72Chris Lattner
44040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  DeleteTriviallyDeadInstructions(DeadInsts);
44140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner
44240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // TODO: In the future we could replace all instructions in the loop body with
44340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // simpler expressions.  It's not clear how useful this would be though or if
44440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // the code expansion cost would be worth it!  We probably shouldn't do this
44540bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  // until we have a way to reuse expressions already in the code.
44640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner#if 0
44740bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner  for (unsigned i = 0, e = L->getBlocks().size(); i != e; ++i)
44840bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner    if (LI->getLoopFor(L->getBlocks()[i]) == L) {  // Not in a subloop...
44940bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      BasicBlock *BB = L->getBlocks()[i];
45040bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner      for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I)
45140bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner        if (I->getType()->isInteger() &&      // Is an integer instruction
45240bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner            !Rewriter.isInsertedInstruction(I)) {
45340bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner          SCEVHandle SH = SE->getSCEV(I);
45440bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner        }
455394437ff7eaccfe1de92fe14d0022ca0addf3e41Chris Lattner    }
45640bf8b48cdb9961898dba1bc67320be1e49e3da1Chris Lattner#endif
4576148c02591bd83da7b957589c4bbf6f9720d503fChris Lattner}
458