Skip to content

Commit 6d5515b

Browse files
committed
[SILOptimizer]: slow OSSA lifetime canonicalization mitigation
OSSA lifetime canonicalization can take a very long time in certain cases in which there are large basic blocks. to mitigate this, add logic to skip walking the liveness boundary for extending liveness extension to dead ends when there aren't any dead ends in the function.
1 parent f91b4b0 commit 6d5515b

File tree

1 file changed

+20
-0
lines changed

1 file changed

+20
-0
lines changed

lib/SILOptimizer/Utils/CanonicalizeOSSALifetime.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,19 @@ static bool isDestroyOfCopyOf(SILInstruction *instruction, SILValue def) {
125125
return false;
126126
}
127127

128+
static bool
129+
functionHasAnyDeadEnds(SILFunction *function,
130+
DeadEndBlocksAnalysis *deadEndBlocksAnalysis) {
131+
bool hasAnyDeadEnds = false;
132+
auto *deadEnds = deadEndBlocksAnalysis->get(function);
133+
for (auto &bb : *function) {
134+
hasAnyDeadEnds = deadEnds->isDeadEnd(&bb);
135+
if (hasAnyDeadEnds)
136+
break;
137+
}
138+
return hasAnyDeadEnds;
139+
}
140+
128141
//===----------------------------------------------------------------------===//
129142
// MARK: Step 1. Compute pruned liveness
130143
//===----------------------------------------------------------------------===//
@@ -300,6 +313,10 @@ void CanonicalizeOSSALifetime::extendLexicalLivenessToDeadEnds() {
300313
SSAPrunedLiveness directLiveness(function, &directDiscoverdBlocks);
301314
directLiveness.initializeDef(getCurrentDef());
302315
directLiveness.computeSimple();
316+
317+
if (!functionHasAnyDeadEnds(function, deadEndBlocksAnalysis))
318+
return;
319+
303320
OSSALifetimeCompletion::visitAvailabilityBoundary(
304321
getCurrentDef(), directLiveness, [&](auto *unreachable, auto end) {
305322
if (end == OSSALifetimeCompletion::LifetimeEnd::Boundary) {
@@ -373,6 +390,9 @@ void CanonicalizeOSSALifetime::extendLivenessToDeadEnds() {
373390
completeLiveness.updateForUse(pair.first, /*lifetimeEnding=*/false);
374391
}
375392

393+
if (!functionHasAnyDeadEnds(function, deadEndBlocksAnalysis))
394+
return;
395+
376396
OSSALifetimeCompletion::visitAvailabilityBoundary(
377397
getCurrentDef(), completeLiveness, [&](auto *unreachable, auto end) {
378398
if (end == OSSALifetimeCompletion::LifetimeEnd::Boundary) {

0 commit comments

Comments
 (0)