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