diff options
author | Dan Gohman <gohman@apple.com> | 2009-09-03 16:31:42 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2009-09-03 16:31:42 +0000 |
commit | 4c1bdcf5d7778ef8a135de1bb5c57a47c5192b14 (patch) | |
tree | 5cc1faa2a840cd6aa6220f98839b09eb560523ef /llvm/lib/Transforms/Utils/LCSSA.cpp | |
parent | c26e0f626b979f01869372a3a0b92d4d9ce5e625 (diff) | |
download | llvm-4c1bdcf5d7778ef8a135de1bb5c57a47c5192b14.zip llvm-4c1bdcf5d7778ef8a135de1bb5c57a47c5192b14.tar.gz llvm-4c1bdcf5d7778ef8a135de1bb5c57a47c5192b14.tar.bz2 |
Add a verifyAnalysis to LoopInfo, LoopSimplify, and LCSSA form that verify
that these passes are properly preserved.
Fix several transformation passes that claimed to preserve LoopSimplify
form but weren't.
llvm-svn: 80926
Diffstat (limited to 'llvm/lib/Transforms/Utils/LCSSA.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/LCSSA.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Utils/LCSSA.cpp b/llvm/lib/Transforms/Utils/LCSSA.cpp index 84fcc64..e0251f8 100644 --- a/llvm/lib/Transforms/Utils/LCSSA.cpp +++ b/llvm/lib/Transforms/Utils/LCSSA.cpp @@ -58,6 +58,7 @@ namespace { DominatorTree *DT; std::vector<BasicBlock*> LoopBlocks; PredIteratorCache PredCache; + Loop *L; virtual bool runOnLoop(Loop *L, LPPassManager &LPM); @@ -72,9 +73,9 @@ namespace { AU.setPreservesCFG(); AU.addRequiredID(LoopSimplifyID); AU.addPreservedID(LoopSimplifyID); - AU.addRequired<LoopInfo>(); + AU.addRequiredTransitive<LoopInfo>(); AU.addPreserved<LoopInfo>(); - AU.addRequired<DominatorTree>(); + AU.addRequiredTransitive<DominatorTree>(); AU.addPreserved<ScalarEvolution>(); AU.addPreserved<DominatorTree>(); @@ -86,6 +87,17 @@ namespace { AU.addPreserved<DominanceFrontier>(); } private: + + /// verifyAnalysis() - Verify loop nest. + virtual void verifyAnalysis() const { +#ifndef NDEBUG + // Sanity check: Check basic loop invariants. + L->verifyLoop(); + // Check the special guarantees that LCSSA makes. + assert(L->isLCSSAForm()); +#endif + } + void getLoopValuesUsedOutsideLoop(Loop *L, SetVector<Instruction*> &AffectedValues, const SmallVector<BasicBlock*, 8>& exitBlocks); @@ -107,7 +119,8 @@ Pass *llvm::createLCSSAPass() { return new LCSSA(); } const PassInfo *const llvm::LCSSAID = &X; /// runOnFunction - Process all loops in the function, inner-most out. -bool LCSSA::runOnLoop(Loop *L, LPPassManager &LPM) { +bool LCSSA::runOnLoop(Loop *l, LPPassManager &LPM) { + L = l; PredCache.clear(); LI = &LPM.getAnalysis<LoopInfo>(); |