Skip to content

Commit 9c9a8ef

Browse files
committed
Allow OME to run mandatorily
1 parent 81a2157 commit 9c9a8ef

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

include/swift/SILOptimizer/PassManager/PassManager.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,11 @@ class SILPassManager {
281281
/// Run the passes in Transform from \p FromTransIdx to \p ToTransIdx.
282282
void runFunctionPasses(unsigned FromTransIdx, unsigned ToTransIdx);
283283

284+
/// Helper function to check if the function pass should be run mandatorily
285+
/// All passes in mandatory pass pipeline and ownership model elimination are
286+
/// mandatory function passes.
287+
bool isMandatoryFunctionPass(SILFunctionTransform *);
288+
284289
/// A helper function that returns (based on SIL stage and debug
285290
/// options) whether we should continue running passes.
286291
bool continueTransforming();

lib/SILOptimizer/PassManager/PassManager.cpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
386394
void 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

Comments
 (0)