Skip to content

Commit f387076

Browse files
authored
Fixes in SILGen for opaque value support in coroutines (#58696)
1 parent 7c9a626 commit f387076

File tree

3 files changed

+37
-5
lines changed

3 files changed

+37
-5
lines changed

lib/SILGen/SILGenApply.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3119,7 +3119,7 @@ class ArgEmitter {
31193119
auto emissionKind = SGFAccessKind::BorrowedObjectRead;
31203120
for (auto param : claimedParams) {
31213121
assert(!param.isConsumed());
3122-
if (param.isIndirectInGuaranteed()) {
3122+
if (param.isIndirectInGuaranteed() && SGF.silConv.useLoweredAddresses()) {
31233123
emissionKind = SGFAccessKind::BorrowedAddressRead;
31243124
break;
31253125
}
@@ -3497,8 +3497,10 @@ static void emitBorrowedLValueRecursive(SILGenFunction &SGF,
34973497

34983498
// Load if necessary.
34993499
assert(!param.isConsumed() && "emitting borrow into consumed parameter?");
3500-
if (!param.isIndirectInGuaranteed() && value.getType().isAddress()) {
3501-
value = SGF.B.createFormalAccessLoadBorrow(loc, value);
3500+
if (value.getType().isAddress()) {
3501+
if (!param.isIndirectInGuaranteed() || !SGF.silConv.useLoweredAddresses()) {
3502+
value = SGF.B.createFormalAccessLoadBorrow(loc, value);
3503+
}
35023504
}
35033505

35043506
assert(param.getInterfaceType() == value.getType().getASTType());

lib/SILGen/SILGenPoly.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1746,8 +1746,12 @@ static ManagedValue manageYield(SILGenFunction &SGF, SILValue value,
17461746
if (value.getOwnershipKind() == OwnershipKind::None)
17471747
return ManagedValue::forUnmanaged(value);
17481748
return ManagedValue::forBorrowedObjectRValue(value);
1749-
case ParameterConvention::Indirect_In_Guaranteed:
1750-
return ManagedValue::forBorrowedAddressRValue(value);
1749+
case ParameterConvention::Indirect_In_Guaranteed: {
1750+
bool isOpaque = SGF.getTypeLowering(value->getType()).isAddressOnly() &&
1751+
!SGF.silConv.useLoweredAddresses();
1752+
return isOpaque ? ManagedValue::forBorrowedObjectRValue(value)
1753+
: ManagedValue::forBorrowedAddressRValue(value);
1754+
}
17511755
}
17521756
llvm_unreachable("bad kind");
17531757
}

test/SILGen/opaque_values_silgen.swift

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,3 +435,29 @@ func testCastClassArchetypeToClass<T : AnyObject>(_ o: T) -> C {
435435
break
436436
}
437437
}
438+
439+
class TestGeneric<T> {
440+
init() {}
441+
442+
var generic: T
443+
@_borrowed
444+
var borrowedGeneric: T
445+
}
446+
447+
// CHECK-LABEL: sil hidden [transparent] [ossa] @$s20opaque_values_silgen11TestGenericC08borrowedE0xvr :
448+
// CHECK: bb0(%0 : @guaranteed $TestGeneric<T>):
449+
// CHECK: [[REF:%.*]] = ref_element_addr %0 : $TestGeneric<T>, #TestGeneric.borrowedGeneric
450+
// CHECK: [[ACCESS:%.*]] = begin_access [read] [dynamic] [[REF]] : $*T
451+
// CHECK: [[LD:%.*]] = load_borrow [[ACCESS]] : $*T
452+
// CHECK: yield [[LD]] : $T, resume bb1, unwind bb2
453+
// CHECK: bb1:
454+
// CHECK: end_borrow [[LD]] : $T
455+
// CHECK: end_access [[ACCESS]] : $*T
456+
// CHECK: [[RES:%.*]] = tuple ()
457+
// CHECK: return [[RES]] : $()
458+
// CHECK: bb2:
459+
// CHECK: end_borrow [[LD]] : $T
460+
// CHECK: end_access [[ACCESS]] : $*T
461+
// CHECK: unwind
462+
// CHECK-LABEL: } // end sil function '$s20opaque_values_silgen11TestGenericC08borrowedE0xvr'
463+

0 commit comments

Comments
 (0)