From 923ce5bb734628c0d83ba7ca9a7a52374a9e9fa6 Mon Sep 17 00:00:00 2001 From: Jamie <2119834+jamieQ@users.noreply.github.com> Date: Thu, 18 Dec 2025 09:37:38 -0600 Subject: [PATCH 1/2] [WIP][DNM]: try to fix hop to executor miscompile --- .../Mandatory/OptimizeHopToExecutor.cpp | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/lib/SILOptimizer/Mandatory/OptimizeHopToExecutor.cpp b/lib/SILOptimizer/Mandatory/OptimizeHopToExecutor.cpp index 2aba1c3530537..7119d43a993eb 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; } From 55b64c7cfeb11e9f8277ecab3e8289cd3d74e1bc Mon Sep 17 00:00:00 2001 From: Jamie <2119834+jamieQ@users.noreply.github.com> Date: Fri, 19 Dec 2025 05:21:16 -0600 Subject: [PATCH 2/2] try to fix block state mismatch --- lib/SILOptimizer/Mandatory/OptimizeHopToExecutor.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/SILOptimizer/Mandatory/OptimizeHopToExecutor.cpp b/lib/SILOptimizer/Mandatory/OptimizeHopToExecutor.cpp index 7119d43a993eb..af8d80761993b 100644 --- a/lib/SILOptimizer/Mandatory/OptimizeHopToExecutor.cpp +++ b/lib/SILOptimizer/Mandatory/OptimizeHopToExecutor.cpp @@ -412,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; }