@@ -270,41 +270,33 @@ ManagedValue SILGenFunction::emitCheckedGetOptionalValueFrom(SILLocation loc,
270
270
return emitPreconditionOptionalHasValue (loc, src);
271
271
}
272
272
273
- ManagedValue SILGenFunction::emitUncheckedGetOptionalValueFrom (SILLocation loc,
274
- ManagedValue addrOrValue,
275
- const TypeLowering &optTL,
276
- SGFContext C) {
273
+ ManagedValue SILGenFunction::emitUncheckedGetOptionalValueFrom (
274
+ SILLocation loc, ManagedValue addrOrValue, const TypeLowering &optTL,
275
+ SGFContext C) {
277
276
SILType origPayloadTy =
278
277
addrOrValue.getType ().getAnyOptionalObjectType ();
279
278
280
279
auto someDecl = getASTContext ().getOptionalSomeDecl ();
281
-
282
- ManagedValue payload;
283
280
284
- // Take the payload from the optional. Cheat a bit in the +0
285
- // case--UncheckedTakeEnumData will never actually invalidate an Optional enum
286
- // value.
287
- SILValue payloadVal;
281
+ // Take the payload from the optional.
288
282
if (!addrOrValue.getType ().isAddress ()) {
289
- payloadVal = B.createUncheckedEnumData (loc, addrOrValue.forward (*this ),
290
- someDecl);
291
- } else {
292
- payloadVal =
293
- B.createUncheckedTakeEnumDataAddr (loc, addrOrValue.forward (*this ),
294
- someDecl, origPayloadTy);
295
-
296
- if (optTL.isLoadable ())
297
- payloadVal =
298
- optTL.emitLoad (B, loc, payloadVal, LoadOwnershipQualifier::Take);
283
+ return B.createUncheckedEnumData (loc, addrOrValue, someDecl);
299
284
}
300
285
301
- // Produce a correctly managed value.
302
- if (addrOrValue.hasCleanup ())
303
- payload = emitManagedRValueWithCleanup (payloadVal);
304
- else
305
- payload = ManagedValue::forUnmanaged (payloadVal);
306
-
307
- return payload;
286
+ // Cheat a bit in the +0 case--UncheckedTakeEnumData will never actually
287
+ // invalidate an Optional enum value. This is specific to optionals.
288
+ ManagedValue payload = B.createUncheckedTakeEnumDataAddr (
289
+ loc, addrOrValue, someDecl, origPayloadTy);
290
+ if (!optTL.isLoadable ())
291
+ return payload;
292
+
293
+ // If we do not have a cleanup on our address, use a load_borrow.
294
+ if (!payload.hasCleanup ()) {
295
+ return B.createLoadBorrow (loc, payload);
296
+ }
297
+
298
+ // Otherwise, perform a load take.
299
+ return B.createLoadTake (loc, payload);
308
300
}
309
301
310
302
ManagedValue
0 commit comments