Skip to content

Commit da3f583

Browse files
committed
Add mark_dependence [unresolved]
In preparation for inserting mark_dependence instructions for lifetime dependencies early, immediately after SILGen. That will simplify the implementation of borrowed arguments. Marking them unresolved is needed to make OSSA verification conservative until lifetime dependence diagnostics runs.
1 parent 6ca57e3 commit da3f583

27 files changed

+101
-54
lines changed

SwiftCompilerSources/Sources/SIL/Builder.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -414,8 +414,8 @@ public struct Builder {
414414
return notifyNew(endMutation.getAs(EndCOWMutationInst.self))
415415
}
416416

417-
public func createMarkDependence(value: Value, base: Value, isNonEscaping: Bool) -> MarkDependenceInst {
418-
let markDependence = bridged.createMarkDependence(value.bridged, base.bridged, isNonEscaping)
417+
public func createMarkDependence(value: Value, base: Value, kind: MarkDependenceInst.Kind) -> MarkDependenceInst {
418+
let markDependence = bridged.createMarkDependence(value.bridged, base.bridged, kind)
419419
return notifyNew(markDependence.getAs(MarkDependenceInst.self))
420420
}
421421
}

SwiftCompilerSources/Sources/SIL/Instruction.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -923,11 +923,15 @@ class GetAsyncContinuationAddrInst : SingleValueInstruction, UnaryInstruction {}
923923

924924
final public
925925
class MarkDependenceInst : SingleValueInstruction, ForwardingInstruction {
926+
public typealias Kind = BridgedInstruction.MarkDependenceKind
927+
926928
public var valueOperand: Operand { operands[0] }
927929
public var baseOperand: Operand { operands[1] }
928930
public var value: Value { return valueOperand.value }
929931
public var base: Value { return baseOperand.value }
930-
public var isNonEscaping: Bool { bridged.MarkDependenceInst_isNonEscaping() }
932+
public var dependenceKind: Kind { bridged.MarkDependenceInst_dependenceKind() }
933+
public var isNonEscaping: Bool { dependenceKind == .NonEscaping }
934+
public var isUnresolved: Bool { dependenceKind == .Unresolved }
931935
}
932936

933937
final public class RefToBridgeObjectInst : SingleValueInstruction, ForwardingInstruction {

include/swift/SIL/SILBridging.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -798,6 +798,10 @@ struct BridgedInstruction {
798798
Deinit
799799
};
800800

801+
enum class MarkDependenceKind {
802+
Unresolved, Escaping, NonEscaping
803+
};
804+
801805
struct KeyPathFunctionResults {
802806
enum { maxFunctions = 5 };
803807
BridgedFunction functions[maxFunctions];
@@ -861,7 +865,7 @@ struct BridgedInstruction {
861865
BRIDGED_INLINE SwiftInt SwitchEnumInst_getCaseIndex(SwiftInt idx) const;
862866
BRIDGED_INLINE SwiftInt StoreInst_getStoreOwnership() const;
863867
BRIDGED_INLINE SwiftInt AssignInst_getAssignOwnership() const;
864-
BRIDGED_INLINE bool MarkDependenceInst_isNonEscaping() const;
868+
BRIDGED_INLINE MarkDependenceKind MarkDependenceInst_dependenceKind() const;
865869
BRIDGED_INLINE AccessKind BeginAccessInst_getAccessKind() const;
866870
BRIDGED_INLINE bool BeginAccessInst_isStatic() const;
867871
BRIDGED_INLINE bool CopyAddrInst_isTakeOfSrc() const;
@@ -1203,7 +1207,8 @@ struct BridgedBuilder{
12031207
BridgedType::MetatypeRepresentation representation) const;
12041208
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedInstruction createEndCOWMutation(BridgedValue instance,
12051209
bool keepUnique) const;
1206-
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedInstruction createMarkDependence(BridgedValue value, BridgedValue base, bool isNonEscaping) const;
1210+
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedInstruction createMarkDependence(
1211+
BridgedValue value, BridgedValue base, BridgedInstruction::MarkDependenceKind dependenceKind) const;
12071212
};
12081213

12091214
// Passmanager and Context

include/swift/SIL/SILBridgingImpl.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1098,8 +1098,8 @@ SwiftInt BridgedInstruction::AssignInst_getAssignOwnership() const {
10981098
return (SwiftInt)getAs<swift::AssignInst>()->getOwnershipQualifier();
10991099
}
11001100

1101-
bool BridgedInstruction::MarkDependenceInst_isNonEscaping() const {
1102-
return getAs<swift::MarkDependenceInst>()->isNonEscaping();
1101+
BridgedInstruction::MarkDependenceKind BridgedInstruction::MarkDependenceInst_dependenceKind() const {
1102+
return (MarkDependenceKind)getAs<swift::MarkDependenceInst>()->dependenceKind();
11031103
}
11041104

11051105
BridgedInstruction::AccessKind BridgedInstruction::BeginAccessInst_getAccessKind() const {
@@ -1709,8 +1709,8 @@ BridgedInstruction BridgedBuilder::createEndCOWMutation(BridgedValue instance, b
17091709
keepUnique)};
17101710
}
17111711

1712-
BridgedInstruction BridgedBuilder::createMarkDependence(BridgedValue value, BridgedValue base, bool isNonEscaping) const {
1713-
return {unbridged().createMarkDependence(regularLoc(), value.getSILValue(), base.getSILValue(), isNonEscaping)};
1712+
BridgedInstruction BridgedBuilder::createMarkDependence(BridgedValue value, BridgedValue base, BridgedInstruction::MarkDependenceKind kind) const {
1713+
return {unbridged().createMarkDependence(regularLoc(), value.getSILValue(), base.getSILValue(), swift::MarkDependenceKind(kind))};
17141714
}
17151715

17161716
SWIFT_END_NULLABILITY_ANNOTATIONS

include/swift/SIL/SILBuilder.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2282,18 +2282,19 @@ class SILBuilder {
22822282
SILValue value);
22832283

22842284
MarkDependenceInst *createMarkDependence(SILLocation Loc, SILValue value,
2285-
SILValue base, bool isNonEscaping) {
2285+
SILValue base,
2286+
MarkDependenceKind dependenceKind) {
22862287
return createMarkDependence(Loc, value, base, value->getOwnershipKind(),
2287-
isNonEscaping);
2288+
dependenceKind);
22882289
}
22892290

22902291
MarkDependenceInst *
22912292
createMarkDependence(SILLocation Loc, SILValue value, SILValue base,
22922293
ValueOwnershipKind forwardingOwnershipKind,
2293-
bool isNonEscaping) {
2294+
MarkDependenceKind dependenceKind) {
22942295
return insert(new (getModule()) MarkDependenceInst(
22952296
getSILDebugLocation(Loc), value, base,
2296-
forwardingOwnershipKind, isNonEscaping));
2297+
forwardingOwnershipKind, dependenceKind));
22972298
}
22982299

22992300
IsUniqueInst *createIsUnique(SILLocation Loc, SILValue operand) {

include/swift/SIL/SILCloner.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2955,7 +2955,7 @@ void SILCloner<ImplClass>::visitMarkDependenceInst(MarkDependenceInst *Inst) {
29552955
getBuilder().hasOwnership()
29562956
? Inst->getForwardingOwnershipKind()
29572957
: ValueOwnershipKind(OwnershipKind::None),
2958-
/*isNonEscaping*/false));
2958+
Inst->dependenceKind()));
29592959
}
29602960

29612961
template<typename ImplClass>

include/swift/SIL/SILInstruction.h

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8353,6 +8353,11 @@ class UncheckedOwnershipConversionInst
83538353
}
83548354
};
83558355

8356+
enum class MarkDependenceKind {
8357+
Unresolved, Escaping, NonEscaping
8358+
};
8359+
static_assert(2 == SILNode::NumMarkDependenceKindBits, "Size mismatch");
8360+
83568361
/// Indicates that the validity of the first operand ("the value") depends on
83578362
/// the value of the second operand ("the base"). Operations that would destroy
83588363
/// the base must not be moved before any instructions which depend on the
@@ -8397,12 +8402,10 @@ class MarkDependenceInst
83978402

83988403
MarkDependenceInst(SILDebugLocation DebugLoc, SILValue value, SILValue base,
83998404
ValueOwnershipKind forwardingOwnershipKind,
8400-
bool isNonEscaping)
8405+
MarkDependenceKind dependenceKind)
84018406
: InstructionBase(DebugLoc, value->getType(), forwardingOwnershipKind),
84028407
Operands{this, value, base} {
8403-
if (isNonEscaping) {
8404-
sharedUInt8().MarkDependenceInst.nonEscaping = true;
8405-
}
8408+
sharedUInt8().MarkDependenceInst.dependenceKind = uint8_t(dependenceKind);
84068409
}
84078410

84088411
public:
@@ -8422,8 +8425,19 @@ class MarkDependenceInst
84228425
ArrayRef<Operand> getAllOperands() const { return Operands.asArray(); }
84238426
MutableArrayRef<Operand> getAllOperands() { return Operands.asArray(); }
84248427

8428+
MarkDependenceKind dependenceKind() const {
8429+
return MarkDependenceKind(sharedUInt8().MarkDependenceInst.dependenceKind);
8430+
}
8431+
84258432
bool isNonEscaping() const {
8426-
return sharedUInt8().MarkDependenceInst.nonEscaping;
8433+
return dependenceKind() == MarkDependenceKind::NonEscaping;
8434+
}
8435+
8436+
/// An unresolved escape is semantically an escaping dependence, but this
8437+
/// form is only valid prior to lifetime dependence diagnostics which will
8438+
/// convert it to NonEscaping if the program is valid.
8439+
bool hasUnresolvedEscape() const {
8440+
return dependenceKind() == MarkDependenceKind::Unresolved;
84278441
}
84288442

84298443
/// Visit the instructions that end the lifetime of an OSSA on-stack closure.

include/swift/SIL/SILNode.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ class alignas(8) SILNode :
124124
enum { NumSILAccessKindBits = 2 };
125125
enum { NumSILAccessEnforcementBits = 3 };
126126
enum { NumAllocRefTailTypesBits = 4 };
127+
enum { NumMarkDependenceKindBits = 2 };
127128

128129
protected:
129130
friend class SILInstruction;
@@ -277,7 +278,7 @@ class alignas(8) SILNode :
277278
fromVarDecl : 1);
278279

279280
SHARED_FIELD(MarkDependenceInst, uint8_t
280-
nonEscaping : 1);
281+
dependenceKind : NumMarkDependenceKindBits);
281282

282283
// Do not use `_sharedUInt8_private` outside of SILNode.
283284
} _sharedUInt8_private;

lib/IRGen/LoadableByAddress.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2854,7 +2854,7 @@ bool LoadableByAddress::recreateConvInstr(SILInstruction &I,
28542854
auto instr = cast<MarkDependenceInst>(convInstr);
28552855
newInstr = convBuilder.createMarkDependence(
28562856
instr->getLoc(), instr->getValue(), instr->getBase(),
2857-
instr->isNonEscaping());
2857+
instr->dependenceKind());
28582858
break;
28592859
}
28602860
case SILInstructionKind::DifferentiableFunctionInst: {
@@ -3885,7 +3885,7 @@ class RewriteUser : SILInstructionVisitor<RewriteUser> {
38853885
auto builder = assignment.getBuilder(m->getIterator());
38863886
auto opdAddr = assignment.getAddressForValue(m->getBase());
38873887
auto newValue = builder.createMarkDependence(m->getLoc(), m->getValue(),
3888-
opdAddr, m->isNonEscaping());
3888+
opdAddr, m->dependenceKind());
38893889
m->replaceAllUsesWith(newValue);
38903890
assignment.markForDeletion(m);
38913891
}

lib/SIL/IR/SILPrinter.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2530,7 +2530,12 @@ class SILPrinter : public SILInstructionVisitor<SILPrinter> {
25302530
*this << getIDAndType(CBOI->getOperand());
25312531
}
25322532
void visitMarkDependenceInst(MarkDependenceInst *MDI) {
2533-
if (MDI->isNonEscaping()) {
2533+
switch (MDI->dependenceKind()) {
2534+
case MarkDependenceKind::Unresolved:
2535+
*this << "[unresolved] ";
2536+
case MarkDependenceKind::Escaping:
2537+
break;
2538+
case MarkDependenceKind::NonEscaping:
25342539
*this << "[nonescaping] ";
25352540
}
25362541
*this << getIDAndType(MDI->getValue()) << " on "

0 commit comments

Comments
 (0)