LICM.cpp revision cb2610ea037a17115ef3a01a6bdaab4e3cfdca27
1e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner//===-- LICM.cpp - Loop Invariant Code Motion Pass ------------------------===//
2e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner//
3e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner// This pass is a simple loop invariant code motion pass.
4e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner//
5e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner//===----------------------------------------------------------------------===//
6e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
7e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner#include "llvm/Transforms/Scalar.h"
8e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner#include "llvm/Transforms/Utils/Local.h"
9e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner#include "llvm/Analysis/LoopInfo.h"
10f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner#include "llvm/Analysis/AliasAnalysis.h"
11952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner#include "llvm/Analysis/Dominators.h"
12e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner#include "llvm/iOperators.h"
13f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner#include "llvm/iMemory.h"
14e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner#include "llvm/Support/InstVisitor.h"
15e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner#include "Support/STLExtras.h"
16a92f696b74a99325026ebbdbffd2a44317e0c10bChris Lattner#include "Support/Statistic.h"
17b461373fbcdc5909cc7331fa64791cd039de4bc8Chris Lattner#include "llvm/Assembly/Writer.h"
18e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner#include <algorithm>
195ba99bd124dc18302f527d6e2b0efd0fa866bc9eAnand Shuklausing std::string;
20e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
21e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattnernamespace {
22a92f696b74a99325026ebbdbffd2a44317e0c10bChris Lattner  Statistic<> NumHoisted("licm", "Number of instructions hoisted out of loop");
23a92f696b74a99325026ebbdbffd2a44317e0c10bChris Lattner  Statistic<> NumHoistedLoads("licm", "Number of load insts hoisted");
249646e6b6af1f924f9366a2bffc6dde102f84d231Chris Lattner
25e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  struct LICM : public FunctionPass, public InstVisitor<LICM> {
267e70829632f82de15db187845666aaca6e04b792Chris Lattner    virtual bool runOnFunction(Function &F);
27e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
2894170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    /// This transformation requires natural loop information & requires that
2994170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    /// loop preheaders be inserted into the CFG...
3094170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    ///
31e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
32cb2610ea037a17115ef3a01a6bdaab4e3cfdca27Chris Lattner      AU.setPreservesCFG();
33eb53ae4f2dc39e75e725b21b52d77d29cf1c11c9Chris Lattner      AU.addRequiredID(LoopPreheadersID);
345f0eb8da62308126d5b61e3eee5bee75b9dc5194Chris Lattner      AU.addRequired<LoopInfo>();
35952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner      AU.addRequired<DominatorTree>();
36f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner      AU.addRequired<AliasAnalysis>();
37e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner    }
38e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
39e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  private:
4099a57216a935a512c418032f590a4660bad9d846Chris Lattner    Loop *CurLoop;         // The current loop we are working on...
4199a57216a935a512c418032f590a4660bad9d846Chris Lattner    BasicBlock *Preheader; // The preheader block of the current loop...
4299a57216a935a512c418032f590a4660bad9d846Chris Lattner    bool Changed;          // Set to true when we change anything.
4399a57216a935a512c418032f590a4660bad9d846Chris Lattner    AliasAnalysis *AA;     // Currently AliasAnalysis information
44e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
4594170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    /// visitLoop - Hoist expressions out of the specified loop...
4694170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    ///
47e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner    void visitLoop(Loop *L);
48e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
49952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner    /// HoistRegion - Walk the specified region of the CFG (defined by all
50952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner    /// blocks dominated by the specified block, and that are in the current
51952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner    /// loop) in depth first order w.r.t the DominatorTree.  This allows us to
52952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner    /// visit defintions before uses, allowing us to hoist a loop body in one
53952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner    /// pass without iteration.
54952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner    ///
55952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner    void HoistRegion(DominatorTree::Node *N);
56952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner
57b461373fbcdc5909cc7331fa64791cd039de4bc8Chris Lattner    /// inSubLoop - Little predicate that returns true if the specified basic
58b461373fbcdc5909cc7331fa64791cd039de4bc8Chris Lattner    /// block is in a subloop of the current one, not the current one itself.
5994170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    ///
60b461373fbcdc5909cc7331fa64791cd039de4bc8Chris Lattner    bool inSubLoop(BasicBlock *BB) {
61b461373fbcdc5909cc7331fa64791cd039de4bc8Chris Lattner      assert(CurLoop->contains(BB) && "Only valid if BB is IN the loop");
62e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner      for (unsigned i = 0, e = CurLoop->getSubLoops().size(); i != e; ++i)
63e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner        if (CurLoop->getSubLoops()[i]->contains(BB))
64b461373fbcdc5909cc7331fa64791cd039de4bc8Chris Lattner          return true;  // A subloop actually contains this block!
65b461373fbcdc5909cc7331fa64791cd039de4bc8Chris Lattner      return false;
66e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner    }
67e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
6894170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    /// hoist - When an instruction is found to only use loop invariant operands
6994170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    /// that is safe to hoist, this instruction is called to do the dirty work.
7094170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    ///
717e70829632f82de15db187845666aaca6e04b792Chris Lattner    void hoist(Instruction &I);
72e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
7394170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    /// pointerInvalidatedByLoop - Return true if the body of this loop may
7494170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    /// store into the memory location pointed to by V.
7594170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    ///
76f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner    bool pointerInvalidatedByLoop(Value *V);
77f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner
7894170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    /// isLoopInvariant - Return true if the specified value is loop invariant
7994170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    ///
80e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner    inline bool isLoopInvariant(Value *V) {
81e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner      if (Instruction *I = dyn_cast<Instruction>(V))
82e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner        return !CurLoop->contains(I->getParent());
83e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner      return true;  // All non-instructions are loop invariant
84e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner    }
85e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
8694170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    /// Instruction visitation handlers... these basically control whether or
8794170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    /// not the specified instruction types are hoisted.
8894170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    ///
89e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner    friend class InstVisitor<LICM>;
907e70829632f82de15db187845666aaca6e04b792Chris Lattner    void visitBinaryOperator(Instruction &I) {
917e70829632f82de15db187845666aaca6e04b792Chris Lattner      if (isLoopInvariant(I.getOperand(0)) && isLoopInvariant(I.getOperand(1)))
92e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner        hoist(I);
93e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner    }
949b2b80fd48b10396be85a71735ffda0c155e5f72Chris Lattner    void visitCastInst(CastInst &CI) {
959b2b80fd48b10396be85a71735ffda0c155e5f72Chris Lattner      Instruction &I = (Instruction&)CI;
969b2b80fd48b10396be85a71735ffda0c155e5f72Chris Lattner      if (isLoopInvariant(I.getOperand(0))) hoist(I);
970513e9fe03f6e3c7d0272b8f4f82359e8d1a2e44Chris Lattner    }
987e70829632f82de15db187845666aaca6e04b792Chris Lattner    void visitShiftInst(ShiftInst &I) { visitBinaryOperator((Instruction&)I); }
99e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
100eb53ae4f2dc39e75e725b21b52d77d29cf1c11c9Chris Lattner    void visitLoadInst(LoadInst &LI);
101f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner
1027e70829632f82de15db187845666aaca6e04b792Chris Lattner    void visitGetElementPtrInst(GetElementPtrInst &GEPI) {
1037e70829632f82de15db187845666aaca6e04b792Chris Lattner      Instruction &I = (Instruction&)GEPI;
1047e70829632f82de15db187845666aaca6e04b792Chris Lattner      for (unsigned i = 0, e = I.getNumOperands(); i != e; ++i)
1057e70829632f82de15db187845666aaca6e04b792Chris Lattner        if (!isLoopInvariant(I.getOperand(i))) return;
106e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner      hoist(I);
107e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner    }
108e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  };
109f629309f74cf1a64aa7fd1cd5784fd7db9a8f59eChris Lattner
110a6275ccdf5e1aa208afde56c498e2b13e16442f0Chris Lattner  RegisterOpt<LICM> X("licm", "Loop Invariant Code Motion");
111e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner}
112e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
113e0e734eea052a4e8372e6f430ef41149128ba0a6Chris LattnerPass *createLICMPass() { return new LICM(); }
114e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
11594170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner/// runOnFunction - For LICM, this simply traverses the loop structure of the
11694170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner/// function, hoisting expressions out of loops if possible.
11794170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner///
1187e70829632f82de15db187845666aaca6e04b792Chris Lattnerbool LICM::runOnFunction(Function &) {
11999a57216a935a512c418032f590a4660bad9d846Chris Lattner  // Get information about the top level loops in the function...
120e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  const std::vector<Loop*> &TopLevelLoops =
121e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner    getAnalysis<LoopInfo>().getTopLevelLoops();
122e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
123f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner  // Get our alias analysis information...
124f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner  AA = &getAnalysis<AliasAnalysis>();
125f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner
126e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  // Traverse loops in postorder, hoisting expressions out of the deepest loops
127e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  // first.
128e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  //
129e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  Changed = false;
130e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  std::for_each(TopLevelLoops.begin(), TopLevelLoops.end(),
131e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner                bind_obj(this, &LICM::visitLoop));
132e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  return Changed;
133e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner}
134e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
13594170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner
13694170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner/// visitLoop - Hoist expressions out of the specified loop...
13794170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner///
138e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattnervoid LICM::visitLoop(Loop *L) {
139e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  // Recurse through all subloops before we process this loop...
140e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  std::for_each(L->getSubLoops().begin(), L->getSubLoops().end(),
141e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner                bind_obj(this, &LICM::visitLoop));
142e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  CurLoop = L;
143e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
14499a57216a935a512c418032f590a4660bad9d846Chris Lattner  // Get the preheader block to move instructions into...
14599a57216a935a512c418032f590a4660bad9d846Chris Lattner  Preheader = L->getLoopPreheader();
14699a57216a935a512c418032f590a4660bad9d846Chris Lattner  assert(Preheader&&"Preheader insertion pass guarantees we have a preheader!");
14799a57216a935a512c418032f590a4660bad9d846Chris Lattner
148e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  // We want to visit all of the instructions in this loop... that are not parts
149e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  // of our subloops (they have already had their invariants hoisted out of
150e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  // their loop, into this loop, so there is no need to process the BODIES of
151e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  // the subloops).
152e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  //
153952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner  // Traverse the body of the loop in depth first order on the dominator tree so
154952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner  // that we are guaranteed to see definitions before we see uses.  This allows
155952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner  // us to perform the LICM transformation in one pass, without iteration.
156952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner  //
157952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner  HoistRegion(getAnalysis<DominatorTree>()[L->getHeader()]);
158e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
159e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  // Clear out loops state information for the next iteration
160e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  CurLoop = 0;
16199a57216a935a512c418032f590a4660bad9d846Chris Lattner  Preheader = 0;
162e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner}
163e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
164952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner/// HoistRegion - Walk the specified region of the CFG (defined by all blocks
165952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner/// dominated by the specified block, and that are in the current loop) in depth
166952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner/// first order w.r.t the DominatorTree.  This allows us to visit defintions
167952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner/// before uses, allowing us to hoist a loop body in one pass without iteration.
168952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner///
169952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattnervoid LICM::HoistRegion(DominatorTree::Node *N) {
170952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner  assert(N != 0 && "Null dominator tree node?");
171952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner
172b461373fbcdc5909cc7331fa64791cd039de4bc8Chris Lattner  // If this subregion is not in the top level loop at all, exit.
173b461373fbcdc5909cc7331fa64791cd039de4bc8Chris Lattner  if (!CurLoop->contains(N->getNode())) return;
174952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner
175b461373fbcdc5909cc7331fa64791cd039de4bc8Chris Lattner  // Only need to hoist the contents of this block if it is not part of a
176b461373fbcdc5909cc7331fa64791cd039de4bc8Chris Lattner  // subloop (which would already have been hoisted)
177b461373fbcdc5909cc7331fa64791cd039de4bc8Chris Lattner  if (!inSubLoop(N->getNode()))
178b461373fbcdc5909cc7331fa64791cd039de4bc8Chris Lattner    visit(*N->getNode());
179952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner
180952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner  const std::vector<DominatorTree::Node*> &Children = N->getChildren();
181952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner  for (unsigned i = 0, e = Children.size(); i != e; ++i)
182952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner    HoistRegion(Children[i]);
183952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner}
184952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner
185952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner
18694170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner/// hoist - When an instruction is found to only use loop invariant operands
18794170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner/// that is safe to hoist, this instruction is called to do the dirty work.
18894170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner///
1897e70829632f82de15db187845666aaca6e04b792Chris Lattnervoid LICM::hoist(Instruction &Inst) {
190b461373fbcdc5909cc7331fa64791cd039de4bc8Chris Lattner  DEBUG(std::cerr << "LICM hoisting to";
191b461373fbcdc5909cc7331fa64791cd039de4bc8Chris Lattner        WriteAsOperand(std::cerr, Preheader, false);
192b461373fbcdc5909cc7331fa64791cd039de4bc8Chris Lattner        std::cerr << ": " << Inst);
193e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
19499a57216a935a512c418032f590a4660bad9d846Chris Lattner  // Remove the instruction from its current basic block... but don't delete the
19599a57216a935a512c418032f590a4660bad9d846Chris Lattner  // instruction.
19699a57216a935a512c418032f590a4660bad9d846Chris Lattner  Inst.getParent()->getInstList().remove(&Inst);
197e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
1989646e6b6af1f924f9366a2bffc6dde102f84d231Chris Lattner  // Insert the new node in Preheader, before the terminator.
19999a57216a935a512c418032f590a4660bad9d846Chris Lattner  Preheader->getInstList().insert(Preheader->getTerminator(), &Inst);
2009646e6b6af1f924f9366a2bffc6dde102f84d231Chris Lattner
2019646e6b6af1f924f9366a2bffc6dde102f84d231Chris Lattner  ++NumHoisted;
202e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  Changed = true;
203e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner}
204e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
205eb53ae4f2dc39e75e725b21b52d77d29cf1c11c9Chris Lattner
206eb53ae4f2dc39e75e725b21b52d77d29cf1c11c9Chris Lattnervoid LICM::visitLoadInst(LoadInst &LI) {
207eb53ae4f2dc39e75e725b21b52d77d29cf1c11c9Chris Lattner  if (isLoopInvariant(LI.getOperand(0)) &&
20899a57216a935a512c418032f590a4660bad9d846Chris Lattner      !pointerInvalidatedByLoop(LI.getOperand(0))) {
209eb53ae4f2dc39e75e725b21b52d77d29cf1c11c9Chris Lattner    hoist(LI);
21099a57216a935a512c418032f590a4660bad9d846Chris Lattner    ++NumHoistedLoads;
21199a57216a935a512c418032f590a4660bad9d846Chris Lattner  }
212eb53ae4f2dc39e75e725b21b52d77d29cf1c11c9Chris Lattner}
213eb53ae4f2dc39e75e725b21b52d77d29cf1c11c9Chris Lattner
21494170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner/// pointerInvalidatedByLoop - Return true if the body of this loop may store
21594170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner/// into the memory location pointed to by V.
21694170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner///
217f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattnerbool LICM::pointerInvalidatedByLoop(Value *V) {
218f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner  // Check to see if any of the basic blocks in CurLoop invalidate V.
219f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner  for (unsigned i = 0, e = CurLoop->getBlocks().size(); i != e; ++i)
220f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner    if (AA->canBasicBlockModify(*CurLoop->getBlocks()[i], V))
221f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner      return true;
222f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner  return false;
223f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner}
224