summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorSean Silva <chisophugis@gmail.com>2016-07-19 23:54:23 +0000
committerSean Silva <chisophugis@gmail.com>2016-07-19 23:54:23 +0000
commite3c18a5ae8ab0f5c3201b4231445425f2d993f86 (patch)
tree2dfdcb9096be75ce6e7c5da33c8a3e9a56661739 /llvm/lib/Transforms
parent9e52c064c2c5104062a09b4cb1716715018f6b1d (diff)
downloadbcm5719-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.cpp33
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();
+}
OpenPOWER on IntegriCloud