#include "llvm/Transforms/Scalar.h"
#include "llvm/IntrinsicInst.h"
#include "llvm/Analysis/LoopPass.h"
-#include "llvm/Analysis/ScalarEvolutionExpander.h"
+#include "llvm/Analysis/ScalarEvolution.h"
#include "llvm/Analysis/Dominators.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Transforms/Utils/Cloning.h"
bool runOnLoop(Loop *L, LPPassManager &LPM);
void getAnalysisUsage(AnalysisUsage &AU) const {
- AU.addRequired<ScalarEvolution>();
AU.addPreserved<ScalarEvolution>();
AU.addRequiredID(LCSSAID);
AU.addPreservedID(LCSSAID);
Loop *L;
LPPassManager *LPM;
LoopInfo *LI;
- ScalarEvolution *SE;
DominatorTree *DT;
DominanceFrontier *DF;
if (!L->getSubLoops().empty())
return false;
- SE = &getAnalysis<ScalarEvolution>();
DT = &getAnalysis<DominatorTree>();
LI = &getAnalysis<LoopInfo>();
DF = &getAnalysis<DominanceFrontier>();
}
// Reject loop if loop exit condition is not suitable.
- SmallVector<BasicBlock *, 2> EBs;
- L->getExitingBlocks(EBs);
- if (EBs.size() != 1)
+ BasicBlock *ExitingBlock = L->getExitingBlock();
+ if (!ExitingBlock)
return false;
- BranchInst *EBR = dyn_cast<BranchInst>(EBs[0]->getTerminator());
+ BranchInst *EBR = dyn_cast<BranchInst>(ExitingBlock->getTerminator());
if (!EBR) return false;
ExitCondition = dyn_cast<ICmpInst>(EBR->getCondition());
if (!ExitCondition) return false;
- if (EBs[0] != L->getLoopLatch()) return false;
+ if (ExitingBlock != L->getLoopLatch()) return false;
IVExitValue = ExitCondition->getOperand(1);
if (!L->isLoopInvariant(IVExitValue))
IVExitValue = ExitCondition->getOperand(0);