]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/Transforms/Scalar/LoopPassManager.cpp
Merge llvm, clang, lld and lldb release_40 branch r292009. Also update
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / Transforms / Scalar / LoopPassManager.cpp
1 //===- LoopPassManager.cpp - Loop pass management -------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "llvm/Transforms/Scalar/LoopPassManager.h"
11 #include "llvm/Analysis/LoopInfo.h"
12
13 using namespace llvm;
14
15 // Explicit template instantiations and specialization defininitions for core
16 // template typedefs.
17 namespace llvm {
18 template class PassManager<Loop, LoopAnalysisManager,
19                            LoopStandardAnalysisResults &, LPMUpdater &>;
20
21 /// Explicitly specialize the pass manager's run method to handle loop nest
22 /// structure updates.
23 template <>
24 PreservedAnalyses
25 PassManager<Loop, LoopAnalysisManager, LoopStandardAnalysisResults &,
26             LPMUpdater &>::run(Loop &L, LoopAnalysisManager &AM,
27                                LoopStandardAnalysisResults &AR, LPMUpdater &U) {
28   PreservedAnalyses PA = PreservedAnalyses::all();
29
30   if (DebugLogging)
31     dbgs() << "Starting Loop pass manager run.\n";
32
33   for (auto &Pass : Passes) {
34     if (DebugLogging)
35       dbgs() << "Running pass: " << Pass->name() << " on " << L;
36
37     PreservedAnalyses PassPA = Pass->run(L, AM, AR, U);
38
39     // If the loop was deleted, abort the run and return to the outer walk.
40     if (U.skipCurrentLoop()) {
41       PA.intersect(std::move(PassPA));
42       break;
43     }
44
45     // Update the analysis manager as each pass runs and potentially
46     // invalidates analyses.
47     AM.invalidate(L, PassPA);
48
49     // Finally, we intersect the final preserved analyses to compute the
50     // aggregate preserved set for this pass manager.
51     PA.intersect(std::move(PassPA));
52
53     // FIXME: Historically, the pass managers all called the LLVM context's
54     // yield function here. We don't have a generic way to acquire the
55     // context and it isn't yet clear what the right pattern is for yielding
56     // in the new pass manager so it is currently omitted.
57     // ...getContext().yield();
58   }
59
60   // Invalidation for the current loop should be handled above, and other loop
61   // analysis results shouldn't be impacted by runs over this loop. Therefore,
62   // the remaining analysis results in the AnalysisManager are preserved. We
63   // mark this with a set so that we don't need to inspect each one
64   // individually.
65   // FIXME: This isn't correct! This loop and all nested loops' analyses should
66   // be preserved, but unrolling should invalidate the parent loop's analyses.
67   PA.preserveSet<AllAnalysesOn<Loop>>();
68
69   if (DebugLogging)
70     dbgs() << "Finished Loop pass manager run.\n";
71
72   return PA;
73 }
74 }
75
76 PrintLoopPass::PrintLoopPass() : OS(dbgs()) {}
77 PrintLoopPass::PrintLoopPass(raw_ostream &OS, const std::string &Banner)
78     : OS(OS), Banner(Banner) {}
79
80 PreservedAnalyses PrintLoopPass::run(Loop &L, LoopAnalysisManager &,
81                                      LoopStandardAnalysisResults &,
82                                      LPMUpdater &) {
83   printLoop(L, OS, Banner);
84   return PreservedAnalyses::all();
85 }