19
19
#include " swift/SILPasses/Transforms.h"
20
20
#include " llvm/ADT/Statistic.h"
21
21
#include " llvm/ADT/StringSwitch.h"
22
+ #include " swift/SILAnalysis/FunctionOrder.h"
22
23
#include " llvm/Support/CommandLine.h"
23
24
#include " llvm/Support/Debug.h"
24
25
#include " llvm/Support/TimeValue.h"
@@ -160,21 +161,25 @@ SILPassManager::SILPassManager(SILModule *M, llvm::StringRef Stage) :
160
161
bool SILPassManager::runFunctionPasses (PassList FuncTransforms) {
161
162
const SILOptions &Options = getOptions ();
162
163
163
- for (auto &F : *Mod) {
164
- if (F.empty ())
164
+ BasicCalleeAnalysis *BCA = getAnalysis<BasicCalleeAnalysis>();
165
+ BottomUpFunctionOrder BottomUpOrder (*Mod, BCA);
166
+ auto BottomUpFunctions = BottomUpOrder.getFunctions ();
167
+
168
+ for (auto *F : BottomUpFunctions) {
169
+ if (F->empty ())
165
170
continue ;
166
171
167
172
// Don't optimize functions that are marked with the opt.never attribute.
168
- if (!F. shouldOptimize ())
173
+ if (!F-> shouldOptimize ())
169
174
continue ;
170
175
171
- CompletedPasses &completedPasses = CompletedPassesMap[& F];
176
+ CompletedPasses &completedPasses = CompletedPassesMap[F];
172
177
173
178
for (auto SFT : FuncTransforms) {
174
179
PrettyStackTraceSILFunctionTransform X (SFT);
175
180
SFT->injectPassManager (this );
176
- SFT->injectFunction (& F);
177
-
181
+ SFT->injectFunction (F);
182
+
178
183
// If nothing changed since the last run of this pass, we can skip this
179
184
// pass.
180
185
if (completedPasses.test ((size_t )SFT->getPassKind ()))
@@ -188,13 +193,13 @@ bool SILPassManager::runFunctionPasses(PassList FuncTransforms) {
188
193
if (SILPrintPassName)
189
194
llvm::dbgs () << " #" << NumPassesRun << " Stage: " << StageName
190
195
<< " Pass: " << SFT->getName ()
191
- << " , Function: " << F. getName () << " \n " ;
196
+ << " , Function: " << F-> getName () << " \n " ;
192
197
193
- if (doPrintBefore (SFT, & F)) {
198
+ if (doPrintBefore (SFT, F)) {
194
199
llvm::dbgs () << " *** SIL function before " << StageName << " "
195
200
<< SFT->getName () << " (" << NumOptimizationIterations
196
201
<< " ) ***\n " ;
197
- F. dump (Options.EmitVerboseSIL );
202
+ F-> dump (Options.EmitVerboseSIL );
198
203
}
199
204
200
205
llvm::sys::TimeValue StartTime = llvm::sys::TimeValue::now ();
@@ -205,17 +210,17 @@ bool SILPassManager::runFunctionPasses(PassList FuncTransforms) {
205
210
if (SILPrintPassTime) {
206
211
auto Delta = llvm::sys::TimeValue::now ().nanoseconds () -
207
212
StartTime.nanoseconds ();
208
- llvm::dbgs () << Delta << " (" << SFT->getName () << " ," << F. getName ()
213
+ llvm::dbgs () << Delta << " (" << SFT->getName () << " ," << F-> getName ()
209
214
<< " )\n " ;
210
215
}
211
216
212
217
// If this pass invalidated anything, print and verify.
213
- if (doPrintAfter (SFT, & F,
218
+ if (doPrintAfter (SFT, F,
214
219
currentPassHasInvalidated && SILPrintAll)) {
215
220
llvm::dbgs () << " *** SIL function after " << StageName << " "
216
221
<< SFT->getName () << " (" << NumOptimizationIterations
217
222
<< " ) ***\n " ;
218
- F. dump (Options.EmitVerboseSIL );
223
+ F-> dump (Options.EmitVerboseSIL );
219
224
}
220
225
221
226
// Remember if this pass didn't change anything.
@@ -224,8 +229,8 @@ bool SILPassManager::runFunctionPasses(PassList FuncTransforms) {
224
229
225
230
if (Options.VerifyAll &&
226
231
(currentPassHasInvalidated || SILVerifyWithoutInvalidation)) {
227
- F. verify ();
228
- verifyAnalyses (& F);
232
+ F-> verify ();
233
+ verifyAnalyses (F);
229
234
}
230
235
231
236
++NumPassesRun;
0 commit comments