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