@@ -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