Skip to content

Commit 4265aa1

Browse files
committed
[region-isolation] Refactor InOutSendingNotDisconnectedAtExit to use the error from PartitionUtils.h rather than have its own type.
1 parent 16bbd26 commit 4265aa1

File tree

1 file changed

+50
-88
lines changed

1 file changed

+50
-88
lines changed

lib/SILOptimizer/Mandatory/TransferNonSendable.cpp

Lines changed: 50 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -494,26 +494,6 @@ void RequireLiveness::process(Collection requireInstList) {
494494

495495
namespace {
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-
517497
struct 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() {
20211998
namespace {
20221999

20232000
class 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

20272014
public:
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 {
21062094
void 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

Comments
 (0)