@@ -383,21 +383,35 @@ void SILPassManager::dumpPassInfo(const char *Title, unsigned TransIdx,
383383 llvm::dbgs () << ' \n ' ;
384384}
385385
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+
386394void SILPassManager::runPassOnFunction (unsigned TransIdx, SILFunction *F) {
387395
388396 assert (analysesUnlocked () && " Expected all analyses to be unlocked!" );
389397
390398 auto *SFT = cast<SILFunctionTransform>(Transformations[TransIdx]);
399+
400+ if (!F->shouldOptimize () && !isMandatoryFunctionPass (SFT)) {
401+ return ;
402+ }
403+
391404 SFT->injectPassManager (this );
392405 SFT->injectFunction (F);
393406
394407 PrettyStackTraceSILFunctionTransform X (SFT, NumPassesRun);
395408 DebugPrintEnabler DebugPrint (NumPassesRun);
396409
397410 // If nothing changed since the last run of this pass, we can skip this
398- // pass.
411+ // pass if it is not mandatory
399412 CompletedPasses &completedPasses = CompletedPassesMap[F];
400- if (completedPasses.test ((size_t )SFT->getPassKind ()) &&
413+ if (!isMandatoryFunctionPass (SFT) &&
414+ completedPasses.test ((size_t )SFT->getPassKind ()) &&
401415 !SILDisableSkippingPasses) {
402416 if (SILPrintPassName)
403417 dumpPassInfo (" (Skip)" , TransIdx, F);
@@ -513,7 +527,7 @@ runFunctionPasses(unsigned FromTransIdx, unsigned ToTransIdx) {
513527
514528 // Only include functions that are definitions, and which have not
515529 // been intentionally excluded from optimization.
516- if (F.isDefinition () && (isMandatory || F. shouldOptimize ()) )
530+ if (F.isDefinition ())
517531 FunctionWorklist.push_back (*I);
518532 }
519533
0 commit comments