@@ -494,26 +494,6 @@ void RequireLiveness::process(Collection requireInstList) {
494494
495495namespace {
496496
497- struct InOutSendingNotDisconnectedInfo {
498- /// The function exiting inst where the 'inout sending' parameter was actor
499- /// isolated.
500- TermInst *functionExitingInst;
501-
502- /// The 'inout sending' param that we are emitting an error for.
503- SILValue inoutSendingParam;
504-
505- /// The dynamic actor isolated region info of our 'inout sending' value's
506- /// region at the terminator inst.
507- SILDynamicMergedIsolationInfo actorIsolatedRegionInfo;
508-
509- InOutSendingNotDisconnectedInfo(
510- SILInstruction *functionExitingInst, SILValue inoutSendingParam,
511- SILDynamicMergedIsolationInfo actorIsolatedRegionInfo)
512- : functionExitingInst(cast<TermInst>(functionExitingInst)),
513- inoutSendingParam(inoutSendingParam),
514- actorIsolatedRegionInfo(actorIsolatedRegionInfo) {}
515- };
516-
517497struct AssignIsolatedIntoOutSendingParameterInfo {
518498 /// The user that actually caused the transfer.
519499 Operand *srcOperand;
@@ -577,8 +557,6 @@ class TransferNonSendableImpl {
577557 SmallFrozenMultiMap<Operand *, RequireInst, 8>
578558 transferOpToRequireInstMultiMap;
579559 SmallVector<PartitionOpError, 8> foundVerbatimErrors;
580- SmallVector<InOutSendingNotDisconnectedInfo, 8>
581- inoutSendingNotDisconnectedInfoList;
582560 SmallVector<AssignIsolatedIntoOutSendingParameterInfo, 8>
583561 assignIsolatedIntoOutSendingParameterInfoList;
584562
@@ -591,7 +569,6 @@ class TransferNonSendableImpl {
591569 void runDiagnosticEvaluator();
592570
593571 void emitUseAfterTransferDiagnostics();
594- void emitInOutSendingNotDisconnectedInfoList();
595572 void emitAssignIsolatedIntoSendingResultDiagnostics();
596573 void emitVerbatimErrors();
597574};
@@ -2021,13 +1998,26 @@ bool SentNeverSendableDiagnosticInferrer::run() {
20211998namespace {
20221999
20232000class InOutSendingNotDisconnectedDiagnosticEmitter {
2024- InOutSendingNotDisconnectedInfo info;
2001+ /// The function exiting inst where the 'inout sending' parameter was actor
2002+ /// isolated.
2003+ TermInst *functionExitingInst;
2004+
2005+ /// The 'inout sending' param that we are emitting an error for.
2006+ SILValue inoutSendingParam;
2007+
2008+ /// The dynamic actor isolated region info of our 'inout sending' value's
2009+ /// region at the terminator inst.
2010+ SILDynamicMergedIsolationInfo actorIsolatedRegionInfo;
2011+
20252012 bool emittedErrorDiagnostic = false;
20262013
20272014public:
20282015 InOutSendingNotDisconnectedDiagnosticEmitter(
2029- InOutSendingNotDisconnectedInfo info)
2030- : info(info) {}
2016+ TermInst *functionExitingInst, SILValue inoutSendingParam,
2017+ SILDynamicMergedIsolationInfo actorIsolatedRegionInfo)
2018+ : functionExitingInst(functionExitingInst),
2019+ inoutSendingParam(inoutSendingParam),
2020+ actorIsolatedRegionInfo(actorIsolatedRegionInfo) {}
20312021
20322022 ~InOutSendingNotDisconnectedDiagnosticEmitter() {
20332023 // If we were supposed to emit a diagnostic and didn't emit an unknown
@@ -2036,12 +2026,10 @@ class InOutSendingNotDisconnectedDiagnosticEmitter {
20362026 emitUnknownPatternError();
20372027 }
20382028
2039- SILFunction *getFunction() const {
2040- return info.inoutSendingParam->getFunction();
2041- }
2029+ SILFunction *getFunction() const { return inoutSendingParam->getFunction(); }
20422030
20432031 std::optional<DiagnosticBehavior> getBehaviorLimit() const {
2044- return info. inoutSendingParam->getType().getConcurrencyDiagnosticBehavior(
2032+ return inoutSendingParam->getType().getConcurrencyDiagnosticBehavior(
20452033 getFunction());
20462034 }
20472035
@@ -2051,15 +2039,15 @@ class InOutSendingNotDisconnectedDiagnosticEmitter {
20512039 "RegionIsolation: Aborting on unknown pattern match error");
20522040 }
20532041
2054- diagnoseError(info. functionExitingInst,
2042+ diagnoseError(functionExitingInst,
20552043 diag::regionbasedisolation_unknown_pattern)
20562044 .limitBehaviorIf(getBehaviorLimit());
20572045 }
20582046
20592047 void emit();
20602048
20612049 ASTContext &getASTContext() const {
2062- return info. functionExitingInst->getFunction()->getASTContext();
2050+ return functionExitingInst->getFunction()->getASTContext();
20632051 }
20642052
20652053 template <typename... T, typename... U>
@@ -2106,7 +2094,7 @@ class InOutSendingNotDisconnectedDiagnosticEmitter {
21062094void InOutSendingNotDisconnectedDiagnosticEmitter::emit() {
21072095 // We should always be able to find a name for an inout sending param. If we
21082096 // do not, emit an unknown pattern error.
2109- auto varName = inferNameHelper(info. inoutSendingParam);
2097+ auto varName = inferNameHelper(inoutSendingParam);
21102098 if (!varName) {
21112099 return emitUnknownPatternError();
21122100 }
@@ -2115,29 +2103,22 @@ void InOutSendingNotDisconnectedDiagnosticEmitter::emit() {
21152103 SmallString<64> descriptiveKindStr;
21162104 {
21172105 llvm::raw_svector_ostream os(descriptiveKindStr);
2118- info. actorIsolatedRegionInfo.printForDiagnostics(os);
2106+ actorIsolatedRegionInfo.printForDiagnostics(os);
21192107 os << ' ';
21202108 }
21212109
21222110 diagnoseError(
2123- info. functionExitingInst,
2111+ functionExitingInst,
21242112 diag::regionbasedisolation_inout_sending_cannot_be_actor_isolated,
21252113 *varName, descriptiveKindStr)
21262114 .limitBehaviorIf(getBehaviorLimit());
21272115
21282116 diagnoseNote(
2129- info. functionExitingInst,
2117+ functionExitingInst,
21302118 diag::regionbasedisolation_inout_sending_cannot_be_actor_isolated_note,
21312119 *varName, descriptiveKindStr);
21322120}
21332121
2134- void TransferNonSendableImpl::emitInOutSendingNotDisconnectedInfoList() {
2135- for (auto &info : inoutSendingNotDisconnectedInfoList) {
2136- InOutSendingNotDisconnectedDiagnosticEmitter emitter(info);
2137- emitter.emit();
2138- }
2139- }
2140-
21412122//===----------------------------------------------------------------------===//
21422123// MARK: AssignTransferNonTransferrableIntoSendingResult
21432124//===----------------------------------------------------------------------===//
@@ -2362,12 +2343,6 @@ struct DiagnosticEvaluator final
23622343 /// sending operands to require insts.
23632344 SmallVectorImpl<PartitionOpError> &foundVerbatimErrors;
23642345
2365- /// A list of state that tracks specific 'inout sending' parameters that were
2366- /// actor isolated on function exit with the necessary state to emit the
2367- /// error.
2368- SmallVectorImpl<InOutSendingNotDisconnectedInfo>
2369- &inoutSendingNotDisconnectedInfoList;
2370-
23712346 /// A list of state that tracks specific 'inout sending' parameters that were
23722347 /// actor isolated on function exit with the necessary state to emit the
23732348 /// error.
@@ -2379,8 +2354,6 @@ struct DiagnosticEvaluator final
23792354 SmallFrozenMultiMap<Operand *, RequireInst, 8>
23802355 &transferOpToRequireInstMultiMap,
23812356 SmallVectorImpl<PartitionOpError> &foundVerbatimErrors,
2382- SmallVectorImpl<InOutSendingNotDisconnectedInfo>
2383- &inoutSendingNotDisconnectedInfoList,
23842357 SmallVectorImpl<AssignIsolatedIntoOutSendingParameterInfo>
23852358 &assignIsolatedIntoOutSendingParameterInfo,
23862359 TransferringOperandToStateMap &operandToStateMap)
@@ -2389,8 +2362,6 @@ struct DiagnosticEvaluator final
23892362 info(info),
23902363 transferOpToRequireInstMultiMap(transferOpToRequireInstMultiMap),
23912364 foundVerbatimErrors(foundVerbatimErrors),
2392- inoutSendingNotDisconnectedInfoList(
2393- inoutSendingNotDisconnectedInfoList),
23942365 assignIsolatedIntoOutSendingParameterInfoList(
23952366 assignIsolatedIntoOutSendingParameterInfo) {}
23962367
@@ -2430,31 +2401,6 @@ struct DiagnosticEvaluator final
24302401 RequireInst::forUseAfterTransfer(partitionOp.getSourceInst()));
24312402 }
24322403
2433- void handleInOutSendingNotDisconnectedAtExitError(
2434- InOutSendingNotDisconnectedAtExitError error) const {
2435- const PartitionOp &partitionOp = *error.op;
2436- Element inoutSendingVal = error.inoutSendingElement;
2437- auto isolationRegionInfo = error.isolationInfo;
2438-
2439- REGIONBASEDISOLATION_LOG(
2440- llvm::dbgs() << " Emitting Error. Kind: InOut Sending ActorIsolated "
2441- "at end of "
2442- "Function Error!\n"
2443- << " ID: %%" << inoutSendingVal << "\n"
2444- << " Rep: "
2445- << *info->getValueMap().getRepresentative(inoutSendingVal)
2446- << " Dynamic Isolation Region: ";
2447- isolationRegionInfo.printForOneLineLogging(llvm::dbgs());
2448- llvm::dbgs() << '\n');
2449- auto *self = const_cast<DiagnosticEvaluator *>(this);
2450- auto nonTransferrableValue =
2451- info->getValueMap().getRepresentative(inoutSendingVal);
2452-
2453- self->inoutSendingNotDisconnectedInfoList.emplace_back(
2454- partitionOp.getSourceInst(), nonTransferrableValue,
2455- isolationRegionInfo);
2456- }
2457-
24582404 void handleAssignTransferNonTransferrableIntoSendingResult(
24592405 AssignNeverSendableIntoSendingResultError error) const {
24602406 const PartitionOp &partitionOp = *error.op;
@@ -2517,10 +2463,10 @@ struct DiagnosticEvaluator final
25172463 case PartitionOpError::LocalUseAfterSend: {
25182464 return handleLocalUseAfterTransfer(error.getLocalUseAfterSendError());
25192465 }
2520- case PartitionOpError::SentNeverSendable: {
2466+ case PartitionOpError::InOutSendingNotDisconnectedAtExit:
2467+ case PartitionOpError::SentNeverSendable:
25212468 foundVerbatimErrors.emplace_back(error);
25222469 return;
2523- }
25242470 case PartitionOpError::AssignNeverSendableIntoSendingResult: {
25252471 return handleAssignTransferNonTransferrableIntoSendingResult(
25262472 error.getAssignNeverSendableIntoSendingResultError());
@@ -2529,10 +2475,6 @@ struct DiagnosticEvaluator final
25292475 return handleInOutSendingNotInitializedAtExitError(
25302476 error.getInOutSendingNotInitializedAtExitError());
25312477 }
2532- case PartitionOpError::InOutSendingNotDisconnectedAtExit: {
2533- return handleInOutSendingNotDisconnectedAtExitError(
2534- error.getInOutSendingNotDisconnectedAtExitError());
2535- }
25362478 case PartitionOpError::UnknownCodePattern: {
25372479 return handleUnknownCodePattern(error.getUnknownCodePatternError());
25382480 }
@@ -2602,8 +2544,7 @@ void TransferNonSendableImpl::runDiagnosticEvaluator() {
26022544 Partition workingPartition = blockState.getEntryPartition();
26032545 DiagnosticEvaluator eval(
26042546 workingPartition, info, transferOpToRequireInstMultiMap,
2605- foundVerbatimErrors, inoutSendingNotDisconnectedInfoList,
2606- assignIsolatedIntoOutSendingParameterInfoList,
2547+ foundVerbatimErrors, assignIsolatedIntoOutSendingParameterInfoList,
26072548 info->getTransferringOpToStateMap());
26082549
26092550 // And then evaluate all of our partition ops on the entry partition.
@@ -2634,8 +2575,30 @@ void TransferNonSendableImpl::emitVerbatimErrors() {
26342575 llvm_unreachable("Handled elsewhere");
26352576 case PartitionOpError::AssignNeverSendableIntoSendingResult:
26362577 case PartitionOpError::InOutSendingNotInitializedAtExit:
2637- case PartitionOpError::InOutSendingNotDisconnectedAtExit:
26382578 llvm_unreachable("Not implemented yet");
2579+ case PartitionOpError::InOutSendingNotDisconnectedAtExit: {
2580+ auto error = erasedError.getInOutSendingNotDisconnectedAtExitError();
2581+ auto inoutSendingVal =
2582+ info->getValueMap().getRepresentative(error.inoutSendingElement);
2583+ auto isolationRegionInfo = error.isolationInfo;
2584+
2585+ REGIONBASEDISOLATION_LOG(
2586+ llvm::dbgs()
2587+ << " Emitting Error. Kind: InOut Sending ActorIsolated "
2588+ "at end of "
2589+ "Function Error!\n"
2590+ << " ID: %%" << error.inoutSendingElement << "\n"
2591+ << " Rep: " << *inoutSendingVal
2592+ << " Dynamic Isolation Region: ";
2593+ isolationRegionInfo.printForOneLineLogging(llvm::dbgs());
2594+ llvm::dbgs() << '\n');
2595+
2596+ InOutSendingNotDisconnectedDiagnosticEmitter emitter(
2597+ cast<TermInst>(error.op->getSourceInst()), inoutSendingVal,
2598+ isolationRegionInfo);
2599+ emitter.emit();
2600+ continue;
2601+ }
26392602 case PartitionOpError::SentNeverSendable: {
26402603 auto e = erasedError.getSentNeverSendableError();
26412604 auto errorLog = [&] {
@@ -2678,7 +2641,6 @@ void TransferNonSendableImpl::emitDiagnostics() {
26782641
26792642 runDiagnosticEvaluator();
26802643 emitUseAfterTransferDiagnostics();
2681- emitInOutSendingNotDisconnectedInfoList();
26822644 emitAssignIsolatedIntoSendingResultDiagnostics();
26832645 emitVerbatimErrors();
26842646}
0 commit comments