LICM.cpp revision 952eaee239d6c38f5121ed68277555344c2d6bf0
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"
16e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner#include "Support/StatisticReporter.h"
17e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner#include <algorithm>
185ba99bd124dc18302f527d6e2b0efd0fa866bc9eAnand Shuklausing std::string;
19e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
20e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattnernamespace {
219646e6b6af1f924f9366a2bffc6dde102f84d231Chris Lattner  Statistic<>NumHoisted("licm\t\t- Number of instructions hoisted out of loop");
229646e6b6af1f924f9366a2bffc6dde102f84d231Chris Lattner  Statistic<> NumHoistedLoads("licm\t\t- Number of load insts hoisted");
239646e6b6af1f924f9366a2bffc6dde102f84d231Chris Lattner
24e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  struct LICM : public FunctionPass, public InstVisitor<LICM> {
257e70829632f82de15db187845666aaca6e04b792Chris Lattner    virtual bool runOnFunction(Function &F);
26e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
2794170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    /// This transformation requires natural loop information & requires that
2894170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    /// loop preheaders be inserted into the CFG...
2994170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    ///
30e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
31e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner      AU.preservesCFG();
32eb53ae4f2dc39e75e725b21b52d77d29cf1c11c9Chris Lattner      AU.addRequiredID(LoopPreheadersID);
335f0eb8da62308126d5b61e3eee5bee75b9dc5194Chris Lattner      AU.addRequired<LoopInfo>();
34952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner      AU.addRequired<DominatorTree>();
35f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner      AU.addRequired<AliasAnalysis>();
36e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner    }
37e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
38e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  private:
3999a57216a935a512c418032f590a4660bad9d846Chris Lattner    Loop *CurLoop;         // The current loop we are working on...
4099a57216a935a512c418032f590a4660bad9d846Chris Lattner    BasicBlock *Preheader; // The preheader block of the current loop...
4199a57216a935a512c418032f590a4660bad9d846Chris Lattner    bool Changed;          // Set to true when we change anything.
4299a57216a935a512c418032f590a4660bad9d846Chris Lattner    AliasAnalysis *AA;     // Currently AliasAnalysis information
43e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
4494170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    /// visitLoop - Hoist expressions out of the specified loop...
4594170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    ///
46e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner    void visitLoop(Loop *L);
47e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
48952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner    /// HoistRegion - Walk the specified region of the CFG (defined by all
49952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner    /// blocks dominated by the specified block, and that are in the current
50952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner    /// loop) in depth first order w.r.t the DominatorTree.  This allows us to
51952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner    /// visit defintions before uses, allowing us to hoist a loop body in one
52952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner    /// pass without iteration.
53952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner    ///
54952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner    void HoistRegion(DominatorTree::Node *N);
55952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner
5699a57216a935a512c418032f590a4660bad9d846Chris Lattner    /// inCurrentLoop - Little predicate that returns false if the specified
5794170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    /// basic block is in a subloop of the current one, not the current one
5894170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    /// itself.
5994170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    ///
6099a57216a935a512c418032f590a4660bad9d846Chris Lattner    bool inCurrentLoop(BasicBlock *BB) {
61e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner      for (unsigned i = 0, e = CurLoop->getSubLoops().size(); i != e; ++i)
62e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner        if (CurLoop->getSubLoops()[i]->contains(BB))
6399a57216a935a512c418032f590a4660bad9d846Chris Lattner          return false;  // A subloop actually contains this block!
6499a57216a935a512c418032f590a4660bad9d846Chris Lattner      return true;
65e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner    }
66e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
6794170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    /// hoist - When an instruction is found to only use loop invariant operands
6894170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    /// that is safe to hoist, this instruction is called to do the dirty work.
6994170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    ///
707e70829632f82de15db187845666aaca6e04b792Chris Lattner    void hoist(Instruction &I);
71e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
7294170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    /// pointerInvalidatedByLoop - Return true if the body of this loop may
7394170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    /// store into the memory location pointed to by V.
7494170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    ///
75f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner    bool pointerInvalidatedByLoop(Value *V);
76f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner
7794170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    /// isLoopInvariant - Return true if the specified value is loop invariant
7894170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    ///
79e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner    inline bool isLoopInvariant(Value *V) {
80e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner      if (Instruction *I = dyn_cast<Instruction>(V))
81e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner        return !CurLoop->contains(I->getParent());
82e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner      return true;  // All non-instructions are loop invariant
83e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner    }
84e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
8594170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    /// Instruction visitation handlers... these basically control whether or
8694170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    /// not the specified instruction types are hoisted.
8794170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner    ///
88e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner    friend class InstVisitor<LICM>;
897e70829632f82de15db187845666aaca6e04b792Chris Lattner    void visitBinaryOperator(Instruction &I) {
907e70829632f82de15db187845666aaca6e04b792Chris Lattner      if (isLoopInvariant(I.getOperand(0)) && isLoopInvariant(I.getOperand(1)))
91e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner        hoist(I);
92e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner    }
939b2b80fd48b10396be85a71735ffda0c155e5f72Chris Lattner    void visitCastInst(CastInst &CI) {
949b2b80fd48b10396be85a71735ffda0c155e5f72Chris Lattner      Instruction &I = (Instruction&)CI;
959b2b80fd48b10396be85a71735ffda0c155e5f72Chris Lattner      if (isLoopInvariant(I.getOperand(0))) hoist(I);
960513e9fe03f6e3c7d0272b8f4f82359e8d1a2e44Chris Lattner    }
977e70829632f82de15db187845666aaca6e04b792Chris Lattner    void visitShiftInst(ShiftInst &I) { visitBinaryOperator((Instruction&)I); }
98e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
99eb53ae4f2dc39e75e725b21b52d77d29cf1c11c9Chris Lattner    void visitLoadInst(LoadInst &LI);
100f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner
1017e70829632f82de15db187845666aaca6e04b792Chris Lattner    void visitGetElementPtrInst(GetElementPtrInst &GEPI) {
1027e70829632f82de15db187845666aaca6e04b792Chris Lattner      Instruction &I = (Instruction&)GEPI;
1037e70829632f82de15db187845666aaca6e04b792Chris Lattner      for (unsigned i = 0, e = I.getNumOperands(); i != e; ++i)
1047e70829632f82de15db187845666aaca6e04b792Chris Lattner        if (!isLoopInvariant(I.getOperand(i))) return;
105e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner      hoist(I);
106e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner    }
107e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  };
108f629309f74cf1a64aa7fd1cd5784fd7db9a8f59eChris Lattner
109a6275ccdf5e1aa208afde56c498e2b13e16442f0Chris Lattner  RegisterOpt<LICM> X("licm", "Loop Invariant Code Motion");
110e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner}
111e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
112e0e734eea052a4e8372e6f430ef41149128ba0a6Chris LattnerPass *createLICMPass() { return new LICM(); }
113e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
11494170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner/// runOnFunction - For LICM, this simply traverses the loop structure of the
11594170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner/// function, hoisting expressions out of loops if possible.
11694170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner///
1177e70829632f82de15db187845666aaca6e04b792Chris Lattnerbool LICM::runOnFunction(Function &) {
11899a57216a935a512c418032f590a4660bad9d846Chris Lattner  // Get information about the top level loops in the function...
119e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  const std::vector<Loop*> &TopLevelLoops =
120e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner    getAnalysis<LoopInfo>().getTopLevelLoops();
121e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
122f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner  // Get our alias analysis information...
123f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner  AA = &getAnalysis<AliasAnalysis>();
124f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner
125e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  // Traverse loops in postorder, hoisting expressions out of the deepest loops
126e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  // first.
127e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  //
128e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  Changed = false;
129e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  std::for_each(TopLevelLoops.begin(), TopLevelLoops.end(),
130e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner                bind_obj(this, &LICM::visitLoop));
131e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  return Changed;
132e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner}
133e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
13494170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner
13594170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner/// visitLoop - Hoist expressions out of the specified loop...
13694170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner///
137e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattnervoid LICM::visitLoop(Loop *L) {
138e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  // Recurse through all subloops before we process this loop...
139e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  std::for_each(L->getSubLoops().begin(), L->getSubLoops().end(),
140e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner                bind_obj(this, &LICM::visitLoop));
141e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  CurLoop = L;
142e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
14399a57216a935a512c418032f590a4660bad9d846Chris Lattner  // Get the preheader block to move instructions into...
14499a57216a935a512c418032f590a4660bad9d846Chris Lattner  Preheader = L->getLoopPreheader();
14599a57216a935a512c418032f590a4660bad9d846Chris Lattner  assert(Preheader&&"Preheader insertion pass guarantees we have a preheader!");
14699a57216a935a512c418032f590a4660bad9d846Chris Lattner
147e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  // We want to visit all of the instructions in this loop... that are not parts
148e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  // of our subloops (they have already had their invariants hoisted out of
149e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  // their loop, into this loop, so there is no need to process the BODIES of
150e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  // the subloops).
151e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  //
152952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner  // Traverse the body of the loop in depth first order on the dominator tree so
153952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner  // that we are guaranteed to see definitions before we see uses.  This allows
154952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner  // us to perform the LICM transformation in one pass, without iteration.
155952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner  //
156952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner  HoistRegion(getAnalysis<DominatorTree>()[L->getHeader()]);
157e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
158e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  // Clear out loops state information for the next iteration
159e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  CurLoop = 0;
16099a57216a935a512c418032f590a4660bad9d846Chris Lattner  Preheader = 0;
161e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner}
162e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
163952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner/// HoistRegion - Walk the specified region of the CFG (defined by all blocks
164952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner/// dominated by the specified block, and that are in the current loop) in depth
165952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner/// first order w.r.t the DominatorTree.  This allows us to visit defintions
166952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner/// before uses, allowing us to hoist a loop body in one pass without iteration.
167952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner///
168952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattnervoid LICM::HoistRegion(DominatorTree::Node *N) {
169952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner  assert(N != 0 && "Null dominator tree node?");
170952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner
171952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner  // This subregion is not in the loop, it has already been already been hoisted
172952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner  if (!inCurrentLoop(N->getNode()))
173952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner    return;
174952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner
175952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner  visit(*N->getNode());
176952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner
177952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner  const std::vector<DominatorTree::Node*> &Children = N->getChildren();
178952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner  for (unsigned i = 0, e = Children.size(); i != e; ++i)
179952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner    HoistRegion(Children[i]);
180952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner}
181952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner
182952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner
18394170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner/// hoist - When an instruction is found to only use loop invariant operands
18494170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner/// that is safe to hoist, this instruction is called to do the dirty work.
18594170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner///
1867e70829632f82de15db187845666aaca6e04b792Chris Lattnervoid LICM::hoist(Instruction &Inst) {
187952eaee239d6c38f5121ed68277555344c2d6bf0Chris Lattner  DEBUG(std::cerr << "LICM hoisting: " << Inst);
188e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
189e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  BasicBlock *Header = CurLoop->getHeader();
190e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
19199a57216a935a512c418032f590a4660bad9d846Chris Lattner  // Remove the instruction from its current basic block... but don't delete the
19299a57216a935a512c418032f590a4660bad9d846Chris Lattner  // instruction.
19399a57216a935a512c418032f590a4660bad9d846Chris Lattner  Inst.getParent()->getInstList().remove(&Inst);
194e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
1959646e6b6af1f924f9366a2bffc6dde102f84d231Chris Lattner  // Insert the new node in Preheader, before the terminator.
19699a57216a935a512c418032f590a4660bad9d846Chris Lattner  Preheader->getInstList().insert(Preheader->getTerminator(), &Inst);
1979646e6b6af1f924f9366a2bffc6dde102f84d231Chris Lattner
1989646e6b6af1f924f9366a2bffc6dde102f84d231Chris Lattner  ++NumHoisted;
199e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner  Changed = true;
200e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner}
201e0e734eea052a4e8372e6f430ef41149128ba0a6Chris Lattner
202eb53ae4f2dc39e75e725b21b52d77d29cf1c11c9Chris Lattner
203eb53ae4f2dc39e75e725b21b52d77d29cf1c11c9Chris Lattnervoid LICM::visitLoadInst(LoadInst &LI) {
204eb53ae4f2dc39e75e725b21b52d77d29cf1c11c9Chris Lattner  if (isLoopInvariant(LI.getOperand(0)) &&
20599a57216a935a512c418032f590a4660bad9d846Chris Lattner      !pointerInvalidatedByLoop(LI.getOperand(0))) {
206eb53ae4f2dc39e75e725b21b52d77d29cf1c11c9Chris Lattner    hoist(LI);
20799a57216a935a512c418032f590a4660bad9d846Chris Lattner    ++NumHoistedLoads;
20899a57216a935a512c418032f590a4660bad9d846Chris Lattner  }
209eb53ae4f2dc39e75e725b21b52d77d29cf1c11c9Chris Lattner}
210eb53ae4f2dc39e75e725b21b52d77d29cf1c11c9Chris Lattner
21194170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner/// pointerInvalidatedByLoop - Return true if the body of this loop may store
21294170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner/// into the memory location pointed to by V.
21394170596b715928794a55bc5a1671e3992fd2dc9Chris Lattner///
214f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattnerbool LICM::pointerInvalidatedByLoop(Value *V) {
215f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner  // Check to see if any of the basic blocks in CurLoop invalidate V.
216f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner  for (unsigned i = 0, e = CurLoop->getBlocks().size(); i != e; ++i)
217f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner    if (AA->canBasicBlockModify(*CurLoop->getBlocks()[i], V))
218f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner      return true;
219f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner  return false;
220f5e84aa0887d3fcd752d4a4fa1bb0e526be49f20Chris Lattner}
221