diff options
author | Sean Silva <chisophugis@gmail.com> | 2016-07-19 23:54:23 +0000 |
---|---|---|
committer | Sean Silva <chisophugis@gmail.com> | 2016-07-19 23:54:23 +0000 |
commit | e3c18a5ae8ab0f5c3201b4231445425f2d993f86 (patch) | |
tree | 2dfdcb9096be75ce6e7c5da33c8a3e9a56661739 /llvm/lib/Transforms | |
parent | 9e52c064c2c5104062a09b4cb1716715018f6b1d (diff) | |
download | bcm5719-llvm-e3c18a5ae8ab0f5c3201b4231445425f2d993f86.tar.gz bcm5719-llvm-e3c18a5ae8ab0f5c3201b4231445425f2d993f86.zip |
[PM] Port LoopUnroll.
We just set PreserveLCSSA to always true since we don't have an
analogous method `mustPreserveAnalysisID(LCSSA)`.
Also port LoopInfo verifier pass to test LoopUnrollPass.
llvm-svn: 276063
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp b/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp index 91af4a1922c..cc4e0615658 100644 --- a/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp +++ b/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp @@ -12,12 +12,14 @@ // counts of loops easily. //===----------------------------------------------------------------------===// +#include "llvm/Transforms/Scalar/LoopUnrollPass.h" #include "llvm/ADT/SetVector.h" #include "llvm/Analysis/AssumptionCache.h" #include "llvm/Analysis/CodeMetrics.h" #include "llvm/Analysis/GlobalsModRef.h" #include "llvm/Analysis/InstructionSimplify.h" #include "llvm/Analysis/LoopPass.h" +#include "llvm/Analysis/LoopPassManager.h" #include "llvm/Analysis/LoopUnrollAnalyzer.h" #include "llvm/Analysis/ScalarEvolution.h" #include "llvm/Analysis/ScalarEvolutionExpressions.h" @@ -1054,3 +1056,34 @@ Pass *llvm::createLoopUnrollPass(int Threshold, int Count, int AllowPartial, Pass *llvm::createSimpleLoopUnrollPass() { return llvm::createLoopUnrollPass(-1, -1, 0, 0); } + +PreservedAnalyses LoopUnrollPass::run(Loop &L, AnalysisManager<Loop> &AM) { + const auto &FAM = + AM.getResult<FunctionAnalysisManagerLoopProxy>(L).getManager(); + Function *F = L.getHeader()->getParent(); + + + DominatorTree *DT = FAM.getCachedResult<DominatorTreeAnalysis>(*F); + LoopInfo *LI = FAM.getCachedResult<LoopAnalysis>(*F); + ScalarEvolution *SE = FAM.getCachedResult<ScalarEvolutionAnalysis>(*F); + auto *TTI = FAM.getCachedResult<TargetIRAnalysis>(*F); + auto *AC = FAM.getCachedResult<AssumptionAnalysis>(*F); + if (!DT) + report_fatal_error("LoopUnrollPass: DominatorTreeAnalysis not cached at a higher level"); + if (!LI) + report_fatal_error("LoopUnrollPass: LoopAnalysis not cached at a higher level"); + if (!SE) + report_fatal_error("LoopUnrollPass: ScalarEvolutionAnalysis not cached at a higher level"); + if (!TTI) + report_fatal_error("LoopUnrollPass: TargetIRAnalysis not cached at a higher level"); + if (!AC) + report_fatal_error("LoopUnrollPass: AssumptionAnalysis not cached at a higher level"); + + bool Changed = tryToUnrollLoop( + &L, *DT, LI, SE, *TTI, *AC, /*PreserveLCSSA*/ true, ProvidedCount, + ProvidedThreshold, ProvidedAllowPartial, ProvidedRuntime); + + if (!Changed) + return PreservedAnalyses::all(); + return getLoopPassPreservedAnalyses(); +} |