Skip to content

Commit bee053f

Browse files
committed
Switch InitializationPtr to use PossiblyUniquePtr so that we can just
forward existing initializations around when necessary.
1 parent 89d5325 commit bee053f

15 files changed

+43
-42
lines changed

lib/SILGen/Condition.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,8 @@ void ConditionalValue::exitBranch(RValue &&condResult) {
100100
// already.
101101
assert(currentInitialization && "no current initialization?!");
102102
std::move(condResult).forwardInto(SGF, loc,
103-
currentInitialization.release());
103+
currentInitialization.get());
104+
currentInitialization.reset();
104105
scope.reset();
105106
SGF.B.createBranch(loc, contBB);
106107
} else {

lib/SILGen/Condition.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ class ConditionalValue {
109109
std::optional<Scope> scope;
110110

111111
/// A place to hold conditional Initializations of our result.
112-
std::unique_ptr<Initialization> currentInitialization;
112+
InitializationPtr currentInitialization;
113113

114114
public:
115115
/// Begins a conditional computation of the type represented by the given

lib/SILGen/Initialization.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#define SWIFT_LOWERING_INITIALIZATION_H
2020

2121
#include "ManagedValue.h"
22+
#include "swift/Basic/PossiblyUniquePtr.h"
2223
#include "swift/SIL/AbstractionPattern.h"
2324
#include "llvm/ADT/TinyPtrVector.h"
2425
#include <memory>
@@ -28,9 +29,9 @@ namespace Lowering {
2829

2930
class SILGenFunction;
3031
class Initialization;
31-
using InitializationPtr = std::unique_ptr<Initialization>;
32+
using InitializationPtr = PossiblyUniquePtr<Initialization>;
3233
class TemporaryInitialization;
33-
using TemporaryInitializationPtr = std::unique_ptr<TemporaryInitialization>;
34+
using TemporaryInitializationPtr = PossiblyUniquePtr<TemporaryInitialization>;
3435
class ConvertingInitialization;
3536

3637
/// An abstract class for consuming a value. This is used for initializing

lib/SILGen/ResultPlan.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -225,14 +225,14 @@ class IndirectOpenedSelfResultPlan final : public ResultPlan {
225225
/// reabstracting it. The value can actually be a tuple if the
226226
/// abstraction is opaque.
227227
class ScalarResultPlan final : public ResultPlan {
228-
std::unique_ptr<TemporaryInitialization> temporary;
228+
TemporaryInitializationPtr temporary;
229229
AbstractionPattern origType;
230230
CanType substType;
231231
Initialization *init;
232232
SILFunctionTypeRepresentation rep;
233233

234234
public:
235-
ScalarResultPlan(std::unique_ptr<TemporaryInitialization> &&temporary,
235+
ScalarResultPlan(TemporaryInitializationPtr &&temporary,
236236
AbstractionPattern origType, CanType substType,
237237
Initialization *init,
238238
SILFunctionTypeRepresentation rep)
@@ -339,13 +339,13 @@ class InitValueFromTemporaryResultPlan final : public ResultPlan {
339339
Initialization *init;
340340
CanType substType;
341341
ResultPlanPtr subPlan;
342-
std::unique_ptr<TemporaryInitialization> temporary;
342+
TemporaryInitializationPtr temporary;
343343

344344
public:
345345
InitValueFromTemporaryResultPlan(
346346
Initialization *init, CanType substType,
347347
ResultPlanPtr &&subPlan,
348-
std::unique_ptr<TemporaryInitialization> &&temporary)
348+
TemporaryInitializationPtr &&temporary)
349349
: init(init), substType(substType), subPlan(std::move(subPlan)),
350350
temporary(std::move(temporary)) {}
351351

@@ -1249,7 +1249,7 @@ ResultPlanPtr ResultPlanBuilder::buildForScalar(Initialization *init,
12491249
}
12501250

12511251
// Create a temporary if the result is indirect.
1252-
std::unique_ptr<TemporaryInitialization> temporary;
1252+
TemporaryInitializationPtr temporary;
12531253
if (SGF.silConv.isSILIndirect(result)) {
12541254
auto &resultTL = SGF.getTypeLowering(result.getReturnValueType(
12551255
SGF.SGM.M, calleeTy, SGF.getTypeExpansionContext()));

lib/SILGen/SILGenBuiltin.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2130,7 +2130,7 @@ static ManagedValue emitBuiltinEmplace(SILGenFunction &SGF,
21302130
bool didEmitInto;
21312131
Initialization *dest;
21322132
TemporaryInitialization *destTemporary = nullptr;
2133-
std::unique_ptr<Initialization> destOwner;
2133+
InitializationPtr destOwner;
21342134

21352135
// Use the context destination if available.
21362136
if (C.getEmitInto()

lib/SILGen/SILGenConstructor.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -853,7 +853,7 @@ void SILGenFunction::emitEnumConstructor(EnumElementDecl *element) {
853853
Loc.markAutoGenerated();
854854

855855
// Emit the indirect return slot.
856-
std::unique_ptr<Initialization> dest;
856+
InitializationPtr dest;
857857
if (enumTI.isAddressOnly() && silConv.useLoweredAddresses()) {
858858
auto &AC = getASTContext();
859859
auto VD = new (AC) ParamDecl(SourceLoc(), SourceLoc(),
@@ -865,8 +865,7 @@ void SILGenFunction::emitEnumConstructor(EnumElementDecl *element) {
865865
VD->setInterfaceType(enumIfaceTy);
866866
auto resultSlot =
867867
F.begin()->createFunctionArgument(enumTI.getLoweredType(), VD);
868-
dest = std::unique_ptr<Initialization>(
869-
new KnownAddressInitialization(resultSlot));
868+
dest.reset(new KnownAddressInitialization(resultSlot));
870869
}
871870

872871
Scope scope(Cleanups, CleanupLoc);

lib/SILGen/SILGenDecl.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ splitSingleBufferIntoTupleElements(SILGenFunction &SGF, SILLocation loc,
312312
if (eltCleanup.isValid())
313313
splitCleanups.push_back(eltCleanup);
314314

315-
buf.emplace_back(eltInit.release());
315+
buf.emplace_back(std::move(eltInit));
316316
}
317317

318318
return buf;
@@ -1992,7 +1992,7 @@ InitializationPtr SILGenFunction::emitLocalVariableWithCleanup(
19921992
}
19931993

19941994
/// Create an Initialization for an uninitialized temporary.
1995-
std::unique_ptr<TemporaryInitialization>
1995+
TemporaryInitializationPtr
19961996
SILGenFunction::emitTemporary(SILLocation loc, const TypeLowering &tempTL) {
19971997
SILValue addr = emitTemporaryAllocation(loc, tempTL.getLoweredType());
19981998
if (addr->getType().isMoveOnly())
@@ -2002,7 +2002,7 @@ SILGenFunction::emitTemporary(SILLocation loc, const TypeLowering &tempTL) {
20022002
return useBufferAsTemporary(addr, tempTL);
20032003
}
20042004

2005-
std::unique_ptr<TemporaryInitialization>
2005+
TemporaryInitializationPtr
20062006
SILGenFunction::emitFormalAccessTemporary(SILLocation loc,
20072007
const TypeLowering &tempTL) {
20082008
SILValue addr = emitTemporaryAllocation(loc, tempTL.getLoweredType());
@@ -2012,16 +2012,16 @@ SILGenFunction::emitFormalAccessTemporary(SILLocation loc,
20122012
MarkUnresolvedNonCopyableValueInst::CheckKind::ConsumableAndAssignable);
20132013
CleanupHandle cleanup =
20142014
enterDormantFormalAccessTemporaryCleanup(addr, loc, tempTL);
2015-
return std::unique_ptr<TemporaryInitialization>(
2015+
return TemporaryInitializationPtr(
20162016
new TemporaryInitialization(addr, cleanup));
20172017
}
20182018

20192019
/// Create an Initialization for an uninitialized buffer.
2020-
std::unique_ptr<TemporaryInitialization>
2020+
TemporaryInitializationPtr
20212021
SILGenFunction::useBufferAsTemporary(SILValue addr,
20222022
const TypeLowering &tempTL) {
20232023
CleanupHandle cleanup = enterDormantTemporaryCleanup(addr, tempTL);
2024-
return std::unique_ptr<TemporaryInitialization>(
2024+
return TemporaryInitializationPtr(
20252025
new TemporaryInitialization(addr, cleanup));
20262026
}
20272027

lib/SILGen/SILGenDynamicCast.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ namespace {
5959

6060
SGFContext ctx;
6161

62-
std::unique_ptr<TemporaryInitialization> temporary;
62+
TemporaryInitializationPtr temporary;
6363
if (isOperandIndirect()) {
6464
temporary = SGF.emitTemporary(Loc, origSourceTL);
6565
ctx = SGFContext(temporary.get());
@@ -417,7 +417,7 @@ adjustForConditionalCheckedCastOperand(SILLocation loc, ManagedValue src,
417417
if (!hasAbstraction && (!requiresAddress || src.getType().isAddress()))
418418
return src;
419419

420-
std::unique_ptr<TemporaryInitialization> init;
420+
TemporaryInitializationPtr init;
421421
if (requiresAddress) {
422422
init = SGF.emitTemporary(loc, srcAbstractTL);
423423

lib/SILGen/SILGenExpr.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1295,7 +1295,7 @@ RValue RValueEmitter::visitOptionalTryExpr(OptionalTryExpr *E, SGFContext C) {
12951295
bool isByAddress = ((usingProvidedContext || optTL.isAddressOnly()) &&
12961296
SGF.silConv.useLoweredAddresses());
12971297

1298-
std::unique_ptr<TemporaryInitialization> optTemp;
1298+
TemporaryInitializationPtr optTemp;
12991299
if (!isByAddress) {
13001300
// If the caller produced a context for us, but we're not going
13011301
// to use it, make sure we don't.
@@ -6117,7 +6117,7 @@ void SILGenFunction::emitOptionalEvaluation(SILLocation loc, Type optType,
61176117
bool isByAddress = ((usingProvidedContext || optTL.isAddressOnly()) &&
61186118
silConv.useLoweredAddresses());
61196119

6120-
std::unique_ptr<TemporaryInitialization> optTemp;
6120+
TemporaryInitializationPtr optTemp;
61216121
if (!isByAddress) {
61226122
// If the caller produced a context for us, but we're not going
61236123
// to use it, make sure we don't.
@@ -6141,7 +6141,7 @@ void SILGenFunction::emitOptionalEvaluation(SILLocation loc, Type optType,
61416141

61426142
// Inside of the cleanups scope, create a new initialization to
61436143
// emit into optAddr.
6144-
std::unique_ptr<TemporaryInitialization> normalInit;
6144+
TemporaryInitializationPtr normalInit;
61456145
if (isByAddress) {
61466146
normalInit = useBufferAsTemporary(optAddr, optTL);
61476147
}
@@ -7149,7 +7149,7 @@ RValue RValueEmitter::visitConsumeExpr(ConsumeExpr *E, SGFContext C) {
71497149

71507150
// If we aren't loadable, then create a temporary initialization and
71517151
// explicit_copy_addr into that.
7152-
std::unique_ptr<TemporaryInitialization> optTemp;
7152+
TemporaryInitializationPtr optTemp;
71537153
optTemp = SGF.emitTemporary(E, SGF.getTypeLowering(subType));
71547154
SILValue toAddr = optTemp->getAddressForInPlaceInitialization(SGF, E);
71557155
assert(!isa<LValueType>(E->getType()->getCanonicalType()) &&
@@ -7256,7 +7256,7 @@ RValue RValueEmitter::visitCopyExpr(CopyExpr *E, SGFContext C) {
72567256

72577257
// If we aren't loadable, then create a temporary initialization and
72587258
// explicit_copy_addr into that.
7259-
std::unique_ptr<TemporaryInitialization> optTemp;
7259+
TemporaryInitializationPtr optTemp;
72607260
optTemp = SGF.emitTemporary(E, SGF.getTypeLowering(subType));
72617261
SILValue toAddr = optTemp->getAddressForInPlaceInitialization(SGF, E);
72627262
assert(!isa<LValueType>(E->getType()->getCanonicalType()) &&

lib/SILGen/SILGenFunction.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1746,7 +1746,7 @@ void SILGenFunction::emitGeneratorFunction(
17461746
mergeCleanupBlocks();
17471747
}
17481748

1749-
std::unique_ptr<Initialization> SILGenFunction::getSingleValueStmtInit(Expr *E) {
1749+
InitializationPtr SILGenFunction::getSingleValueStmtInit(Expr *E) {
17501750
if (SingleValueStmtInitStack.empty())
17511751
return nullptr;
17521752

@@ -1756,7 +1756,7 @@ std::unique_ptr<Initialization> SILGenFunction::getSingleValueStmtInit(Expr *E)
17561756
return nullptr;
17571757

17581758
auto resultAddr = SingleValueStmtInitStack.back().InitializationBuffer;
1759-
return std::make_unique<KnownAddressInitialization>(resultAddr);
1759+
return make_possibly_unique<KnownAddressInitialization>(resultAddr);
17601760
}
17611761

17621762
void SILGenFunction::emitProfilerIncrement(ASTNode Node) {

0 commit comments

Comments
 (0)