diff --git a/lib/Transforms/Scalar/LICM.cpp b/lib/Transforms/Scalar/LICM.cpp index 7bae9fd18a5..f67fa6c6495 100644 --- a/lib/Transforms/Scalar/LICM.cpp +++ b/lib/Transforms/Scalar/LICM.cpp @@ -42,6 +42,7 @@ namespace { // This transformation requires natural loop information... virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.preservesCFG(); + AU.addRequiredID(LoopPreheadersID); AU.addRequired(); AU.addRequired(); } @@ -104,11 +105,7 @@ namespace { } void visitShiftInst(ShiftInst &I) { visitBinaryOperator((Instruction&)I); } - void visitLoadInst(LoadInst &LI) { - if (isLoopInvariant(LI.getOperand(0)) && - !pointerInvalidatedByLoop(LI.getOperand(0))) - hoist(LI); - } + void visitLoadInst(LoadInst &LI); void visitGetElementPtrInst(GetElementPtrInst &GEPI) { Instruction &I = (Instruction&)GEPI; @@ -276,6 +273,14 @@ void LICM::hoist(Instruction &Inst) { Changed = true; } + +void LICM::visitLoadInst(LoadInst &LI) { + if (isLoopInvariant(LI.getOperand(0)) && + !pointerInvalidatedByLoop(LI.getOperand(0))) + hoist(LI); + +} + // pointerInvalidatedByLoop - Return true if the body of this loop may store // into the memory location pointed to by V. //