Skip to content

Commit 371e1b8

Browse files
authored
Merge pull request #13096 from gottesmm/pr-2b9d20d5f94e2bcc9fff00ab39293a8c091f285a
2 parents 8987394 + 1a5b7e1 commit 371e1b8

File tree

2 files changed

+26
-50
lines changed

2 files changed

+26
-50
lines changed

lib/SILGen/SILGenBuilder.cpp

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -437,34 +437,18 @@ ManagedValue SILGenBuilder::formalAccessBufferForExpr(
437437
ManagedValue SILGenBuilder::createUncheckedEnumData(SILLocation loc,
438438
ManagedValue operand,
439439
EnumElementDecl *element) {
440-
if (operand.hasCleanup()) {
441-
SILValue newValue =
442-
SILBuilder::createUncheckedEnumData(loc, operand.forward(SGF), element);
443-
return SGF.emitManagedRValueWithCleanup(newValue);
444-
}
445-
446-
ManagedValue borrowedBase = operand.borrow(SGF, loc);
447-
SILValue newValue = SILBuilder::createUncheckedEnumData(
448-
loc, borrowedBase.getValue(), element);
449-
return ManagedValue::forUnmanaged(newValue);
440+
CleanupCloner cloner(*this, operand);
441+
SILValue result = createUncheckedEnumData(loc, operand.forward(SGF), element);
442+
return cloner.clone(result);
450443
}
451444

452445
ManagedValue SILGenBuilder::createUncheckedTakeEnumDataAddr(
453446
SILLocation loc, ManagedValue operand, EnumElementDecl *element,
454447
SILType ty) {
455-
// First see if we have a cleanup. If we do, we are going to forward and emit
456-
// a managed buffer with cleanup.
457-
if (operand.hasCleanup()) {
458-
return SGF.emitManagedBufferWithCleanup(
459-
SILBuilder::createUncheckedTakeEnumDataAddr(loc, operand.forward(SGF),
460-
element, ty));
461-
}
462-
463-
SILValue result = SILBuilder::createUncheckedTakeEnumDataAddr(
464-
loc, operand.getUnmanagedValue(), element, ty);
465-
if (operand.isLValue())
466-
return ManagedValue::forLValue(result);
467-
return ManagedValue::forUnmanaged(result);
448+
CleanupCloner cloner(*this, operand);
449+
SILValue result =
450+
createUncheckedTakeEnumDataAddr(loc, operand.forward(SGF), element);
451+
return cloner.clone(result);
468452
}
469453

470454
ManagedValue SILGenBuilder::createLoadTake(SILLocation loc, ManagedValue v) {

lib/SILGen/SILGenConvert.cpp

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -270,41 +270,33 @@ ManagedValue SILGenFunction::emitCheckedGetOptionalValueFrom(SILLocation loc,
270270
return emitPreconditionOptionalHasValue(loc, src);
271271
}
272272

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) {
277276
SILType origPayloadTy =
278277
addrOrValue.getType().getAnyOptionalObjectType();
279278

280279
auto someDecl = getASTContext().getOptionalSomeDecl();
281-
282-
ManagedValue payload;
283280

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.
288282
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);
299284
}
300285

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);
308300
}
309301

310302
ManagedValue

0 commit comments

Comments
 (0)