Skip to content

Commit e7000e4

Browse files
committed
SIL: Add mark_dependence_addr
1 parent edf02f9 commit e7000e4

32 files changed

+379
-100
lines changed

SwiftCompilerSources/Sources/Optimizer/TestPasses/MemBehaviorDumper.swift

+1
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ private extension Instruction {
7575
is BuiltinInst,
7676
is StoreBorrowInst,
7777
is MarkDependenceInst,
78+
is MarkDependenceAddrInst,
7879
is DebugValueInst:
7980
return true
8081
default:

SwiftCompilerSources/Sources/SIL/Builder.swift

+7-1
Original file line numberDiff line numberDiff line change
@@ -568,11 +568,17 @@ public struct Builder {
568568
return notifyNew(endMutation.getAs(EndCOWMutationInst.self))
569569
}
570570

571-
public func createMarkDependence(value: Value, base: Value, kind: MarkDependenceInst.DependenceKind) -> MarkDependenceInst {
571+
public func createMarkDependence(value: Value, base: Value, kind: MarkDependenceKind) -> MarkDependenceInst {
572572
let markDependence = bridged.createMarkDependence(value.bridged, base.bridged,
573573
BridgedInstruction.MarkDependenceKind(rawValue: kind.rawValue)!)
574574
return notifyNew(markDependence.getAs(MarkDependenceInst.self))
575575
}
576+
577+
public func createMarkDependenceAddr(value: Value, base: Value, kind: MarkDependenceKind) -> MarkDependenceAddrInst {
578+
let markDependence = bridged.createMarkDependenceAddr(
579+
value.bridged, base.bridged, BridgedInstruction.MarkDependenceKind(rawValue: kind.rawValue)!)
580+
return notifyNew(markDependence.getAs(MarkDependenceAddrInst.self))
581+
}
576582

577583
@discardableResult
578584
public func createEndAccess(beginAccess: BeginAccessInst) -> EndAccessInst {

SwiftCompilerSources/Sources/SIL/Instruction.swift

+42-11
Original file line numberDiff line numberDiff line change
@@ -1082,22 +1082,34 @@ class GetAsyncContinuationAddrInst : SingleValueInstruction, UnaryInstruction {}
10821082

10831083
final public class ExtractExecutorInst : SingleValueInstruction {}
10841084

1085-
final public
1086-
class MarkDependenceInst : SingleValueInstruction {
1087-
public enum DependenceKind: Int32 {
1088-
case Unresolved = 0
1089-
case Escaping = 1
1090-
case NonEscaping = 2
1091-
}
1085+
public enum MarkDependenceKind: Int32 {
1086+
case Unresolved = 0
1087+
case Escaping = 1
1088+
case NonEscaping = 2
1089+
}
1090+
1091+
public protocol MarkDependenceInstruction: Instruction {
1092+
var baseOperand: Operand { get }
1093+
var base: Value { get }
1094+
var dependenceKind: MarkDependenceKind { get }
1095+
func resolveToNonEscaping()
1096+
func settleToEscaping()
1097+
}
1098+
1099+
extension MarkDependenceInstruction {
1100+
public var isNonEscaping: Bool { dependenceKind == .NonEscaping }
1101+
public var isUnresolved: Bool { dependenceKind == .Unresolved }
1102+
}
1103+
1104+
final public class MarkDependenceInst : SingleValueInstruction, MarkDependenceInstruction {
10921105
public var valueOperand: Operand { operands[0] }
10931106
public var baseOperand: Operand { operands[1] }
10941107
public var value: Value { return valueOperand.value }
10951108
public var base: Value { return baseOperand.value }
1096-
public var dependenceKind: DependenceKind {
1097-
DependenceKind(rawValue: bridged.MarkDependenceInst_dependenceKind().rawValue)!
1109+
1110+
public var dependenceKind: MarkDependenceKind {
1111+
MarkDependenceKind(rawValue: bridged.MarkDependenceInst_dependenceKind().rawValue)!
10981112
}
1099-
public var isNonEscaping: Bool { dependenceKind == .NonEscaping }
1100-
public var isUnresolved: Bool { dependenceKind == .Unresolved }
11011113

11021114
public func resolveToNonEscaping() {
11031115
bridged.MarkDependenceInst_resolveToNonEscaping()
@@ -1112,6 +1124,25 @@ class MarkDependenceInst : SingleValueInstruction {
11121124
}
11131125
}
11141126

1127+
final public class MarkDependenceAddrInst : Instruction, MarkDependenceInstruction {
1128+
public var addressOperand: Operand { operands[0] }
1129+
public var baseOperand: Operand { operands[1] }
1130+
public var address: Value { return addressOperand.value }
1131+
public var base: Value { return baseOperand.value }
1132+
1133+
public var dependenceKind: MarkDependenceKind {
1134+
MarkDependenceKind(rawValue: bridged.MarkDependenceAddrInst_dependenceKind().rawValue)!
1135+
}
1136+
1137+
public func resolveToNonEscaping() {
1138+
bridged.MarkDependenceAddrInst_resolveToNonEscaping()
1139+
}
1140+
1141+
public func settleToEscaping() {
1142+
bridged.MarkDependenceAddrInst_settleToEscaping()
1143+
}
1144+
}
1145+
11151146
final public class RefToBridgeObjectInst : SingleValueInstruction {
11161147
public var convertedOperand: Operand { operands[0] }
11171148
public var maskOperand: Operand { operands[1] }

SwiftCompilerSources/Sources/SIL/Registration.swift

+1
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ public func registerSILClasses() {
195195
register(ObjCMetatypeToObjectInst.self)
196196
register(ValueToBridgeObjectInst.self)
197197
register(MarkDependenceInst.self)
198+
register(MarkDependenceAddrInst.self)
198199
register(RefToBridgeObjectInst.self)
199200
register(BridgeObjectToRefInst.self)
200201
register(BridgeObjectToWordInst.self)

include/swift/SIL/AddressWalker.h

+12-6
Original file line numberDiff line numberDiff line change
@@ -305,19 +305,25 @@ TransitiveAddressWalker<Impl>::walk(SILValue projectedAddress) {
305305
continue;
306306
}
307307

308-
if (auto *mdi = dyn_cast<MarkDependenceInst>(user)) {
308+
if (auto mdi = MarkDependenceInstruction(user)) {
309309
// TODO: continue walking the dependent value, which may not be an
310310
// address. See AddressUtils.swift. Until that is implemented, this must
311311
// be considered a pointer escape.
312-
if (op->get() == mdi->getBase()) {
312+
if (op->get() == mdi.getBase()) {
313313
recordEscape(op, AddressUseKind::Dependent);
314314
callVisitUse(op);
315315
continue;
316316
}
317-
318-
// If we are the value use, look through it.
319-
transitiveResultUses(op);
320-
continue;
317+
if (auto *mdi = dyn_cast<MarkDependenceInst>(user)) {
318+
// If we are the value use of a forwarding markdep, look through it.
319+
transitiveResultUses(op);
320+
continue;
321+
}
322+
if (auto *mdi = dyn_cast<MarkDependenceAddrInst>(user)) {
323+
// The address operand is simply a leaf use.
324+
callVisitUse(op);
325+
continue;
326+
}
321327
}
322328

323329
// We were unable to recognize this user, so set AddressUseKind to unknown

include/swift/SIL/InstWrappers.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ class ForwardingOperation {
293293
case SILInstructionKind::DifferentiableFunctionInst:
294294
return nullptr;
295295
case SILInstructionKind::MarkDependenceInst:
296-
return &forwardingInst->getOperandRef(MarkDependenceInst::Value);
296+
return &forwardingInst->getOperandRef(MarkDependenceInst::Dependent);
297297
case SILInstructionKind::RefToBridgeObjectInst:
298298
return
299299
&forwardingInst->getOperandRef(RefToBridgeObjectInst::ConvertedOperand);

include/swift/SIL/SILBridging.h

+6
Original file line numberDiff line numberDiff line change
@@ -777,6 +777,9 @@ struct BridgedInstruction {
777777
BRIDGED_INLINE MarkDependenceKind MarkDependenceInst_dependenceKind() const;
778778
BRIDGED_INLINE void MarkDependenceInst_resolveToNonEscaping() const;
779779
BRIDGED_INLINE void MarkDependenceInst_settleToEscaping() const;
780+
BRIDGED_INLINE MarkDependenceKind MarkDependenceAddrInst_dependenceKind() const;
781+
BRIDGED_INLINE void MarkDependenceAddrInst_resolveToNonEscaping() const;
782+
BRIDGED_INLINE void MarkDependenceAddrInst_settleToEscaping() const;
780783
BRIDGED_INLINE SwiftInt BeginAccessInst_getAccessKind() const;
781784
BRIDGED_INLINE bool BeginAccessInst_isStatic() const;
782785
BRIDGED_INLINE bool BeginAccessInst_isUnsafe() const;
@@ -1222,6 +1225,9 @@ struct BridgedBuilder{
12221225
bool keepUnique) const;
12231226
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedInstruction createMarkDependence(
12241227
BridgedValue value, BridgedValue base, BridgedInstruction::MarkDependenceKind dependenceKind) const;
1228+
1229+
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedInstruction createMarkDependenceAddr(
1230+
BridgedValue value, BridgedValue base, BridgedInstruction::MarkDependenceKind dependenceKind) const;
12251231

12261232
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedInstruction createEndAccess(BridgedValue value) const;
12271233

include/swift/SIL/SILBridgingImpl.h

+18
Original file line numberDiff line numberDiff line change
@@ -1356,6 +1356,18 @@ void BridgedInstruction::MarkDependenceInst_settleToEscaping() const {
13561356
getAs<swift::MarkDependenceInst>()->settleToEscaping();
13571357
}
13581358

1359+
BridgedInstruction::MarkDependenceKind BridgedInstruction::MarkDependenceAddrInst_dependenceKind() const {
1360+
return (MarkDependenceKind)getAs<swift::MarkDependenceAddrInst>()->dependenceKind();
1361+
}
1362+
1363+
void BridgedInstruction::MarkDependenceAddrInst_resolveToNonEscaping() const {
1364+
getAs<swift::MarkDependenceAddrInst>()->resolveToNonEscaping();
1365+
}
1366+
1367+
void BridgedInstruction::MarkDependenceAddrInst_settleToEscaping() const {
1368+
getAs<swift::MarkDependenceAddrInst>()->settleToEscaping();
1369+
}
1370+
13591371
SwiftInt BridgedInstruction::BeginAccessInst_getAccessKind() const {
13601372
return (SwiftInt)getAs<swift::BeginAccessInst>()->getAccessKind();
13611373
}
@@ -2378,6 +2390,12 @@ BridgedInstruction BridgedBuilder::createMarkDependence(BridgedValue value, Brid
23782390
return {unbridged().createMarkDependence(regularLoc(), value.getSILValue(), base.getSILValue(), swift::MarkDependenceKind(kind))};
23792391
}
23802392

2393+
BridgedInstruction BridgedBuilder::createMarkDependenceAddr(BridgedValue value, BridgedValue base, BridgedInstruction::MarkDependenceKind kind) const {
2394+
return {unbridged().createMarkDependenceAddr(
2395+
regularLoc(), value.getSILValue(), base.getSILValue(),
2396+
swift::MarkDependenceKind(kind))};
2397+
}
2398+
23812399
BridgedInstruction BridgedBuilder::createEndAccess(BridgedValue value) const {
23822400
return {unbridged().createEndAccess(regularLoc(), value.getSILValue(), false)};
23832401
}

include/swift/SIL/SILBuilder.h

+8
Original file line numberDiff line numberDiff line change
@@ -2338,6 +2338,14 @@ class SILBuilder {
23382338
forwardingOwnershipKind, dependenceKind));
23392339
}
23402340

2341+
MarkDependenceAddrInst *
2342+
createMarkDependenceAddr(SILLocation Loc, SILValue address, SILValue base,
2343+
MarkDependenceKind dependenceKind) {
2344+
return insert(new (getModule()) MarkDependenceAddrInst(
2345+
getSILDebugLocation(Loc), address, base,
2346+
dependenceKind));
2347+
}
2348+
23412349
IsUniqueInst *createIsUnique(SILLocation Loc, SILValue operand) {
23422350
auto Int1Ty = SILType::getBuiltinIntegerType(1, getASTContext());
23432351
return insert(new (getModule()) IsUniqueInst(getSILDebugLocation(Loc),

include/swift/SIL/SILCloner.h

+11
Original file line numberDiff line numberDiff line change
@@ -3142,6 +3142,17 @@ void SILCloner<ImplClass>::visitMarkDependenceInst(MarkDependenceInst *Inst) {
31423142
Inst->dependenceKind()));
31433143
}
31443144

3145+
template <typename ImplClass>
3146+
void SILCloner<ImplClass>::
3147+
visitMarkDependenceAddrInst(MarkDependenceAddrInst *Inst) {
3148+
getBuilder().setCurrentDebugScope(getOpScope(Inst->getDebugScope()));
3149+
recordClonedInstruction(
3150+
Inst, getBuilder().createMarkDependenceAddr(
3151+
getOpLocation(Inst->getLoc()), getOpValue(Inst->getAddress()),
3152+
getOpValue(Inst->getBase()),
3153+
Inst->dependenceKind()));
3154+
}
3155+
31453156
template<typename ImplClass>
31463157
void
31473158
SILCloner<ImplClass>::visitStrongReleaseInst(StrongReleaseInst *Inst) {

0 commit comments

Comments
 (0)