@@ -109,16 +109,14 @@ class SILIsolationInfo {
109109 // / Unknown -> Disconnected -> TransferringParameter -> Task -> Actor.
110110 // /
111111 // / Unknown means no information. We error when merging on it.
112- enum Kind {
112+ enum Kind : uint8_t {
113113 Unknown,
114114 Disconnected,
115115 Task,
116116 Actor,
117117 };
118118
119119private:
120- Kind kind;
121-
122120 // / The actor isolation if this value has one. The default unspecified case
123121 // / otherwise.
124122 ActorIsolation actorIsolation;
@@ -131,11 +129,14 @@ class SILIsolationInfo {
131129 // / derived isolatedValue from.
132130 ActorInstance actorInstance;
133131
132+ unsigned kind : 8 ;
133+ unsigned unsafeNonIsolated : 1 ;
134+
134135 SILIsolationInfo (SILValue isolatedValue, SILValue actorInstance,
135- ActorIsolation actorIsolation)
136- : kind(Actor ), actorIsolation(actorIsolation ),
137- isolatedValue (isolatedValue ),
138- actorInstance(ActorInstance::getForValue(actorInstance) ) {
136+ ActorIsolation actorIsolation, bool isUnsafeNonIsolated )
137+ : actorIsolation(actorIsolation ), isolatedValue(isolatedValue ),
138+ actorInstance (ActorInstance::getForValue(actorInstance)), kind(Actor ),
139+ unsafeNonIsolated(isUnsafeNonIsolated ) {
139140 assert ((!actorInstance ||
140141 (actorIsolation.getKind () == ActorIsolation::ActorInstance &&
141142 actorInstance->getType ()
@@ -146,31 +147,44 @@ class SILIsolationInfo {
146147 }
147148
148149 SILIsolationInfo (SILValue isolatedValue, ActorInstance actorInstance,
149- ActorIsolation actorIsolation)
150- : kind(Actor), actorIsolation(actorIsolation),
151- isolatedValue(isolatedValue), actorInstance(actorInstance) {
150+ ActorIsolation actorIsolation, bool isUnsafeNonIsolated)
151+ : actorIsolation(actorIsolation), isolatedValue(isolatedValue),
152+ actorInstance(actorInstance), kind(Actor),
153+ unsafeNonIsolated(isUnsafeNonIsolated) {
152154 assert (actorInstance);
153155 assert (actorIsolation.getKind () == ActorIsolation::ActorInstance);
154156 }
155157
156158 SILIsolationInfo (Kind kind, SILValue isolatedValue)
157- : kind(kind), actorIsolation(), isolatedValue(isolatedValue) {}
159+ : actorIsolation(), isolatedValue(isolatedValue), kind(kind),
160+ unsafeNonIsolated(false ) {}
158161
159- SILIsolationInfo (Kind kind) : kind(kind), actorIsolation() {}
162+ SILIsolationInfo (Kind kind, bool isUnsafeNonIsolated)
163+ : actorIsolation(), kind(kind), unsafeNonIsolated(isUnsafeNonIsolated) {}
160164
161165public:
162- SILIsolationInfo () : kind(Kind::Unknown), actorIsolation() {}
166+ SILIsolationInfo ()
167+ : actorIsolation(), kind(Kind::Unknown), unsafeNonIsolated(false ) {}
163168
164169 operator bool () const { return kind != Kind::Unknown; }
165170
166- operator Kind () const { return kind ; }
171+ operator Kind () const { return getKind () ; }
167172
168- Kind getKind () const { return kind; }
173+ Kind getKind () const { return Kind ( kind) ; }
169174
170175 bool isDisconnected () const { return kind == Kind::Disconnected; }
171176 bool isActorIsolated () const { return kind == Kind::Actor; }
172177 bool isTaskIsolated () const { return kind == Kind::Task; }
173178
179+ bool isUnsafeNonIsolated () const { return unsafeNonIsolated; }
180+
181+ SILIsolationInfo withUnsafeNonIsolated (bool newValue = true ) const {
182+ assert (*this && " Cannot be unknown" );
183+ auto self = *this ;
184+ self.unsafeNonIsolated = newValue;
185+ return self;
186+ }
187+
174188 void print (llvm::raw_ostream &os) const ;
175189
176190 SWIFT_DEBUG_DUMP {
@@ -212,7 +226,9 @@ class SILIsolationInfo {
212226
213227 [[nodiscard]] SILIsolationInfo merge (SILIsolationInfo other) const ;
214228
215- static SILIsolationInfo getDisconnected () { return {Kind::Disconnected}; }
229+ static SILIsolationInfo getDisconnected (bool isUnsafeNonIsolated) {
230+ return {Kind::Disconnected, isUnsafeNonIsolated};
231+ }
216232
217233 // / Create an actor isolation for a value that we know is actor isolated to a
218234 // / specific actor, but we do not know the specific instance yet.
@@ -228,7 +244,8 @@ class SILIsolationInfo {
228244 static SILIsolationInfo
229245 getFlowSensitiveActorIsolated (SILValue isolatedValue,
230246 ActorIsolation actorIsolation) {
231- return {isolatedValue, SILValue (), actorIsolation};
247+ return {isolatedValue, SILValue (), actorIsolation,
248+ false /* nonisolated(unsafe)*/ };
232249 }
233250
234251 // / Only use this as a fallback if we cannot find better information.
@@ -237,7 +254,8 @@ class SILIsolationInfo {
237254 if (crossing.getCalleeIsolation ().isActorIsolated ()) {
238255 // SIL level, just let it through
239256 return SILIsolationInfo (SILValue (), SILValue (),
240- crossing.getCalleeIsolation ());
257+ crossing.getCalleeIsolation (),
258+ false /* nonisolated(unsafe)*/ );
241259 }
242260
243261 return {};
@@ -253,7 +271,8 @@ class SILIsolationInfo {
253271 return {};
254272 }
255273 return {isolatedValue, actorInstance,
256- ActorIsolation::forActorInstanceSelf (typeDecl)};
274+ ActorIsolation::forActorInstanceSelf (typeDecl),
275+ false /* nonisolated(unsafe)*/ };
257276 }
258277
259278 static SILIsolationInfo getActorInstanceIsolated (SILValue isolatedValue,
@@ -266,7 +285,8 @@ class SILIsolationInfo {
266285 return {};
267286 }
268287 return {isolatedValue, actorInstance,
269- ActorIsolation::forActorInstanceSelf (typeDecl)};
288+ ActorIsolation::forActorInstanceSelf (typeDecl),
289+ false /* nonisolated(unsafe)*/ };
270290 }
271291
272292 // / A special actor instance isolated for partial apply cases where we do not
@@ -281,13 +301,15 @@ class SILIsolationInfo {
281301 return {};
282302 }
283303 return {isolatedValue, SILValue (),
284- ActorIsolation::forActorInstanceSelf (typeDecl)};
304+ ActorIsolation::forActorInstanceSelf (typeDecl),
305+ false /* nonisolated(unsafe)*/ };
285306 }
286307
287308 static SILIsolationInfo getGlobalActorIsolated (SILValue value,
288309 Type globalActorType) {
289310 return {value, SILValue () /* no actor instance*/ ,
290- ActorIsolation::forGlobalActor (globalActorType)};
311+ ActorIsolation::forGlobalActor (globalActorType),
312+ false /* nonisolated(unsafe)*/ };
291313 }
292314
293315 static SILIsolationInfo getGlobalActorIsolated (SILValue value,
0 commit comments