@@ -31,7 +31,7 @@ sil @baz_init : $@convention(thin) (@thin Baz.Type) -> @owned Baz
31
31
sil @dummy_func : $@convention(thin) (Int, Int, Int) -> Int
32
32
33
33
// CHECK-LABEL: sil @test_capture_promotion
34
- sil @test_capture_promotion : $@convention(thin) () -> @owned @callee_owned () -> Int {
34
+ sil @test_capture_promotion : $@convention(thin) () -> @owned @callee_owned () -> ( Int, Builtin.Int64) {
35
35
bb0:
36
36
// CHECK: [[BOX1:%.*]] = alloc_box $<τ_0_0> { var τ_0_0 } <Foo>
37
37
// CHECK: [[MARKED_BOX1:%.*]] = mark_uninitialized [var] [[BOX1]]
88
88
// previously used to capture and pass the variable by reference
89
89
// CHECK-NEXT: {{.*}} = partial_apply [[CLOSURE_PROMOTE]]([[LOADFOO]], [[LOADBAZ]], [[LOADINT]])
90
90
91
- %17 = function_ref @closure0 : $@convention(thin) (@owned <τ_0_0> { var τ_0_0 } <Foo>, @owned <τ_0_0> { var τ_0_0 } <Baz>, @owned <τ_0_0> { var τ_0_0 } <Int>) -> Int
91
+ %17 = function_ref @closure0 : $@convention(thin) (@owned <τ_0_0> { var τ_0_0 } <Foo>, @owned <τ_0_0> { var τ_0_0 } <Baz>, @owned <τ_0_0> { var τ_0_0 } <Int>) -> ( Int, Builtin.Int64)
92
92
%18 = copy_value %1ab : $<τ_0_0> { var τ_0_0 } <Foo>
93
93
%19 = copy_value %6 : $<τ_0_0> { var τ_0_0 } <Baz>
94
94
%20 = copy_value %11 : $<τ_0_0> { var τ_0_0 } <Int>
95
- %21 = partial_apply %17(%18, %19, %20) : $@convention(thin) (@owned <τ_0_0> { var τ_0_0 } <Foo>, @owned <τ_0_0> { var τ_0_0 } <Baz>, @owned <τ_0_0> { var τ_0_0 } <Int>) -> Int
95
+ %21 = partial_apply %17(%18, %19, %20) : $@convention(thin) (@owned <τ_0_0> { var τ_0_0 } <Foo>, @owned <τ_0_0> { var τ_0_0 } <Baz>, @owned <τ_0_0> { var τ_0_0 } <Int>) -> ( Int, Builtin.Int64)
96
96
97
97
destroy_value %11 : $<τ_0_0> { var τ_0_0 } <Int>
98
98
destroy_value %6 : $<τ_0_0> { var τ_0_0 } <Baz>
99
99
destroy_value %1ab : $<τ_0_0> { var τ_0_0 } <Foo>
100
100
101
- return %21 : $@callee_owned () -> Int
101
+ return %21 : $@callee_owned () -> ( Int, Builtin.Int64)
102
102
}
103
103
104
104
// CHECK-LABEL: sil @test_capture_promotion_indirect
163
163
return %21 : $@callee_owned () -> @out Int
164
164
}
165
165
166
- // CHECK-LABEL: sil private @_T08closure0Tf2iii_n : $@convention(thin) (@owned Foo, @owned Baz, Int) -> Int {
166
+ // CHECK-LABEL: sil private @_T08closure0Tf2iii_n : $@convention(thin) (@owned Foo, @owned Baz, Int) -> ( Int, Builtin.Int64) {
167
167
// CHECK: bb0([[ORIGINAL_ARG0:%.*]] : @owned $Foo, [[ORIGINAL_ARG1:%.*]] : @owned $Baz, [[ARG2:%.*]] : @trivial $Int):
168
168
// CHECK: [[ARG0:%.*]] = begin_borrow [[ORIGINAL_ARG0]]
169
169
// CHECK: [[ARG1:%.*]] = begin_borrow [[ORIGINAL_ARG1]]
177
177
// CHECK: destroy_value [[ARG0_COPY]]
178
178
179
179
// CHECK: [[EXTRACT_BAZ_X:%.*]] = struct_extract [[ARG1]] : $Baz, #Baz.x
180
+ // CHECK: [[EXTRACT_INT_VALUE:%.*]] = struct_extract [[ARG2]] : $Int, #Int.value
180
181
// CHECK: [[RETVAL:%.*]] = apply [[DUMMY_FUNC]]([[APPLY_FOO]], [[EXTRACT_BAZ_X]], {{.*}}) : $@convention(thin) (Int, Int, Int) -> Int
181
182
182
183
// The release of %4 is removed because the Int type is trivial
@@ -190,10 +191,11 @@ bb0:
190
191
// it is a reference type
191
192
// CHECK: end_borrow [[ARG0]] from [[ORIGINAL_ARG0]]
192
193
// CHECK: destroy_value [[ORIGINAL_ARG0]]
193
- // CHECK: return [[RETVAL]] : $Int
194
+ // CHECK: [[RESULT:%.*]] = tuple ([[RETVAL]] : $Int, [[EXTRACT_INT_VALUE]] : $Builtin.Int64)
195
+ // CHECK: return [[RESULT]] : $(Int, Builtin.Int64)
194
196
// CHECK: } // end sil function '_T08closure0Tf2iii_n'
195
197
196
- sil private @closure0 : $@convention(thin) (@owned <τ_0_0> { var τ_0_0 } <Foo>, @owned <τ_0_0> { var τ_0_0 } <Baz>, @owned <τ_0_0> { var τ_0_0 } <Int>) -> Int {
198
+ sil private @closure0 : $@convention(thin) (@owned <τ_0_0> { var τ_0_0 } <Foo>, @owned <τ_0_0> { var τ_0_0 } <Baz>, @owned <τ_0_0> { var τ_0_0 } <Int>) -> ( Int, Builtin.Int64) {
197
199
bb0(%0 : @owned $<τ_0_0> { var τ_0_0 } <Foo>, %2 : @owned $<τ_0_0> { var τ_0_0 } <Baz>, %4 : @owned $<τ_0_0> { var τ_0_0 } <Int>):
198
200
%1 = project_box %0 : $<τ_0_0> { var τ_0_0 } <Foo>, 0
199
201
%3 = project_box %2 : $<τ_0_0> { var τ_0_0 } <Baz>, 0
@@ -210,11 +212,14 @@ bb0(%0 : @owned $<τ_0_0> { var τ_0_0 } <Foo>, %2 : @owned $<τ_0_0> { var τ_0
210
212
%12 = struct_element_addr %3 : $*Baz, #Baz.x
211
213
%13 = load [trivial] %12 : $*Int
212
214
%14 = load [trivial] %5 : $*Int
213
- %15 = apply %7(%11, %13, %14) : $@convention(thin) (Int, Int, Int) -> Int
215
+ %15 = struct_element_addr %5 : $*Int, #Int.value
216
+ %16 = load [trivial] %15 : $*Builtin.Int64
217
+ %17 = apply %7(%11, %13, %14) : $@convention(thin) (Int, Int, Int) -> Int
214
218
destroy_value %4 : $<τ_0_0> { var τ_0_0 } <Int>
215
219
destroy_value %2 : $<τ_0_0> { var τ_0_0 } <Baz>
216
220
destroy_value %0 : $<τ_0_0> { var τ_0_0 } <Foo>
217
- return %15 : $Int
221
+ %18 = tuple(%17 : $Int, %16 : $Builtin.Int64)
222
+ return %18 : $(Int, Builtin.Int64)
218
223
}
219
224
220
225
// The closure in this function is not promotable because it mutates its argument
@@ -303,7 +308,6 @@ bb0(%0 : @owned $<τ_0_0> { var τ_0_0 } <Int>, %2 : @owned $<τ_0_0> { var τ_0
303
308
304
309
sil [transparent] [serialized] @_T0s1poiSiSi_SitF : $@convention(thin) (Int, Int) -> Int
305
310
306
-
307
311
sil private @closure_indirect_result : $@convention(thin) (@owned <τ_0_0> { var τ_0_0 } <Foo>, @owned <τ_0_0> { var τ_0_0 } <Baz>, @owned <τ_0_0> { var τ_0_0 } <Int>) -> @out Int {
308
312
bb0(%0: @trivial $*Int, %1 : @owned $<τ_0_0> { var τ_0_0 } <Foo>, %2 : @owned $<τ_0_0> { var τ_0_0 } <Baz>, %4 : @owned $<τ_0_0> { var τ_0_0 } <Int>):
309
313
%17 = project_box %1 : $<τ_0_0> { var τ_0_0 } <Foo>, 0
0 commit comments