Skip to content

Commit 21fd18f

Browse files
authored
Merge pull request #71502 from atrick/add-unresolved-deps
Add mark_dependence [unresolved]
2 parents c25f4ee + da3f583 commit 21fd18f

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)