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