Skip to content

Commit 0e27cd1

Browse files
committed
Remove FirstArgOwnershipForwardingSingleValueInst, GuaranteedFirstArgForwardingSingleValueInst, OwnedFirstArgForwardingSingleValueInst, AllArgForwardingSingleValueInst
Replace their uses with OwnershipForwardingSingleValueInstruction.
1 parent 7cb3733 commit 0e27cd1

File tree

3 files changed

+34
-173
lines changed

3 files changed

+34
-173
lines changed

include/swift/SIL/SILInstruction.h

Lines changed: 28 additions & 157 deletions
Original file line numberDiff line numberDiff line change
@@ -1270,14 +1270,13 @@ class ForwardingInstruction {
12701270
///
12711271
/// TODO: This name is extremely misleading because it may apply to an
12721272
/// operation that has no operand at all, like `enum .None`.
1273-
class FirstArgOwnershipForwardingSingleValueInst
1274-
: public SingleValueInstruction,
1275-
public ForwardingInstruction {
1273+
class OwnershipForwardingSingleValueInstruction : public SingleValueInstruction,
1274+
public ForwardingInstruction {
12761275
protected:
1277-
FirstArgOwnershipForwardingSingleValueInst(SILInstructionKind kind,
1278-
SILDebugLocation debugLoc,
1279-
SILType ty,
1280-
ValueOwnershipKind ownershipKind)
1276+
OwnershipForwardingSingleValueInstruction(SILInstructionKind kind,
1277+
SILDebugLocation debugLoc,
1278+
SILType ty,
1279+
ValueOwnershipKind ownershipKind)
12811280
: SingleValueInstruction(kind, debugLoc, ty),
12821281
ForwardingInstruction(kind, ownershipKind) {
12831282
assert(classof(kind) && "classof missing new subclass?!");
@@ -1297,97 +1296,8 @@ class FirstArgOwnershipForwardingSingleValueInst
12971296
}
12981297
};
12991298

1300-
/// An ownership forwarding single value that has a preferred operand of owned
1301-
/// but if its inputs are all none can have OwnershipKind::None as a result. We
1302-
/// assume that we always forward from operand 0.
1303-
class OwnedFirstArgForwardingSingleValueInst
1304-
: public FirstArgOwnershipForwardingSingleValueInst {
1305-
protected:
1306-
OwnedFirstArgForwardingSingleValueInst(SILInstructionKind kind,
1307-
SILDebugLocation debugLoc, SILType ty,
1308-
ValueOwnershipKind resultOwnershipKind)
1309-
: FirstArgOwnershipForwardingSingleValueInst(kind, debugLoc, ty,
1310-
resultOwnershipKind) {
1311-
assert(resultOwnershipKind.isCompatibleWith(OwnershipKind::Owned));
1312-
assert(classof(kind) && "classof missing new subclass?!");
1313-
}
1314-
1315-
public:
1316-
ValueOwnershipKind getPreferredOwnership() const {
1317-
return OwnershipKind::Owned;
1318-
}
1319-
1320-
static bool classof(SILNodePointer node) {
1321-
if (auto *i = dyn_cast<SILInstruction>(node.get()))
1322-
return classof(i);
1323-
return false;
1324-
}
1325-
1326-
static bool classof(SILInstructionKind kind) {
1327-
switch (kind) {
1328-
case SILInstructionKind::MarkUninitializedInst:
1329-
return true;
1330-
default:
1331-
return false;
1332-
}
1333-
}
1334-
1335-
static bool classof(const SILInstruction *inst) {
1336-
return classof(inst->getKind());
1337-
}
1338-
};
1339-
1340-
/// An instruction that forwards guaranteed or none ownership. Assumed to always
1341-
/// forward from Operand(0) -> Result(0).
1342-
class GuaranteedFirstArgForwardingSingleValueInst
1343-
: public FirstArgOwnershipForwardingSingleValueInst {
1344-
protected:
1345-
GuaranteedFirstArgForwardingSingleValueInst(
1346-
SILInstructionKind kind, SILDebugLocation debugLoc, SILType ty,
1347-
ValueOwnershipKind resultOwnershipKind)
1348-
: FirstArgOwnershipForwardingSingleValueInst(kind, debugLoc, ty,
1349-
resultOwnershipKind) {
1350-
assert(resultOwnershipKind.isCompatibleWith(OwnershipKind::Guaranteed));
1351-
assert(classof(kind) && "classof missing new subclass?!");
1352-
}
1353-
1354-
public:
1355-
ValueOwnershipKind getPreferredOwnership() const {
1356-
return OwnershipKind::Guaranteed;
1357-
}
1358-
1359-
static bool classof(SILNodePointer node) {
1360-
if (auto *i = dyn_cast<SILInstruction>(node.get()))
1361-
return classof(i);
1362-
return false;
1363-
}
1364-
1365-
static bool classof(SILInstructionKind kind) {
1366-
switch (kind) {
1367-
case SILInstructionKind::TupleExtractInst:
1368-
case SILInstructionKind::StructExtractInst:
1369-
case SILInstructionKind::DifferentiableFunctionExtractInst:
1370-
case SILInstructionKind::LinearFunctionExtractInst:
1371-
case SILInstructionKind::OpenExistentialValueInst:
1372-
case SILInstructionKind::OpenExistentialBoxValueInst:
1373-
return true;
1374-
default:
1375-
return false;
1376-
}
1377-
}
1378-
1379-
static bool classof(const SILInstruction *inst) {
1380-
return classof(inst->getKind());
1381-
}
1382-
};
1383-
13841299
inline bool
1385-
FirstArgOwnershipForwardingSingleValueInst::classof(SILInstructionKind kind) {
1386-
if (OwnedFirstArgForwardingSingleValueInst::classof(kind))
1387-
return true;
1388-
if (GuaranteedFirstArgForwardingSingleValueInst::classof(kind))
1389-
return true;
1390-
1300+
OwnershipForwardingSingleValueInstruction::classof(SILInstructionKind kind) {
13911301
switch (kind) {
13921302
case SILInstructionKind::ObjectInst:
13931303
case SILInstructionKind::EnumInst:
@@ -1404,42 +1314,6 @@ FirstArgOwnershipForwardingSingleValueInst::classof(SILInstructionKind kind) {
14041314
}
14051315
}
14061316

1407-
class AllArgOwnershipForwardingSingleValueInst : public SingleValueInstruction,
1408-
public ForwardingInstruction {
1409-
protected:
1410-
AllArgOwnershipForwardingSingleValueInst(SILInstructionKind kind,
1411-
SILDebugLocation debugLoc,
1412-
SILType ty,
1413-
ValueOwnershipKind ownershipKind)
1414-
: SingleValueInstruction(kind, debugLoc, ty),
1415-
ForwardingInstruction(kind, ownershipKind) {
1416-
assert(classof(kind) && "classof missing new subclass?!");
1417-
}
1418-
1419-
public:
1420-
static bool classof(SILNodePointer node) {
1421-
if (auto *i = dyn_cast<SILInstruction>(node.get()))
1422-
return classof(i);
1423-
return false;
1424-
}
1425-
1426-
static bool classof(SILInstructionKind kind) {
1427-
switch (kind) {
1428-
case SILInstructionKind::StructInst:
1429-
case SILInstructionKind::TupleInst:
1430-
case SILInstructionKind::LinearFunctionInst:
1431-
case SILInstructionKind::DifferentiableFunctionInst:
1432-
return true;
1433-
default:
1434-
return false;
1435-
}
1436-
}
1437-
1438-
static bool classof(const SILInstruction *inst) {
1439-
return classof(inst->getKind());
1440-
}
1441-
};
1442-
14431317
/// A value base result of a multiple value instruction.
14441318
///
14451319
/// *NOTE* We want this to be a pure abstract class that does not add /any/ size
@@ -5010,7 +4884,7 @@ class AssignOrInitInst
50104884
/// this instruction. This is only valid in Raw SIL.
50114885
class MarkUninitializedInst
50124886
: public UnaryInstructionBase<SILInstructionKind::MarkUninitializedInst,
5013-
OwnedFirstArgForwardingSingleValueInst> {
4887+
OwnershipForwardingSingleValueInstruction> {
50144888
friend SILBuilder;
50154889

50164890
public:
@@ -6077,7 +5951,7 @@ class UnconditionalCheckedCastInst final
60775951
/// StructInst - Represents a constructed loadable struct.
60785952
class StructInst final : public InstructionBaseWithTrailingOperands<
60795953
SILInstructionKind::StructInst, StructInst,
6080-
AllArgOwnershipForwardingSingleValueInst> {
5954+
OwnershipForwardingSingleValueInstruction> {
60815955
friend SILBuilder;
60825956

60835957
/// Because of the storage requirements of StructInst, object
@@ -6331,7 +6205,7 @@ class SetDeallocatingInst
63316205
/// static initializer list.
63326206
class ObjectInst final : public InstructionBaseWithTrailingOperands<
63336207
SILInstructionKind::ObjectInst, ObjectInst,
6334-
FirstArgOwnershipForwardingSingleValueInst> {
6208+
OwnershipForwardingSingleValueInstruction> {
63356209
friend SILBuilder;
63366210

63376211
unsigned numBaseElements;
@@ -6378,7 +6252,7 @@ class ObjectInst final : public InstructionBaseWithTrailingOperands<
63786252
/// TupleInst - Represents a constructed loadable tuple.
63796253
class TupleInst final : public InstructionBaseWithTrailingOperands<
63806254
SILInstructionKind::TupleInst, TupleInst,
6381-
AllArgOwnershipForwardingSingleValueInst> {
6255+
OwnershipForwardingSingleValueInstruction> {
63826256
friend SILBuilder;
63836257

63846258
/// Because of the storage requirements of TupleInst, object
@@ -6453,7 +6327,7 @@ class TupleInst final : public InstructionBaseWithTrailingOperands<
64536327
/// elements.
64546328
class EnumInst
64556329
: public InstructionBase<SILInstructionKind::EnumInst,
6456-
FirstArgOwnershipForwardingSingleValueInst> {
6330+
OwnershipForwardingSingleValueInstruction> {
64576331
friend SILBuilder;
64586332
enum : unsigned { InvalidCaseIndex = ~unsigned(0) };
64596333

@@ -6507,7 +6381,7 @@ class EnumInst
65076381
/// the tag.
65086382
class UncheckedEnumDataInst
65096383
: public UnaryInstructionBase<SILInstructionKind::UncheckedEnumDataInst,
6510-
FirstArgOwnershipForwardingSingleValueInst> {
6384+
OwnershipForwardingSingleValueInstruction> {
65116385
friend SILBuilder;
65126386
enum : unsigned { InvalidCaseIndex = ~unsigned(0) };
65136387

@@ -6921,7 +6795,7 @@ class ExistentialMetatypeInst
69216795
/// Extract a numbered element out of a value of tuple type.
69226796
class TupleExtractInst
69236797
: public UnaryInstructionBase<SILInstructionKind::TupleExtractInst,
6924-
GuaranteedFirstArgForwardingSingleValueInst> {
6798+
OwnershipForwardingSingleValueInstruction> {
69256799
friend SILBuilder;
69266800
USE_SHARED_UINT32;
69276801

@@ -7053,7 +6927,7 @@ class FieldIndexCacheBase : public ParentTy {
70536927
class StructExtractInst
70546928
: public UnaryInstructionBase<
70556929
SILInstructionKind::StructExtractInst,
7056-
FieldIndexCacheBase<GuaranteedFirstArgForwardingSingleValueInst>> {
6930+
FieldIndexCacheBase<OwnershipForwardingSingleValueInstruction>> {
70576931
friend SILBuilder;
70586932

70596933
StructExtractInst(SILDebugLocation DebugLoc, SILValue Operand, VarDecl *Field,
@@ -7321,7 +7195,7 @@ class OpenExistentialAddrInst
73217195
/// captures the (dynamic) conformances.
73227196
class OpenExistentialValueInst
73237197
: public UnaryInstructionBase<SILInstructionKind::OpenExistentialValueInst,
7324-
GuaranteedFirstArgForwardingSingleValueInst> {
7198+
OwnershipForwardingSingleValueInstruction> {
73257199
friend SILBuilder;
73267200

73277201
OpenExistentialValueInst(SILDebugLocation debugLoc, SILValue operand,
@@ -7342,7 +7216,7 @@ class OpenExistentialValueInst
73427216
/// captures the (dynamic) conformances.
73437217
class OpenExistentialRefInst
73447218
: public UnaryInstructionBase<SILInstructionKind::OpenExistentialRefInst,
7345-
FirstArgOwnershipForwardingSingleValueInst> {
7219+
OwnershipForwardingSingleValueInstruction> {
73467220
friend SILBuilder;
73477221

73487222
OpenExistentialRefInst(SILDebugLocation DebugLoc, SILValue Operand,
@@ -7406,7 +7280,7 @@ class OpenExistentialBoxInst
74067280
class OpenExistentialBoxValueInst
74077281
: public UnaryInstructionBase<
74087282
SILInstructionKind::OpenExistentialBoxValueInst,
7409-
GuaranteedFirstArgForwardingSingleValueInst> {
7283+
OwnershipForwardingSingleValueInstruction> {
74107284
friend SILBuilder;
74117285

74127286
OpenExistentialBoxValueInst(SILDebugLocation DebugLoc, SILValue operand,
@@ -7505,7 +7379,7 @@ class InitExistentialValueInst final
75057379
class InitExistentialRefInst final
75067380
: public UnaryInstructionWithTypeDependentOperandsBase<
75077381
SILInstructionKind::InitExistentialRefInst, InitExistentialRefInst,
7508-
FirstArgOwnershipForwardingSingleValueInst> {
7382+
OwnershipForwardingSingleValueInstruction> {
75097383
friend SILBuilder;
75107384

75117385
CanType ConcreteType;
@@ -8190,7 +8064,7 @@ class UncheckedOwnershipConversionInst
81908064
/// "value"'.
81918065
class MarkDependenceInst
81928066
: public InstructionBase<SILInstructionKind::MarkDependenceInst,
8193-
FirstArgOwnershipForwardingSingleValueInst> {
8067+
OwnershipForwardingSingleValueInstruction> {
81948068
friend SILBuilder;
81958069

81968070
FixedOperandList<2> Operands;
@@ -8530,7 +8404,7 @@ class MarkUnresolvedReferenceBindingInst
85308404
class CopyableToMoveOnlyWrapperValueInst
85318405
: public UnaryInstructionBase<
85328406
SILInstructionKind::CopyableToMoveOnlyWrapperValueInst,
8533-
FirstArgOwnershipForwardingSingleValueInst> {
8407+
OwnershipForwardingSingleValueInstruction> {
85348408
public:
85358409
enum InitialKind {
85368410
Guaranteed,
@@ -8592,7 +8466,7 @@ class CopyableToMoveOnlyWrapperValueInst
85928466
class MoveOnlyWrapperToCopyableValueInst
85938467
: public UnaryInstructionBase<
85948468
SILInstructionKind::MoveOnlyWrapperToCopyableValueInst,
8595-
FirstArgOwnershipForwardingSingleValueInst> {
8469+
OwnershipForwardingSingleValueInstruction> {
85968470
public:
85978471
enum InitialKind {
85988472
Guaranteed,
@@ -10436,7 +10310,7 @@ class DifferentiableFunctionInst final
1043610310
: public InstructionBaseWithTrailingOperands<
1043710311
SILInstructionKind::DifferentiableFunctionInst,
1043810312
DifferentiableFunctionInst,
10439-
AllArgOwnershipForwardingSingleValueInst> {
10313+
OwnershipForwardingSingleValueInstruction> {
1044010314
private:
1044110315
friend SILBuilder;
1044210316
/// Differentiability parameter indices.
@@ -10550,7 +10424,7 @@ class DifferentiableFunctionInst final
1055010424
class LinearFunctionInst final
1055110425
: public InstructionBaseWithTrailingOperands<
1055210426
SILInstructionKind::LinearFunctionInst, LinearFunctionInst,
10553-
AllArgOwnershipForwardingSingleValueInst> {
10427+
OwnershipForwardingSingleValueInstruction> {
1055410428
private:
1055510429
friend SILBuilder;
1055610430
/// Parameters to differentiate with respect to.
@@ -10615,7 +10489,7 @@ class LinearFunctionInst final
1061510489
class DifferentiableFunctionExtractInst
1061610490
: public UnaryInstructionBase<
1061710491
SILInstructionKind::DifferentiableFunctionExtractInst,
10618-
GuaranteedFirstArgForwardingSingleValueInst> {
10492+
OwnershipForwardingSingleValueInstruction> {
1061910493
private:
1062010494
/// The extractee.
1062110495
NormalDifferentiableFunctionTypeComponent Extractee;
@@ -10658,7 +10532,7 @@ class DifferentiableFunctionExtractInst
1065810532
/// extract the specified function.
1065910533
class LinearFunctionExtractInst
1066010534
: public UnaryInstructionBase<SILInstructionKind::LinearFunctionExtractInst,
10661-
GuaranteedFirstArgForwardingSingleValueInst> {
10535+
OwnershipForwardingSingleValueInstruction> {
1066210536
private:
1066310537
/// The extractee.
1066410538
LinearDifferentiableFunctionTypeComponent extractee;
@@ -10941,8 +10815,7 @@ inline bool Operand::isTypeDependent() const {
1094110815
}
1094210816

1094310817
inline bool ForwardingInstruction::isa(SILInstructionKind kind) {
10944-
return FirstArgOwnershipForwardingSingleValueInst::classof(kind) ||
10945-
AllArgOwnershipForwardingSingleValueInst::classof(kind) ||
10818+
return OwnershipForwardingSingleValueInstruction::classof(kind) ||
1094610819
OwnershipForwardingTermInst::classof(kind) ||
1094710820
OwnershipForwardingConversionInst::classof(kind) ||
1094810821
OwnershipForwardingSelectEnumInstBase::classof(kind) ||
@@ -10956,9 +10829,7 @@ inline ForwardingInstruction *ForwardingInstruction::get(SILInstruction *inst) {
1095610829
// casting to ForwardingInstruction to ensure that we offset to the
1095710830
// appropriate offset inside of inst instead of converting inst's current
1095810831
// location to an ForwardingInstruction which would be incorrect.
10959-
if (auto *result = dyn_cast<FirstArgOwnershipForwardingSingleValueInst>(inst))
10960-
return result;
10961-
if (auto *result = dyn_cast<AllArgOwnershipForwardingSingleValueInst>(inst))
10832+
if (auto *result = dyn_cast<OwnershipForwardingSingleValueInstruction>(inst))
1096210833
return result;
1096310834
if (auto *result = dyn_cast<OwnershipForwardingTermInst>(inst))
1096410835
return result;

lib/SIL/Utils/OwnershipUtils.cpp

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1366,10 +1366,7 @@ ValueOwnershipKind ForwardingOperand::getForwardingOwnershipKind() const {
13661366
// NOTE: This if chain is meant to be a covered switch, so make sure to return
13671367
// in each if itself since we have an unreachable at the bottom to ensure if a
13681368
// new subclass of OwnershipForwardingInst is added
1369-
if (auto *ofsvi = dyn_cast<AllArgOwnershipForwardingSingleValueInst>(user))
1370-
return ofsvi->getForwardingOwnershipKind();
1371-
1372-
if (auto *ofsvi = dyn_cast<FirstArgOwnershipForwardingSingleValueInst>(user))
1369+
if (auto *ofsvi = dyn_cast<OwnershipForwardingSingleValueInstruction>(user))
13731370
return ofsvi->getForwardingOwnershipKind();
13741371

13751372
if (auto *ofci = dyn_cast<OwnershipForwardingConversionInst>(user))
@@ -1405,9 +1402,7 @@ void ForwardingOperand::setForwardingOwnershipKind(
14051402
// NOTE: This if chain is meant to be a covered switch, so make sure to return
14061403
// in each if itself since we have an unreachable at the bottom to ensure if a
14071404
// new subclass of OwnershipForwardingInst is added
1408-
if (auto *ofsvi = dyn_cast<AllArgOwnershipForwardingSingleValueInst>(user))
1409-
return ofsvi->setForwardingOwnershipKind(newKind);
1410-
if (auto *ofsvi = dyn_cast<FirstArgOwnershipForwardingSingleValueInst>(user))
1405+
if (auto *ofsvi = dyn_cast<OwnershipForwardingSingleValueInstruction>(user))
14111406
return ofsvi->setForwardingOwnershipKind(newKind);
14121407
if (auto *ofci = dyn_cast<OwnershipForwardingConversionInst>(user))
14131408
return ofci->setForwardingOwnershipKind(newKind);
@@ -1471,11 +1466,7 @@ void ForwardingOperand::replaceOwnershipKind(ValueOwnershipKind oldKind,
14711466
ValueOwnershipKind newKind) const {
14721467
auto *user = use->getUser();
14731468

1474-
if (auto *fInst = dyn_cast<AllArgOwnershipForwardingSingleValueInst>(user))
1475-
if (fInst->getForwardingOwnershipKind() == oldKind)
1476-
return fInst->setForwardingOwnershipKind(newKind);
1477-
1478-
if (auto *fInst = dyn_cast<FirstArgOwnershipForwardingSingleValueInst>(user))
1469+
if (auto *fInst = dyn_cast<OwnershipForwardingSingleValueInstruction>(user))
14791470
if (fInst->getForwardingOwnershipKind() == oldKind)
14801471
return fInst->setForwardingOwnershipKind(newKind);
14811472

0 commit comments

Comments
 (0)