@@ -383,21 +383,35 @@ void SILPassManager::dumpPassInfo(const char *Title, unsigned TransIdx,
383
383
llvm::dbgs () << ' \n ' ;
384
384
}
385
385
386
+ bool SILPassManager::isMandatoryFunctionPass (SILFunctionTransform *sft) {
387
+ return isMandatory || sft->getPassKind () ==
388
+ PassKind::NonTransparentFunctionOwnershipModelEliminator ||
389
+ sft->getPassKind () == PassKind::OwnershipModelEliminator ||
390
+ sft->getPassKind () ==
391
+ PassKind::NonStdlibNonTransparentFunctionOwnershipModelEliminator;
392
+ }
393
+
386
394
void SILPassManager::runPassOnFunction (unsigned TransIdx, SILFunction *F) {
387
395
388
396
assert (analysesUnlocked () && " Expected all analyses to be unlocked!" );
389
397
390
398
auto *SFT = cast<SILFunctionTransform>(Transformations[TransIdx]);
399
+
400
+ if (!F->shouldOptimize () && !isMandatoryFunctionPass (SFT)) {
401
+ return ;
402
+ }
403
+
391
404
SFT->injectPassManager (this );
392
405
SFT->injectFunction (F);
393
406
394
407
PrettyStackTraceSILFunctionTransform X (SFT, NumPassesRun);
395
408
DebugPrintEnabler DebugPrint (NumPassesRun);
396
409
397
410
// If nothing changed since the last run of this pass, we can skip this
398
- // pass.
411
+ // pass if it is not mandatory
399
412
CompletedPasses &completedPasses = CompletedPassesMap[F];
400
- if (completedPasses.test ((size_t )SFT->getPassKind ()) &&
413
+ if (!isMandatoryFunctionPass (SFT) &&
414
+ completedPasses.test ((size_t )SFT->getPassKind ()) &&
401
415
!SILDisableSkippingPasses) {
402
416
if (SILPrintPassName)
403
417
dumpPassInfo (" (Skip)" , TransIdx, F);
@@ -513,7 +527,7 @@ runFunctionPasses(unsigned FromTransIdx, unsigned ToTransIdx) {
513
527
514
528
// Only include functions that are definitions, and which have not
515
529
// been intentionally excluded from optimization.
516
- if (F.isDefinition () && (isMandatory || F. shouldOptimize ()) )
530
+ if (F.isDefinition ())
517
531
FunctionWorklist.push_back (*I);
518
532
}
519
533
0 commit comments