@@ -52,9 +52,13 @@ llvm::cl::opt<bool> SILPrintPassTime(
52
52
" sil-print-pass-time" , llvm::cl::init(false ),
53
53
llvm::cl::desc(" Print the execution time of each SIL pass" ));
54
54
55
- llvm::cl::opt<unsigned > SILNumOptPassesToRun (
56
- " sil-opt-pass-count" , llvm::cl::init(UINT_MAX),
57
- llvm::cl::desc(" Stop optimizing after <N> optimization passes" ));
55
+ llvm::cl::opt<bool > SILPrintLast (
56
+ " sil-print-last" , llvm::cl::init(false ),
57
+ llvm::cl::desc(" Print the last optimized function before and after the last pass" ));
58
+
59
+ llvm::cl::opt<std::string> SILNumOptPassesToRun (
60
+ " sil-opt-pass-count" , llvm::cl::init(" " ),
61
+ llvm::cl::desc(" Stop optimizing after <N> passes or <N>.<M> passes/sub-passes" ));
58
62
59
63
llvm::cl::opt<std::string> SILBreakOnFun (
60
64
" sil-break-on-function" , llvm::cl::init(" " ),
@@ -178,7 +182,11 @@ static bool functionSelectionEmpty() {
178
182
return SILPrintFunction.empty () && SILPrintFunctions.empty ();
179
183
}
180
184
181
- static bool doPrintBefore (SILTransform *T, SILFunction *F) {
185
+ bool SILPassManager::doPrintBefore (SILTransform *T, SILFunction *F) {
186
+ if (NumPassesRun == maxNumPassesToRun - 1 && SILPrintLast &&
187
+ maxNumSubpassesToRun == UINT_MAX && !isMandatory)
188
+ return true ;
189
+
182
190
if (F && !isFunctionSelectedForPrinting (F))
183
191
return false ;
184
192
@@ -201,7 +209,10 @@ static bool doPrintBefore(SILTransform *T, SILFunction *F) {
201
209
return false ;
202
210
}
203
211
204
- static bool doPrintAfter (SILTransform *T, SILFunction *F, bool PassChangedSIL) {
212
+ bool SILPassManager::doPrintAfter (SILTransform *T, SILFunction *F, bool PassChangedSIL) {
213
+ if (NumPassesRun == maxNumPassesToRun - 1 && SILPrintLast && !isMandatory)
214
+ return true ;
215
+
205
216
if (F && !isFunctionSelectedForPrinting (F))
206
217
return false ;
207
218
@@ -316,6 +327,22 @@ SILPassManager::SILPassManager(SILModule *M, bool isMandatory,
316
327
Analyses.push_back (create##NAME##Analysis (Mod));
317
328
#include " swift/SILOptimizer/Analysis/Analysis.def"
318
329
330
+ if (!SILNumOptPassesToRun.empty ()) {
331
+ StringRef countsStr = SILNumOptPassesToRun;
332
+ bool validFormat = true ;
333
+ if (countsStr.consumeInteger (10 , maxNumPassesToRun))
334
+ validFormat = false ;
335
+ if (countsStr.startswith (" ." )) {
336
+ countsStr = countsStr.drop_front (1 );
337
+ if (countsStr.consumeInteger (10 , maxNumSubpassesToRun))
338
+ validFormat = false ;
339
+ }
340
+ if (!validFormat || !countsStr.empty ()) {
341
+ llvm::errs () << " error: wrong format of -sil-opt-pass-count option\n " ;
342
+ exit (1 );
343
+ }
344
+ }
345
+
319
346
for (SILAnalysis *A : Analyses) {
320
347
A->initialize (this );
321
348
}
@@ -329,7 +356,27 @@ SILPassManager::SILPassManager(SILModule *M, bool isMandatory,
329
356
bool SILPassManager::continueTransforming () {
330
357
if (isMandatory)
331
358
return true ;
332
- return NumPassesRun < SILNumOptPassesToRun;
359
+ return NumPassesRun < maxNumPassesToRun;
360
+ }
361
+
362
+ bool SILPassManager::continueWithNextSubpassRun (SILInstruction *forInst,
363
+ SILFunction *function,
364
+ SILTransform *trans) {
365
+ if (isMandatory)
366
+ return true ;
367
+ if (NumPassesRun != maxNumPassesToRun - 1 )
368
+ return true ;
369
+
370
+ unsigned subPass = numSubpassesRun++;
371
+
372
+ if (subPass == maxNumSubpassesToRun - 1 && SILPrintLast) {
373
+ dumpPassInfo (" *** SIL function before " , trans, function);
374
+ if (forInst) {
375
+ llvm::dbgs () << " *** sub-pass " << subPass << " for " << *forInst;
376
+ }
377
+ function->dump (getOptions ().EmitVerboseSIL );
378
+ }
379
+ return subPass < maxNumSubpassesToRun;
333
380
}
334
381
335
382
bool SILPassManager::analysesUnlocked () {
@@ -359,24 +406,20 @@ static bool breakBeforeRunning(StringRef fnName, SILFunctionTransform *SFT) {
359
406
}
360
407
361
408
void SILPassManager::dumpPassInfo (const char *Title, SILTransform *Tr,
362
- SILFunction *F) {
363
- llvm::dbgs () << " " << Title << " #" << NumPassesRun << " , stage "
364
- << StageName << " , pass : " << Tr->getID ()
365
- << " (" << Tr->getTag () << " )" ;
409
+ SILFunction *F, int passIdx) {
410
+ llvm::dbgs () << " " << Title << " #" << NumPassesRun
411
+ << " , stage " << StageName << " , pass" ;
412
+ if (passIdx >= 0 )
413
+ llvm::dbgs () << ' ' << passIdx;
414
+ llvm::dbgs () << " : " << Tr->getID () << " (" << Tr->getTag () << " )" ;
366
415
if (F)
367
416
llvm::dbgs () << " , Function: " << F->getName ();
368
417
llvm::dbgs () << ' \n ' ;
369
418
}
370
419
371
420
void SILPassManager::dumpPassInfo (const char *Title, unsigned TransIdx,
372
421
SILFunction *F) {
373
- SILTransform *Tr = Transformations[TransIdx];
374
- llvm::dbgs () << " " << Title << " #" << NumPassesRun << " , stage "
375
- << StageName << " , pass " << TransIdx << " : " << Tr->getID ()
376
- << " (" << Tr->getTag () << " )" ;
377
- if (F)
378
- llvm::dbgs () << " , Function: " << F->getName ();
379
- llvm::dbgs () << ' \n ' ;
422
+ dumpPassInfo (Title, Transformations[TransIdx], F, (int )TransIdx);
380
423
}
381
424
382
425
bool SILPassManager::isMandatoryFunctionPass (SILFunctionTransform *sft) {
@@ -451,6 +494,7 @@ void SILPassManager::runPassOnFunction(unsigned TransIdx, SILFunction *F) {
451
494
updateSILModuleStatsBeforeTransform (F->getModule (), SFT, *this , NumPassesRun);
452
495
453
496
CurrentPassHasInvalidated = false ;
497
+ numSubpassesRun = 0 ;
454
498
455
499
auto MatchFun = [&](const std::string &Str) -> bool {
456
500
return SFT->getTag ().contains (Str) || SFT->getID ().contains (Str);
@@ -623,6 +667,7 @@ void SILPassManager::runModulePass(unsigned TransIdx) {
623
667
updateSILModuleStatsBeforeTransform (*Mod, SMT, *this , NumPassesRun);
624
668
625
669
CurrentPassHasInvalidated = false ;
670
+ numSubpassesRun = 0 ;
626
671
627
672
if (SILPrintPassName)
628
673
dumpPassInfo (" Run module pass" , TransIdx);
0 commit comments