diff --git a/lib/SILOptimizer/Mandatory/OptimizeHopToExecutor.cpp b/lib/SILOptimizer/Mandatory/OptimizeHopToExecutor.cpp index 2aba1c3530537..af8d80761993b 100644 --- a/lib/SILOptimizer/Mandatory/OptimizeHopToExecutor.cpp +++ b/lib/SILOptimizer/Mandatory/OptimizeHopToExecutor.cpp @@ -196,10 +196,30 @@ void OptimizeHopToExecutor::solveDataflowBackward() { } while (changed); } +bool fixme_isCallerIsoInheriting(FullApplySite FAS) { + if (FAS.isCallerIsolationInheriting()) + return true; + + auto actorIsolation = FAS.getActorIsolation(); + // llvm::dbgs() << "JQ: FAS actor iso:\n"; + // actorIsolation->dump(); + if (actorIsolation->getKind() == ActorIsolation::Unspecified) { + // FIXME: handle closures that inherit the caller's isolation correctly + auto calleSubsTy = FAS.getSubstCalleeType(); + auto implicitIsoParam = calleSubsTy->maybeGetIsolatedParameter(); + // llvm::dbgs() << "JQ: FAS imp iso param:\n"; + // implicitIsoParam->dump(); + return implicitIsoParam.has_value(); + } + + return false; +} + /// Returns true if \p inst is a suspension point or an async call. static bool isSuspensionPoint(SILInstruction *inst) { if (auto applySite = FullApplySite::isa(inst)) { - if (applySite.isAsync() && !applySite.isCallerIsolationInheriting()) + // if (applySite.isAsync() && !applySite.isCallerIsolationInheriting()) + if (applySite.isAsync() && !fixme_isCallerIsoInheriting(applySite)) return true; return false; } @@ -392,7 +412,10 @@ bool OptimizeHopToExecutor::needsExecutor(SILInstruction *inst) { // executors since caller isolation inheriting functions do not hop in their // prologue. if (auto fas = FullApplySite::isa(inst); - fas && fas.isAsync() && fas.isCallerIsolationInheriting()) { + fas && fas.isAsync() && + fixme_isCallerIsoInheriting(fas) +// fas.isCallerIsolationInheriting() + ) { return true; }