Skip to content

Commit 2b785e4

Browse files
committed
[move-only] Teach SILGen how to recognize a borrowed read subscript when the type also has a modify.
The form of the AST changes slightly when a type has a read and a modify. Specifically, we now have a load on the subscript and an inout_expr on the base. I dealt with this by making the inout_expr something that when we look for storage we look through and by tweaking the load lookthrough code.
1 parent 7b66c70 commit 2b785e4

File tree

4 files changed

+31
-118
lines changed

4 files changed

+31
-118
lines changed

lib/SILGen/SILGenApply.cpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3029,7 +3029,8 @@ static StorageRefResult findStorageReferenceExprForBorrow(Expr *e) {
30293029
return result.withTransitiveRoot(te);
30303030

30313031
} else if (auto ioe = dyn_cast<InOutExpr>(e)) {
3032-
return ioe;
3032+
if (auto result = findStorageReferenceExprForBorrow(ioe->getSubExpr()))
3033+
return result.withTransitiveRoot(ioe);
30333034
}
30343035

30353036
return StorageRefResult();
@@ -3042,6 +3043,13 @@ Expr *ArgumentSource::findStorageReferenceExprForMoveOnly(
30423043

30433044
auto argExpr = asKnownExpr();
30443045

3046+
// If there's a load around the outer part of this arg expr, look past it.
3047+
bool sawLoad = false;
3048+
if (auto *li = dyn_cast<LoadExpr>(argExpr)) {
3049+
argExpr = li->getSubExpr();
3050+
sawLoad = true;
3051+
}
3052+
30453053
// If we have a subscript, strip it off and make sure that our base is
30463054
// something that we can process. If we do and we succeed below, we return the
30473055
// subscript instead.
@@ -3053,13 +3061,11 @@ Expr *ArgumentSource::findStorageReferenceExprForMoveOnly(
30533061
} else {
30543062
argExpr = subscriptExpr->getBase();
30553063
}
3056-
}
30573064

3058-
// If there's a load around the outer part of this arg expr, look past it.
3059-
bool sawLoad = false;
3060-
if (auto *li = dyn_cast<LoadExpr>(argExpr)) {
3061-
argExpr = li->getSubExpr();
3062-
sawLoad = true;
3065+
// If there's a load on the base of the subscript expr, look past it.
3066+
if (auto *li = dyn_cast<LoadExpr>(argExpr)) {
3067+
argExpr = li->getSubExpr();
3068+
}
30633069
}
30643070

30653071
// If we're consuming instead, then the load _must_ have been there.

test/SILGen/moveonly.swift

Lines changed: 18 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1799,10 +1799,6 @@ public struct LoadableSubscriptReadSetTester : ~Copyable {
17991799
}
18001800
}
18011801

1802-
// TODO: This case causes us to emit an extra copy. We need to change how SILGen
1803-
// emits through load_expr to fix this. We need the end_apply to be around the
1804-
// entire nonMutatingFunc.
1805-
//
18061802
// CHECK-LABEL: sil [ossa] @$s8moveonly55testSubscriptReadSet_BaseLoadable_ResultAddressOnly_VaryyF : $@convention(thin) () -> () {
18071803
// CHECK: [[BOX:%.*]] = alloc_box $
18081804
// CHECK: [[PROJECT:%.*]] = project_box [[BOX]]
@@ -1811,15 +1807,11 @@ public struct LoadableSubscriptReadSetTester : ~Copyable {
18111807
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[PROJECT]]
18121808
// CHECK: [[MARK:%.*]] = mark_must_check [no_consume_or_assign] [[ACCESS]]
18131809
// CHECK: [[LOAD:%.*]] = load_borrow [[MARK]]
1814-
// Eventually, we need this end_apply to be around the nonMutatingFunc.
18151810
// CHECK: ([[CORO_RESULT:%.*]], [[CORO_TOKEN:%.*]]) = begin_apply {{%.*}}({{%.*}}, [[LOAD]])
1816-
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
1817-
// CHECK: copy_addr [[CORO_RESULT]] to [init] [[TEMP]]
1811+
// CHECK: apply {{%.*}}([[CORO_RESULT]])
18181812
// CHECK: end_apply [[CORO_TOKEN]]
18191813
// CHECK: end_borrow [[LOAD]]
18201814
// CHECK: end_access [[ACCESS]]
1821-
// CHECK: apply {{%.*}}([[TEMP]])
1822-
// CHECK: destroy_addr [[TEMP]]
18231815
//
18241816
// The assignment:
18251817
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
@@ -1881,13 +1873,10 @@ public func testSubscriptReadSet_BaseLoadable_ResultAddressOnly_Let() {
18811873
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[MARK]]
18821874
// CHECK: [[LOAD_BORROW:%.*]] = load_borrow [[ACCESS]]
18831875
// CHECK: ([[CORO_RESULT:%.*]], [[CORO_TOKEN:%.*]]) = begin_apply {{%.*}}({{%.*}}, [[LOAD_BORROW]])
1884-
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
1885-
// CHECK: copy_addr [[CORO_RESULT]] to [init] [[TEMP]]
1876+
// CHECK: apply {{%.*}}([[CORO_RESULT]])
18861877
// CHECK: end_apply [[CORO_TOKEN]]
18871878
// CHECK: end_borrow [[LOAD_BORROW]]
18881879
// CHECK: end_access [[ACCESS]]
1889-
// CHECK: apply {{%.*}}([[TEMP]])
1890-
// CHECK: destroy_addr [[TEMP]]
18911880
//
18921881
// The assignment:
18931882
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
@@ -1926,13 +1915,10 @@ public func testSubscriptReadSet_BaseLoadable_ResultAddressOnly_InOut(m: inout L
19261915
// CHECK: [[MARK:%.*]] = mark_must_check [no_consume_or_assign] [[ACCESS]]
19271916
// CHECK: [[LOAD_BORROW:%.*]] = load_borrow [[MARK]]
19281917
// CHECK: ([[CORO_RESULT:%.*]], [[CORO_TOKEN:%.*]]) = begin_apply {{%.*}}({{%.*}}, [[LOAD_BORROW]])
1929-
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
1930-
// CHECK: copy_addr [[CORO_RESULT]] to [init] [[TEMP]]
1918+
// CHECK: apply {{%.*}}([[CORO_RESULT]])
19311919
// CHECK: end_apply [[CORO_TOKEN]]
19321920
// CHECK: end_borrow [[LOAD_BORROW]]
19331921
// CHECK: end_access [[ACCESS]]
1934-
// CHECK: apply {{%.*}}([[TEMP]])
1935-
// CHECK: destroy_addr [[TEMP]]
19361922
//
19371923
// The assignment:
19381924
// CHECK: [[GLOBAL_ADDR:%.*]] = global_addr @$s8moveonly36globalLoadableSubscriptReadSetTesterAA0cdefG0Vvp
@@ -1983,13 +1969,10 @@ public struct LoadableSubscriptReadSetTesterNonCopyableStructParent : ~Copyable
19831969
// CHECK: [[GEP:%.*]] = struct_element_addr [[MARK]]
19841970
// CHECK: [[LOAD_BORROW:%.*]] = load_borrow [[GEP]]
19851971
// CHECK: ([[CORO_RESULT:%.*]], [[CORO_TOKEN:%.*]]) = begin_apply {{%.*}}({{%.*}}, [[LOAD_BORROW]])
1986-
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
1987-
// CHECK: copy_addr [[CORO_RESULT]] to [init] [[TEMP]]
1972+
// CHECK: apply {{%.*}}([[CORO_RESULT]])
19881973
// CHECK: end_apply [[CORO_TOKEN]]
19891974
// CHECK: end_borrow [[LOAD_BORROW]]
19901975
// CHECK: end_access [[ACCESS]]
1991-
// CHECK: apply {{%.*}}([[TEMP]])
1992-
// CHECK: destroy_addr [[TEMP]]
19931976
//
19941977
// The mutating call.
19951978
// CHECK: [[ACCESS:%.*]] = begin_access [modify] [unknown] [[PROJECT]]
@@ -2055,13 +2038,10 @@ public func testSubscriptReadSetThroughNonCopyableParentStruct_BaseLoadable_Resu
20552038
// CHECK: [[GEP:%.*]] = struct_element_addr [[ACCESS]]
20562039
// CHECK: [[LOAD_BORROW:%.*]] = load_borrow [[GEP]]
20572040
// CHECK: ([[CORO_RESULT:%.*]], [[CORO_TOKEN:%.*]]) = begin_apply {{%.*}}({{%.*}}, [[LOAD_BORROW]])
2058-
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
2059-
// CHECK: copy_addr [[CORO_RESULT]] to [init] [[TEMP]]
2041+
// CHECK: apply {{%.*}}([[CORO_RESULT]])
20602042
// CHECK: end_apply [[CORO_TOKEN]]
20612043
// CHECK: end_borrow [[LOAD_BORROW]]
20622044
// CHECK: end_access [[ACCESS]]
2063-
// CHECK: apply {{%.*}}([[TEMP]])
2064-
// CHECK: destroy_addr [[TEMP]]
20652045
//
20662046
// Modify
20672047
// CHECK: [[ACCESS:%.*]] = begin_access [modify] [unknown] [[MARK]]
@@ -2089,13 +2069,10 @@ public func testSubscriptReadSetThroughNonCopyableParentStruct_BaseLoadable_Resu
20892069
// CHECK: [[GEP:%.*]] = struct_element_addr [[MARK]]
20902070
// CHECK: [[LOAD:%.*]] = load_borrow [[GEP]]
20912071
// CHECK: ([[CORO_RESULT:%.*]], [[CORO_TOKEN:%.*]]) = begin_apply {{%.*}}({{%.*}}, [[LOAD]])
2092-
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
2093-
// CHECK: copy_addr [[CORO_RESULT]] to [init] [[TEMP]]
2072+
// CHECK: apply {{%.*}}([[CORO_RESULT]])
20942073
// CHECK: end_apply [[CORO_TOKEN]]
20952074
// CHECK: end_borrow [[LOAD]]
20962075
// CHECK: end_access [[ACCESS]]
2097-
// CHECK: apply {{%.*}}([[TEMP]])
2098-
// CHECK: destroy_addr [[TEMP]]
20992076
//
21002077
// CHECK: [[GLOBAL:%.*]] = global_addr @$s8moveonly59globalLoadableSubscriptReadSetTesterNonCopyableStructParentAA0cdefghijK0Vvp :
21012078
// CHECK: [[ACCESS:%.*]] = begin_access [modify] [dynamic] [[GLOBAL]]
@@ -2140,14 +2117,11 @@ public class LoadableSubscriptReadSetTesterClassParent {
21402117
// CHECK: [[BORROW_COPYABLE_CLASS:%.*]] = begin_borrow [[COPYABLE_CLASS]]
21412118
// CHECK: ([[CORO_RESULT:%.*]], [[CORO_TOKEN:%.*]]) = begin_apply {{%.*}}([[BORROW_COPYABLE_CLASS]])
21422119
// CHECK: ([[CORO_RESULT_2:%.*]], [[CORO_TOKEN_2:%.*]]) = begin_apply {{%.*}}({{%.*}}, [[CORO_RESULT]])
2143-
// CHECK: [[TEMP:%.*]] = alloc_stack $
2144-
// CHECK: copy_addr [[CORO_RESULT_2]] to [init] [[TEMP]]
2120+
// CHECK: apply {{%.*}}([[CORO_RESULT_2]])
21452121
// CHECK: end_apply [[CORO_TOKEN_2]]
21462122
// CHECK: end_apply [[CORO_TOKEN]]
21472123
// CHECK: end_borrow [[BORROW_COPYABLE_CLASS]]
21482124
// CHECK: destroy_value [[COPYABLE_CLASS]]
2149-
// CHECK: apply {{%.*}}([[TEMP]])
2150-
// CHECK: destroy_addr [[TEMP]]
21512125
//
21522126
// First mutation.
21532127
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[PROJECT]]
@@ -2177,14 +2151,11 @@ public class LoadableSubscriptReadSetTesterClassParent {
21772151
// CHECK: ([[CORO_RESULT:%.*]], [[CORO_TOKEN:%.*]]) = begin_apply {{%.*}}([[BORROW_COPYABLE_CLASS]])
21782152
// CHECK: [[EXT:%.*]] = struct_extract [[CORO_RESULT]]
21792153
// CHECK: ([[CORO_RESULT_2:%.*]], [[CORO_TOKEN_2:%.*]]) = begin_apply {{%.*}}({{%.*}}, [[EXT]])
2180-
// CHECK: [[TEMP:%.*]] = alloc_stack $
2181-
// CHECK: copy_addr [[CORO_RESULT_2]] to [init] [[TEMP]]
2154+
// CHECK: apply {{%.*}}([[CORO_RESULT_2]])
21822155
// CHECK: end_apply [[CORO_TOKEN_2]]
21832156
// CHECK: end_apply [[CORO_TOKEN]]
21842157
// CHECK: end_borrow [[BORROW_COPYABLE_CLASS]]
21852158
// CHECK: destroy_value [[COPYABLE_CLASS]]
2186-
// CHECK: apply {{%.*}}([[TEMP]])
2187-
// CHECK: destroy_addr [[TEMP]]
21882159
//
21892160
// Second mutate
21902161
//
@@ -2244,8 +2215,7 @@ public class LoadableSubscriptReadSetTesterClassParent {
22442215
// CHECK: [[BORROW_COPYABLE_CLASS:%.*]] = begin_borrow [[COPYABLE_CLASS]]
22452216
// CHECK: ([[CORO_RESULT:%.*]], [[CORO_TOKEN:%.*]]) = begin_apply {{%.*}}([[BORROW_COPYABLE_CLASS]])
22462217
// CHECK: ([[CORO_RESULT_2:%.*]], [[CORO_TOKEN_2:%.*]]) = begin_apply {{%.*}}({{%.*}}, [[CORO_RESULT]])
2247-
// CHECK: [[TEMP:%.*]] = alloc_stack $
2248-
// CHECK: copy_addr [[CORO_RESULT_2]] to [init] [[TEMP]]
2218+
// CHECK: apply {{%.*}}([[CORO_RESULT_2]])
22492219
// CHECK: end_apply [[CORO_TOKEN_2]]
22502220
// CHECK: end_apply [[CORO_TOKEN]]
22512221
// CHECK: end_borrow [[BORROW_COPYABLE_CLASS]]
@@ -2305,13 +2275,10 @@ public struct LoadableSubscriptReadModifyTester : ~Copyable {
23052275
// CHECK: [[LOAD:%.*]] = load_borrow [[MARK]]
23062276
// Eventually, we need this end_apply to be around the nonMutatingFunc.
23072277
// CHECK: ([[CORO_RESULT:%.*]], [[CORO_TOKEN:%.*]]) = begin_apply {{%.*}}({{%.*}}, [[LOAD]])
2308-
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
2309-
// CHECK: copy_addr [[CORO_RESULT]] to [init] [[TEMP]]
2278+
// CHECK: apply {{%.*}}([[CORO_RESULT]])
23102279
// CHECK: end_apply [[CORO_TOKEN]]
23112280
// CHECK: end_borrow [[LOAD]]
23122281
// CHECK: end_access [[ACCESS]]
2313-
// CHECK: apply {{%.*}}([[TEMP]])
2314-
// CHECK: destroy_addr [[TEMP]]
23152282
//
23162283
// The assignment:
23172284
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
@@ -2368,13 +2335,10 @@ public func testSubscriptReadModify_BaseLoadable_ResultAddressOnly_Let() {
23682335
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[MARK]]
23692336
// CHECK: [[LOAD_BORROW:%.*]] = load_borrow [[ACCESS]]
23702337
// CHECK: ([[CORO_RESULT:%.*]], [[CORO_TOKEN:%.*]]) = begin_apply {{%.*}}({{%.*}}, [[LOAD_BORROW]])
2371-
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
2372-
// CHECK: copy_addr [[CORO_RESULT]] to [init] [[TEMP]]
2338+
// CHECK: apply {{%.*}}([[CORO_RESULT]])
23732339
// CHECK: end_apply [[CORO_TOKEN]]
23742340
// CHECK: end_borrow [[LOAD_BORROW]]
23752341
// CHECK: end_access [[ACCESS]]
2376-
// CHECK: apply {{%.*}}([[TEMP]])
2377-
// CHECK: destroy_addr [[TEMP]]
23782342
//
23792343
// The assignment:
23802344
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
@@ -2407,13 +2371,10 @@ public func testSubscriptReadModify_BaseLoadable_ResultAddressOnly_InOut(m: inou
24072371
// CHECK: [[MARK:%.*]] = mark_must_check [no_consume_or_assign] [[ACCESS]]
24082372
// CHECK: [[LOAD_BORROW:%.*]] = load_borrow [[MARK]]
24092373
// CHECK: ([[CORO_RESULT:%.*]], [[CORO_TOKEN:%.*]]) = begin_apply {{%.*}}({{%.*}}, [[LOAD_BORROW]])
2410-
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
2411-
// CHECK: copy_addr [[CORO_RESULT]] to [init] [[TEMP]]
2374+
// CHECK: apply {{%.*}}([[CORO_RESULT]])
24122375
// CHECK: end_apply [[CORO_TOKEN]]
24132376
// CHECK: end_borrow [[LOAD_BORROW]]
24142377
// CHECK: end_access [[ACCESS]]
2415-
// CHECK: apply {{%.*}}([[TEMP]])
2416-
// CHECK: destroy_addr [[TEMP]]
24172378
//
24182379
// The assignment:
24192380
// CHECK: [[GLOBAL_ADDR:%.*]] = global_addr @$s8moveonly39globalLoadableSubscriptReadModifyTesterAA0cdefG0Vvp :
@@ -2460,13 +2421,10 @@ public struct LoadableSubscriptReadModifyTesterNonCopyableStructParent : ~Copyab
24602421
// CHECK: [[GEP:%.*]] = struct_element_addr [[MARK]]
24612422
// CHECK: [[LOAD_BORROW:%.*]] = load_borrow [[GEP]]
24622423
// CHECK: ([[CORO_RESULT:%.*]], [[CORO_TOKEN:%.*]]) = begin_apply {{%.*}}({{%.*}}, [[LOAD_BORROW]])
2463-
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
2464-
// CHECK: copy_addr [[CORO_RESULT]] to [init] [[TEMP]]
2424+
// CHECK: apply {{%.*}}([[CORO_RESULT]])
24652425
// CHECK: end_apply [[CORO_TOKEN]]
24662426
// CHECK: end_borrow [[LOAD_BORROW]]
24672427
// CHECK: end_access [[ACCESS]]
2468-
// CHECK: apply {{%.*}}([[TEMP]])
2469-
// CHECK: destroy_addr [[TEMP]]
24702428
//
24712429
// The mutating call.
24722430
// CHECK: [[ACCESS:%.*]] = begin_access [modify] [unknown] [[PROJECT]]
@@ -2528,13 +2486,10 @@ public func testSubscriptReadModifyThroughNonCopyableParentStruct_BaseLoadable_R
25282486
// CHECK: [[GEP:%.*]] = struct_element_addr [[ACCESS]]
25292487
// CHECK: [[LOAD:%.*]] = load_borrow [[GEP]]
25302488
// CHECK: ([[CORO_RESULT:%.*]], [[CORO_TOKEN:%.*]]) = begin_apply {{%.*}}({{%.*}}, [[LOAD]])
2531-
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
2532-
// CHECK: copy_addr [[CORO_RESULT]] to [init] [[TEMP]]
2489+
// CHECK: apply {{%.*}}([[CORO_RESULT]])
25332490
// CHECK: end_apply [[CORO_TOKEN]]
25342491
// CHECK: end_borrow [[LOAD]]
25352492
// CHECK: end_access [[ACCESS]]
2536-
// CHECK: apply {{%.*}}([[TEMP]])
2537-
// CHECK: destroy_addr [[TEMP]]
25382493
//
25392494
// CHECK: [[ACCESS:%.*]] = begin_access [modify] [unknown] [[MARK]]
25402495
// CHECK: [[GEP:%.*]] = struct_element_addr [[ACCESS]]
@@ -2555,13 +2510,10 @@ public func testSubscriptReadModifyThroughNonCopyableParentStruct_BaseLoadable_R
25552510
// CHECK: [[GEP:%.*]] = struct_element_addr [[MARK]]
25562511
// CHECK: [[LOAD:%.*]] = load_borrow [[GEP]]
25572512
// CHECK: ([[CORO_RESULT:%.*]], [[CORO_TOKEN:%.*]]) = begin_apply {{%.*}}({{%.*}}, [[LOAD]])
2558-
// CHECK: [[TEMP:%.*]] = alloc_stack $AddressOnlyProtocol
2559-
// CHECK: copy_addr [[CORO_RESULT]] to [init] [[TEMP]]
2513+
// CHECK: apply {{%.*}}([[CORO_RESULT]])
25602514
// CHECK: end_apply [[CORO_TOKEN]]
25612515
// CHECK: end_borrow [[LOAD]]
25622516
// CHECK: end_access [[ACCESS]]
2563-
// CHECK: apply {{%.*}}([[TEMP]])
2564-
// CHECK: destroy_addr [[TEMP]]
25652517
//
25662518
// CHECK: [[GLOBAL:%.*]] = global_addr @$s8moveonly62globalLoadableSubscriptReadModifyTesterNonCopyableStructParentAA0cdefghijK0Vvp :
25672519
// CHECK: [[ACCESS:%.*]] = begin_access [modify] [dynamic] [[GLOBAL]]
@@ -2600,14 +2552,11 @@ public class LoadableSubscriptReadModifyTesterClassParent {
26002552
// CHECK: [[BORROW_COPYABLE_CLASS:%.*]] = begin_borrow [[COPYABLE_CLASS]]
26012553
// CHECK: ([[CORO_RESULT:%.*]], [[CORO_TOKEN:%.*]]) = begin_apply {{%.*}}([[BORROW_COPYABLE_CLASS]])
26022554
// CHECK: ([[CORO_RESULT_2:%.*]], [[CORO_TOKEN_2:%.*]]) = begin_apply {{%.*}}({{%.*}}, [[CORO_RESULT]])
2603-
// CHECK: [[TEMP:%.*]] = alloc_stack $
2604-
// CHECK: copy_addr [[CORO_RESULT_2]] to [init] [[TEMP]]
2555+
// CHECK: apply {{%.*}}([[CORO_RESULT_2]])
26052556
// CHECK: end_apply [[CORO_TOKEN_2]]
26062557
// CHECK: end_apply [[CORO_TOKEN]]
26072558
// CHECK: end_borrow [[BORROW_COPYABLE_CLASS]]
26082559
// CHECK: destroy_value [[COPYABLE_CLASS]]
2609-
// CHECK: apply {{%.*}}([[TEMP]])
2610-
// CHECK: destroy_addr [[TEMP]]
26112560
//
26122561
// First mutation.
26132562
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[PROJECT]]
@@ -2630,14 +2579,11 @@ public class LoadableSubscriptReadModifyTesterClassParent {
26302579
// CHECK: ([[CORO_RESULT:%.*]], [[CORO_TOKEN:%.*]]) = begin_apply {{%.*}}([[BORROW_COPYABLE_CLASS]])
26312580
// CHECK: [[EXT:%.*]] = struct_extract [[CORO_RESULT]]
26322581
// CHECK: ([[CORO_RESULT_2:%.*]], [[CORO_TOKEN_2:%.*]]) = begin_apply {{%.*}}({{%.*}}, [[EXT]])
2633-
// CHECK: [[TEMP:%.*]] = alloc_stack $
2634-
// CHECK: copy_addr [[CORO_RESULT_2]] to [init] [[TEMP]]
2582+
// CHECK: apply {{%.*}}([[CORO_RESULT_2]])
26352583
// CHECK: end_apply [[CORO_TOKEN_2]]
26362584
// CHECK: end_apply [[CORO_TOKEN]]
26372585
// CHECK: end_borrow [[BORROW_COPYABLE_CLASS]]
26382586
// CHECK: destroy_value [[COPYABLE_CLASS]]
2639-
// CHECK: apply {{%.*}}([[TEMP]])
2640-
// CHECK: destroy_addr [[TEMP]]
26412587
//
26422588
// Second mutate
26432589
//
@@ -2693,12 +2639,9 @@ public class LoadableSubscriptReadModifyTesterClassParent {
26932639
// CHECK: [[BORROW_COPYABLE_CLASS:%.*]] = begin_borrow [[COPYABLE_CLASS]]
26942640
// CHECK: ([[CORO_RESULT:%.*]], [[CORO_TOKEN:%.*]]) = begin_apply {{%.*}}([[BORROW_COPYABLE_CLASS]])
26952641
// CHECK: ([[CORO_RESULT_2:%.*]], [[CORO_TOKEN_2:%.*]]) = begin_apply {{%.*}}({{%.*}}, [[CORO_RESULT]])
2696-
// CHECK: [[TEMP:%.*]] = alloc_stack $
2697-
// CHECK: copy_addr [[CORO_RESULT_2]] to [init] [[TEMP]]
2642+
// CHECK: apply {{%.*}}([[CORO_RESULT_2]])
26982643
// CHECK: end_apply [[CORO_TOKEN_2]]
26992644
// CHECK: end_apply [[CORO_TOKEN]]
2700-
// CHECK: apply {{%.*}}([[TEMP]])
2701-
// CHECK: destroy_addr [[TEMP]]
27022645
//
27032646
// Mutation
27042647
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[PROJECT]]

0 commit comments

Comments
 (0)