Skip to content

Commit d68eabe

Browse files
Merge pull request #62082 from nate-chandler/opaque-values/3/20221112
[AddressLowering] Handle guaranteed destructures.
2 parents 574edff + 7938a1f commit d68eabe

File tree

2 files changed

+44
-3
lines changed

2 files changed

+44
-3
lines changed

lib/SILOptimizer/Mandatory/AddressLowering.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3004,10 +3004,21 @@ void UseRewriter::rewriteDestructure(SILInstruction *destructure) {
30043004
markRewritten(result, extractAddr);
30053005
} else {
30063006
assert(!pass.valueStorageMap.contains(result));
3007-
SILValue loadElement = builder.createTrivialLoadOr(
3008-
destructure->getLoc(), extractAddr, LoadOwnershipQualifier::Take);
3009-
3007+
auto guaranteed = !result->getType().isTrivial(*pass.function) &&
3008+
destructure->getOperand(0)->getOwnershipKind() ==
3009+
OwnershipKind::Guaranteed;
3010+
SILValue loadElement;
3011+
if (guaranteed) {
3012+
loadElement =
3013+
builder.emitLoadBorrowOperation(destructure->getLoc(), extractAddr);
3014+
} else {
3015+
loadElement = builder.createTrivialLoadOr(
3016+
destructure->getLoc(), extractAddr, LoadOwnershipQualifier::Take);
3017+
}
30103018
result->replaceAllUsesWith(loadElement);
3019+
if (guaranteed) {
3020+
emitEndBorrows(loadElement, pass);
3021+
}
30113022
}
30123023
}
30133024
}

test/SILOptimizer/address_lowering.sil

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1901,6 +1901,36 @@ exit:
19011901
return %retval : $()
19021902
}
19031903

1904+
// CHECK-LABEL: sil [ossa] @test_destructure_tuple_1_guaranteed : {{.*}} {
1905+
// CHECK: [[INSTANCE:%[^,]+]] = unchecked_take_enum_data_addr
1906+
// CHECK: [[KLASS_ADDR:%[^,]+]] = tuple_element_addr [[INSTANCE]] {{.*}}, 0
1907+
// CHECK: [[KLASS:%[^,]+]] = load_borrow [[KLASS_ADDR]]
1908+
// CHECK: end_borrow [[KLASS]]
1909+
// CHECK: [[ANY_ADDR:%[^,]+]] = tuple_element_addr [[INSTANCE]] {{.*}}, 1
1910+
// CHECK: apply undef<Any>([[ANY_ADDR]])
1911+
// CHECK: destroy_addr [[INSTANCE]]
1912+
// CHECK-LABEL: } // end sil function 'test_destructure_tuple_1_guaranteed'
1913+
sil [ossa] @test_destructure_tuple_1_guaranteed : $@convention(thin) () -> () {
1914+
bb0:
1915+
%maybe = apply undef<(Klass?, Any)>() : $@convention(method) <τ_0_0> () -> @out Optional<τ_0_0>
1916+
switch_enum %maybe : $Optional<(Optional<Klass>, Any)>, case #Optional.some!enumelt: success, case #Optional.none!enumelt: failure
1917+
success(%instance : @owned $(Optional<Klass>, Any)):
1918+
%borrow = begin_borrow [lexical] %instance : $(Optional<Klass>, Any)
1919+
(%klass, %any) = destructure_tuple %borrow : $(Optional<Klass>, Any)
1920+
apply undef<Any>(%any) : $@convention(thin) <τ_0_0> (@in_guaranteed τ_0_0) -> ()
1921+
end_borrow %borrow : $(Optional<Klass>, Any)
1922+
destroy_value %instance : $(Optional<Klass>, Any)
1923+
br exit
1924+
1925+
failure:
1926+
br exit
1927+
1928+
exit:
1929+
%505 = tuple ()
1930+
return %505 : $()
1931+
}
1932+
1933+
19041934
// CHECK-LABEL: sil hidden [ossa] @test_store_1 : {{.*}} {
19051935
// CHECK: [[MAYBE_ADDR:%[^,]+]] = alloc_stack $Optional<Self>
19061936
// CHECK: [[LOAD_ADDR:%[^,]+]] = alloc_stack $Self

0 commit comments

Comments
 (0)