Skip to content

Commit 0aa54a6

Browse files
committed
[Region isolation] Re-simplify handling of init_existential* instructions
Centralize the logic for figuring out the conformances for the various init_existential* instructions in a SILIsolationInfo static method, and always go through that when handling "assign" semantics. This way, we can use CONSTANT_TRANSLATION again for these instructions, or a simpler decision process between Assign and LookThrough. The actually undoes a small change made earlier when we stopped looking through `init_existential_value` instructions. Now we do when there are no isolated conformances.
1 parent 2f3ef58 commit 0aa54a6

File tree

4 files changed

+33
-38
lines changed

4 files changed

+33
-38
lines changed

include/swift/SILOptimizer/Utils/SILIsolationInfo.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,10 @@ class SILIsolationInfo {
253253
SILIsolationInfo(Kind kind, Options options = Options())
254254
: actorIsolation(), kind(kind), options(options.toRaw()) {}
255255

256+
/// Infer isolation region from the set of protocol conformances.
257+
static SILIsolationInfo getFromConformances(
258+
SILValue value, ArrayRef<ProtocolConformanceRef> conformances);
259+
256260
public:
257261
SILIsolationInfo() : actorIsolation(), kind(Kind::Unknown), options(0) {}
258262

@@ -534,15 +538,14 @@ class SILIsolationInfo {
534538
return {};
535539
}
536540

537-
/// Infer isolation region from the set of protocol conformances.
538-
static SILIsolationInfo getFromConformances(
539-
SILValue value, ArrayRef<ProtocolConformanceRef> conformances);
540-
541541
/// Determine the isolation of conformances that could be introduced by a
542542
/// cast from sourceType to destType.
543543
static SILIsolationInfo getForCastConformances(
544544
SILValue value, CanType sourceType, CanType destType);
545545

546+
/// Infer isolation of conformances for the given instruction.
547+
static SILIsolationInfo getConformanceIsolation(SILInstruction *inst);
548+
546549
/// A helper that is used to ensure that we treat certain builtin values as
547550
/// non-Sendable that the AST level otherwise thinks are non-Sendable.
548551
///

lib/SILOptimizer/Analysis/RegionAnalysis.cpp

Lines changed: 9 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,8 @@ static bool isStaticallyLookThroughInst(SILInstruction *inst) {
328328
case SILInstructionKind::BeginBorrowInst:
329329
// Look through if it isn't from a var decl.
330330
return !cast<BeginBorrowInst>(inst)->isFromVarDecl();
331+
case SILInstructionKind::InitExistentialValueInst:
332+
return !SILIsolationInfo::getConformanceIsolation(inst);
331333
case SILInstructionKind::UnconditionalCheckedCastInst: {
332334
auto cast = SILDynamicCastInst::getAs(inst);
333335
assert(cast);
@@ -3146,7 +3148,8 @@ class PartitionOpTranslator {
31463148

31473149
case TranslationSemantics::Assign:
31483150
return translateSILMultiAssign(
3149-
inst->getResults(), makeOperandRefRange(inst->getAllOperands()));
3151+
inst->getResults(), makeOperandRefRange(inst->getAllOperands()),
3152+
SILIsolationInfo::getConformanceIsolation(inst));
31503153

31513154
case TranslationSemantics::Require:
31523155
for (auto op : inst->getOperandValues())
@@ -3387,6 +3390,8 @@ CONSTANT_TRANSLATION(CopyBlockInst, Assign)
33873390
CONSTANT_TRANSLATION(CopyBlockWithoutEscapingInst, Assign)
33883391
CONSTANT_TRANSLATION(IndexAddrInst, Assign)
33893392
CONSTANT_TRANSLATION(InitBlockStorageHeaderInst, Assign)
3393+
CONSTANT_TRANSLATION(InitExistentialAddrInst, Assign)
3394+
CONSTANT_TRANSLATION(InitExistentialRefInst, Assign)
33903395
CONSTANT_TRANSLATION(OpenExistentialBoxInst, Assign)
33913396
CONSTANT_TRANSLATION(OpenExistentialRefInst, Assign)
33923397
CONSTANT_TRANSLATION(TailAddrInst, Assign)
@@ -4066,40 +4071,12 @@ PartitionOpTranslator::visitPartialApplyInst(PartialApplyInst *pai) {
40664071
return TranslationSemantics::Special;
40674072
}
40684073

4069-
TranslationSemantics
4070-
PartitionOpTranslator::visitInitExistentialAddrInst(InitExistentialAddrInst *ieai) {
4071-
auto conformanceIsolationInfo = SILIsolationInfo::getFromConformances(
4072-
ieai, ieai->getConformances());
4073-
4074-
translateSILMultiAssign(ieai->getResults(),
4075-
makeOperandRefRange(ieai->getAllOperands()),
4076-
conformanceIsolationInfo);
4077-
4078-
return TranslationSemantics::Special;
4079-
}
4080-
4081-
TranslationSemantics
4082-
PartitionOpTranslator::visitInitExistentialRefInst(InitExistentialRefInst *ieri) {
4083-
auto conformanceIsolationInfo = SILIsolationInfo::getFromConformances(
4084-
ieri, ieri->getConformances());
4085-
4086-
translateSILMultiAssign(ieri->getResults(),
4087-
makeOperandRefRange(ieri->getAllOperands()),
4088-
conformanceIsolationInfo);
4089-
4090-
return TranslationSemantics::Special;
4091-
}
4092-
40934074
TranslationSemantics
40944075
PartitionOpTranslator::visitInitExistentialValueInst(InitExistentialValueInst *ievi) {
4095-
auto conformanceIsolationInfo = SILIsolationInfo::getFromConformances(
4096-
ievi, ievi->getConformances());
4097-
4098-
translateSILMultiAssign(ievi->getResults(),
4099-
makeOperandRefRange(ievi->getAllOperands()),
4100-
conformanceIsolationInfo);
4076+
if (isStaticallyLookThroughInst(ievi))
4077+
return TranslationSemantics::LookThrough;
41014078

4102-
return TranslationSemantics::Special;
4079+
return TranslationSemantics::Assign;
41034080
}
41044081

41054082
TranslationSemantics

lib/SILOptimizer/Utils/SILIsolationInfo.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1171,6 +1171,21 @@ SILIsolationInfo SILIsolationInfo::getForCastConformances(
11711171
return {};
11721172
}
11731173

1174+
SILIsolationInfo SILIsolationInfo::getConformanceIsolation(SILInstruction *inst) {
1175+
// Existential initialization.
1176+
if (auto ieai = dyn_cast<InitExistentialAddrInst>(inst)) {
1177+
return getFromConformances(ieai, ieai->getConformances());
1178+
}
1179+
if (auto ieri = dyn_cast<InitExistentialRefInst>(inst)) {
1180+
return getFromConformances(ieri, ieri->getConformances());
1181+
}
1182+
if (auto ievi = dyn_cast<InitExistentialValueInst>(inst)) {
1183+
return getFromConformances(ievi, ievi->getConformances());
1184+
}
1185+
1186+
return {};
1187+
}
1188+
11741189
void SILIsolationInfo::printOptions(llvm::raw_ostream &os) const {
11751190
if (isolatedConformance) {
11761191
os << "isolated-conformance-to(" << isolatedConformance->getName() << ")";

test/Concurrency/transfernonsendable_instruction_matching_opaquevalues.sil

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,9 +192,9 @@ bb0:
192192
// expected-warning @-1 {{}}
193193
// expected-note @-2 {{}}
194194

195-
%i = init_existential_value %1 : $NonSendableKlass, $NonSendableKlass, $P // expected-note {{access can happen concurrently}}
195+
%i = init_existential_value %1 : $NonSendableKlass, $NonSendableKlass, $P
196196
%f2 = function_ref @useP : $@convention(thin) (@in_guaranteed P) -> ()
197-
apply %f2(%i) : $@convention(thin) (@in_guaranteed P) -> ()
197+
apply %f2(%i) : $@convention(thin) (@in_guaranteed P) -> () // expected-note {{access can happen concurrently}}
198198
destroy_value %i : $P
199199

200200
%9999 = tuple ()

0 commit comments

Comments
 (0)