Skip to content

Commit 0bd6825

Browse files
committed
Update SIL utilities for borrow and mutate accessors under opaque values mode
1 parent 69ef88b commit 0bd6825

File tree

15 files changed

+128
-80
lines changed

15 files changed

+128
-80
lines changed

SwiftCompilerSources/Sources/Optimizer/FunctionPasses/ComputeSideEffects.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ private struct CollectedEffects {
255255
addEffects(.destroy, to: inst.operands[0].value, fromInitialPath: SmallProjectionPath(.anyValueFields))
256256

257257
case is ReturnInst:
258-
if inst.parentFunction.convention.hasGuaranteedAddressResult {
258+
if inst.parentFunction.convention.hasAddressResult {
259259
addEffects(.read, to: inst.operands[0].value)
260260
}
261261

SwiftCompilerSources/Sources/SIL/ApplySite.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -303,10 +303,6 @@ extension ApplySite {
303303
public var hasGuaranteedResult: Bool {
304304
functionConvention.hasGuaranteedResult
305305
}
306-
307-
public var hasGuaranteedAddressResult: Bool {
308-
functionConvention.hasGuaranteedAddressResult
309-
}
310306
}
311307

312308
extension ApplySite {

SwiftCompilerSources/Sources/SIL/FunctionConvention.swift

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -102,27 +102,22 @@ public struct FunctionConvention : CustomStringConvertible {
102102
if results.count != 1 {
103103
return false
104104
}
105-
return results[0].convention == .guaranteed
106-
}
107-
108-
public var hasGuaranteedAddressResult: Bool {
109-
if results.count != 1 {
110-
return false
105+
if hasLoweredAddresses {
106+
return results[0].convention == .guaranteed
111107
}
112-
return results[0].convention == .guaranteedAddress
108+
return results[0].convention == .guaranteed || results[0].convention == .guaranteedAddress
113109
}
114110

115-
public var hasInoutResult: Bool {
111+
public var hasAddressResult: Bool {
116112
if results.count != 1 {
117113
return false
118114
}
115+
if hasLoweredAddresses {
116+
return results[0].convention == .guaranteedAddress || results[0].convention == .inout
117+
}
119118
return results[0].convention == .inout
120119
}
121120

122-
public var hasAddressResult: Bool {
123-
return hasGuaranteedAddressResult || hasInoutResult
124-
}
125-
126121
public var description: String {
127122
var str = functionType.description
128123
for paramIdx in 0..<parameters.count {

include/swift/AST/Types.h

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4980,20 +4980,20 @@ class SILResultInfo {
49804980
return getConvention() == ResultConvention::Pack;
49814981
}
49824982

4983-
bool isGuaranteedAddressResult() const {
4984-
return getConvention() == ResultConvention::GuaranteedAddress;
4985-
}
4986-
4987-
bool isInoutResult() const {
4983+
bool isAddressResult(bool loweredAddresses) const {
4984+
if (loweredAddresses) {
4985+
return getConvention() == ResultConvention::GuaranteedAddress ||
4986+
getConvention() == ResultConvention::Inout;
4987+
}
49884988
return getConvention() == ResultConvention::Inout;
49894989
}
49904990

4991-
bool isAddressResult() const {
4992-
return isGuaranteedAddressResult() || isInoutResult();
4993-
}
4994-
4995-
bool isGuaranteedResult() const {
4996-
return getConvention() == ResultConvention::Guaranteed;
4991+
bool isGuaranteedResult(bool loweredAddresses) const {
4992+
if (loweredAddresses) {
4993+
return getConvention() == ResultConvention::Guaranteed;
4994+
}
4995+
return getConvention() == ResultConvention::Guaranteed ||
4996+
getConvention() == ResultConvention::GuaranteedAddress;
49974997
}
49984998

49994999
/// Transform this SILResultInfo by applying the user-provided
@@ -5436,29 +5436,18 @@ class SILFunctionType final
54365436
return hasErrorResult() && getErrorResult().isFormalIndirect();
54375437
}
54385438

5439-
bool hasGuaranteedResult() const {
5439+
bool hasGuaranteedResult(bool loweredAddresses) const {
54405440
if (getNumResults() != 1) {
54415441
return false;
54425442
}
5443-
return getResults()[0].isGuaranteedResult();
5443+
return getResults()[0].isGuaranteedResult(loweredAddresses);
54445444
}
54455445

5446-
bool hasGuaranteedAddressResult() const {
5446+
bool hasAddressResult(bool loweredAddresses) const {
54475447
if (getNumResults() != 1) {
54485448
return false;
54495449
}
5450-
return getResults()[0].isGuaranteedAddressResult();
5451-
}
5452-
5453-
bool hasInoutResult() const {
5454-
if (getNumResults() != 1) {
5455-
return false;
5456-
}
5457-
return getResults()[0].isInoutResult();
5458-
}
5459-
5460-
bool hasAddressResult() const {
5461-
return hasGuaranteedAddressResult() || hasInoutResult();
5450+
return getResults()[0].isAddressResult(loweredAddresses);
54625451
}
54635452

54645453
struct IndirectFormalResultFilter {

include/swift/SIL/MemAccessUtils.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ inline bool isGuaranteedAddressReturn(SILValue value) {
169169
if (!defInst) {
170170
return false;
171171
}
172-
return defInst->hasGuaranteedAddressResult();
172+
return defInst->hasAddressResult();
173173
}
174174

175175
/// Return the source address after stripping as many access projections as

include/swift/SIL/SILFunctionConventions.h

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,13 @@ class SILFunctionConventions {
212212
if (silConv.loweredAddresses)
213213
return funcTy->getDirectFormalResultsType(silConv.getModule(), context);
214214

215+
if (funcTy->hasAddressResult(silConv.loweredAddresses)) {
216+
assert(funcTy->getNumDirectFormalResults() == 1);
217+
return SILType::getPrimitiveAddressType(
218+
funcTy->getSingleDirectFormalResult().getReturnValueType(
219+
silConv.getModule(), funcTy, context));
220+
}
221+
215222
return funcTy->getAllResultsSubstType(silConv.getModule(), context);
216223
}
217224

@@ -322,27 +329,24 @@ class SILFunctionConventions {
322329
if (funcTy->getNumResults() != 1) {
323330
return false;
324331
}
325-
return funcTy->getResults()[0].getConvention() ==
326-
ResultConvention::Guaranteed;
327-
}
328-
329-
bool hasGuaranteedAddressResult() const {
330-
if (funcTy->getNumResults() != 1) {
331-
return false;
332+
auto resultConvention = funcTy->getResults()[0].getConvention();
333+
if (silConv.loweredAddresses) {
334+
return resultConvention == ResultConvention::Guaranteed;
332335
}
333-
return funcTy->getResults()[0].getConvention() ==
334-
ResultConvention::GuaranteedAddress;
336+
return resultConvention == ResultConvention::Guaranteed ||
337+
resultConvention == ResultConvention::GuaranteedAddress;
335338
}
336339

337-
bool hasInoutResult() const {
340+
bool hasAddressResult() const {
338341
if (funcTy->getNumResults() != 1) {
339342
return false;
340343
}
341-
return funcTy->getResults()[0].getConvention() == ResultConvention::Inout;
342-
}
343-
344-
bool hasAddressResult() const {
345-
return hasGuaranteedAddressResult() || hasInoutResult();
344+
auto resultConvention = funcTy->getResults()[0].getConvention();
345+
if (silConv.loweredAddresses) {
346+
return resultConvention == ResultConvention::GuaranteedAddress ||
347+
resultConvention == ResultConvention::Inout;
348+
}
349+
return resultConvention == ResultConvention::Inout;
346350
}
347351

348352
struct SILResultTypeFunc;
@@ -711,7 +715,7 @@ inline SILType
711715
SILModuleConventions::getSILResultInterfaceType(SILResultInfo result,
712716
bool loweredAddresses) {
713717
return SILModuleConventions::isIndirectSILResult(result, loweredAddresses) ||
714-
result.isAddressResult()
718+
result.isAddressResult(loweredAddresses)
715719
? SILType::getPrimitiveAddressType(result.getInterfaceType())
716720
: SILType::getPrimitiveObjectType(result.getInterfaceType());
717721
}

include/swift/SIL/SILInstruction.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3154,10 +3154,7 @@ class ApplyInst final
31543154
bool hasGuaranteedResult() const {
31553155
return getSubstCalleeConv().hasGuaranteedResult();
31563156
}
3157-
bool hasGuaranteedAddressResult() const {
3158-
return getSubstCalleeConv().hasGuaranteedAddressResult();
3159-
}
3160-
bool hasInoutResult() const { return getSubstCalleeConv().hasInoutResult(); }
3157+
31613158
bool hasAddressResult() const {
31623159
return getSubstCalleeConv().hasAddressResult();
31633160
}

lib/SIL/IR/SILFunctionType.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -182,11 +182,12 @@ SILFunctionType::getDirectFormalResultsType(SILModule &M,
182182
TypeExpansionContext context) {
183183
CanType type;
184184

185-
if (hasAddressResult()) {
185+
if (hasAddressResult(SILModuleConventions(M).useLoweredAddresses())) {
186186
assert(getNumDirectFormalResults() == 1);
187-
return SILType::getPrimitiveAddressType(
188-
getSingleDirectFormalResult().getReturnValueType(M, this, context));
187+
return SILType::getPrimitiveAddressType(
188+
getSingleDirectFormalResult().getReturnValueType(M, this, context));
189189
}
190+
190191
if (getNumDirectFormalResults() == 0) {
191192
type = getASTContext().TheEmptyTupleType;
192193
} else if (getNumDirectFormalResults() == 1) {

lib/SIL/IR/SILType.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,9 @@ SILResultInfo::getOwnershipKind(SILFunction &F,
689689
return OwnershipKind::None;
690690
return OwnershipKind::Unowned;
691691
case ResultConvention::GuaranteedAddress:
692+
return isAddressResult(SILModuleConventions(M).loweredAddresses)
693+
? OwnershipKind::None
694+
: OwnershipKind::Guaranteed;
692695
case ResultConvention::Inout:
693696
return OwnershipKind::None;
694697
case ResultConvention::Guaranteed:

lib/SIL/IR/SILValue.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,13 @@ bool ValueBase::isBorrowAccessorResult() const {
210210
auto *apply = dyn_cast_or_null<ApplyInst>(getDefiningInstruction());
211211
if (!apply)
212212
return false;
213-
return apply->hasGuaranteedResult() || apply->hasGuaranteedAddressResult();
213+
if (apply->getSubstCalleeConv().funcTy->getNumResults() != 1) {
214+
return false;
215+
}
216+
auto resultConvention =
217+
apply->getSubstCalleeConv().funcTy->getSingleResult().getConvention();
218+
return resultConvention == ResultConvention::Guaranteed ||
219+
resultConvention == ResultConvention::GuaranteedAddress;
214220
}
215221

216222
bool ValueBase::hasDebugTrace() const {

0 commit comments

Comments
 (0)