@@ -46,7 +46,6 @@ unwind:
46
46
47
47
// CHECK-LABEL: sil @test_simple_call
48
48
// CHECK: bb0(%0 : @trivial $Builtin.Int1):
49
- // CHECK: [[IND_RES:%.*]] = alloc_stack $Indirect<SomeSubclass>
50
49
// CHECK: [[MARKER:%.*]] = function_ref @marker
51
50
// CHECK: [[MARKER2:%.*]] = function_ref @marker
52
51
// CHECK: [[I:%.*]] = integer_literal $Builtin.Int32, 1000
@@ -55,7 +54,6 @@ unwind:
55
54
// CHECK: [[MK_IND:%.*]] = function_ref @make_indirect
56
55
// CHECK: apply [[MK_IND]]<SomeSubclass>([[TEMP]])
57
56
// CHECK: [[INTTOKEN:%.*]] = integer_literal $Builtin.Int32, 0
58
- // CHECK: copy_addr [take] [[TEMP]] to [initialization] [[IND_RES]] : $*Indirect<SomeSubclass>
59
57
// CHECK: br bb3([[INTTOKEN]] : $Builtin.Int32)
60
58
61
59
// CHECK:bb1:
@@ -71,7 +69,7 @@ unwind:
71
69
// CHECK: br bb7
72
70
73
71
// CHECK: bb3([[WHICH_YIELD:%.*]] : @trivial $Builtin.Int32):
74
- // CHECK: destroy_addr [[IND_RES ]] : $*Indirect<SomeSubclass>
72
+ // CHECK: destroy_addr [[TEMP ]] : $*Indirect<SomeSubclass>
75
73
// CHECK: cond_br %0, bb4, bb6
76
74
77
75
// CHECK: bb4:
@@ -82,7 +80,7 @@ unwind:
82
80
83
81
// CHECK: bb5:
84
82
// CHECK: [[I5:%.*]] = integer_literal $Builtin.Int32, 20
85
- // CHECK: %29 = apply [[MARKER]]([[I5]])
83
+ // CHECK: apply [[MARKER]]([[I5]])
86
84
// CHECK: br bb8
87
85
88
86
// CHECK: bb6:
@@ -97,7 +95,6 @@ unwind:
97
95
// CHECK: br bb8
98
96
99
97
// CHECK:bb8:
100
- // CHECK: dealloc_stack [[IND_RES]] : $*Indirect<SomeSubclass>
101
98
// CHECK: return
102
99
// CHECK:}
103
100
@@ -173,79 +170,11 @@ unwind:
173
170
unwind
174
171
}
175
172
173
+ // We don't support inlining functions with multiple yields yet.
176
174
// CHECK-LABEL: sil @test_simple_call_two_yields : $@convention(thin) (Builtin.Int1, Builtin.Int1) -> () {
177
175
// CHECK: bb0(%0 : @trivial $Builtin.Int1, %1 : @trivial $Builtin.Int1):
178
- // CHECK: %2 = alloc_stack $Indirect<SomeSubclass>
179
- // CHECK: %3 = function_ref @marker : $@convention(thin) (Builtin.Int32) -> ()
180
- // CHECK: %4 = function_ref @marker : $@convention(thin) (Builtin.Int32) -> ()
181
- // CHECK: %5 = integer_literal $Builtin.Int32, 1000
182
- // CHECK: %6 = apply %4(%5) : $@convention(thin) (Builtin.Int32) -> ()
183
- // CHECK: %7 = alloc_stack $Indirect<SomeSubclass>
184
- // CHECK: %8 = function_ref @make_indirect
185
- // CHECK: cond_br %0, bb1, bb6
186
-
187
- // CHECK: bb1:
188
- // CHECK: %10 = apply %8<SomeSubclass>(%7)
189
- // CHECK: %11 = integer_literal $Builtin.Int64, 31
190
- // CHECK: %12 = integer_literal $Builtin.Int32, 0
191
- // CHECK: copy_addr [take] %7 to [initialization] %2 : $*Indirect<SomeSubclass>
192
- // CHECK: br bb9(%11 : $Builtin.Int64, %12 : $Builtin.Int32)
193
-
194
- // CHECK: bb2:
195
- // CHECK: br bb3
196
-
197
- // CHECK: bb3:
198
- // CHECK: %16 = integer_literal $Builtin.Int32, 2000
199
- // CHECK: %17 = apply %4(%16)
200
- // CHECK: dealloc_stack %7 : $*Indirect<SomeSubclass>
201
- // CHECK: br bb11
202
-
203
- // CHECK: bb4:
204
- // CHECK: br bb5
205
-
206
- // CHECK: bb5:
207
- // CHECK: %22 = integer_literal $Builtin.Int32, 3000
208
- // CHECK: %23 = apply %4(%22)
209
- // CHECK: dealloc_stack %7 : $*Indirect<SomeSubclass>
210
- // CHECK: br bb13
211
-
212
- // CHECK: bb6:
213
- // CHECK: %26 = apply %8<SomeSubclass>(%7) : $@convention(thin) <τ_0_0 where τ_0_0 : SomeClass> () -> @out Indirect<τ_0_0>
214
- // CHECK: %27 = integer_literal $Builtin.Int64, 32
215
- // CHECK: %28 = integer_literal $Builtin.Int32, 1
216
- // CHECK: copy_addr [take] %7 to [initialization] %2 : $*Indirect<SomeSubclass>
217
- // CHECK: br bb9(%27 : $Builtin.Int64, %28 : $Builtin.Int32)
218
-
219
- // CHECK: bb7:
220
- // CHECK: br bb3
221
-
222
- // CHECK: bb8:
223
- // CHECK: br bb5
224
-
225
- // CHECK: bb9(%33 : @trivial $Builtin.Int64, %34 : @trivial $Builtin.Int32):
226
- // CHECK: destroy_addr %2 : $*Indirect<SomeSubclass>
227
- // CHECK: cond_br %1, bb10, bb12
228
-
229
- // CHECK: bb10:
230
- // CHECK: %37 = integer_literal $Builtin.Int32, 0
231
- // CHECK: %38 = integer_literal $Builtin.Int32, 1
232
- // CHECK: switch_value %34 : $Builtin.Int32, case %37: bb2, case %38: bb7
233
-
234
- // CHECK: bb11:
235
- // CHECK: br bb14
236
-
237
- // CHECK: bb12:
238
- // CHECK: %41 = integer_literal $Builtin.Int32, 0
239
- // CHECK: %42 = integer_literal $Builtin.Int32, 1
240
- // CHECK: switch_value %34 : $Builtin.Int32, case %41: bb4, case %42: bb8
241
-
242
- // CHECK: bb13:
243
- // CHECK: br bb14
244
-
245
- // CHECK: bb14:
246
- // CHECK: %45 = tuple ()
247
- // CHECK: dealloc_stack %2 : $*Indirect<SomeSubclass>
248
- // CHECK: return %45 : $()
176
+ // CHECK: begin_apply
177
+ // CHECK: return
249
178
250
179
sil @test_simple_call_two_yields : $(Builtin.Int1, Builtin.Int1) -> () {
251
180
entry(%flag : @trivial $Builtin.Int1, %flag2 : @trivial $Builtin.Int1):
@@ -348,3 +277,95 @@ cont:
348
277
%ret = tuple ()
349
278
return %ret : $()
350
279
}
280
+
281
+ sil @use : $@convention(thin) (@in Builtin.Int8) -> ()
282
+
283
+ sil [transparent] @yield_inout : $@yield_once() -> (@yields @inout Builtin.Int8) {
284
+ entry:
285
+ %addr = alloc_stack $Builtin.Int8
286
+ %8 = integer_literal $Builtin.Int8, 8
287
+ store %8 to [trivial] %addr : $*Builtin.Int8
288
+ yield %addr : $*Builtin.Int8, resume resume, unwind unwind
289
+
290
+ resume:
291
+ %use = function_ref @use : $@convention(thin) (@in Builtin.Int8) -> ()
292
+ apply %use(%addr) : $@convention(thin) (@in Builtin.Int8) -> ()
293
+ dealloc_stack %addr: $*Builtin.Int8
294
+ %ret = tuple ()
295
+ return %ret : $()
296
+
297
+ unwind:
298
+ %3000 = integer_literal $Builtin.Int32, 3000
299
+ %marker = function_ref @marker : $@convention(thin) (Builtin.Int32) -> ()
300
+ apply %marker(%3000) : $@convention(thin) (Builtin.Int32) -> ()
301
+ dealloc_stack %addr: $*Builtin.Int8
302
+ unwind
303
+ }
304
+
305
+
306
+ // CHECK: sil @test_simple_call_yield_inout : $@convention(thin) (Builtin.Int1) -> () {
307
+ // CHECK: bb0(%0 : @trivial $Builtin.Int1):
308
+ // CHECK: %1 = alloc_stack $Builtin.Int8
309
+ // CHECK: %2 = integer_literal $Builtin.Int8, 8
310
+ // CHECK: store %2 to [trivial] %1 : $*Builtin.Int8
311
+ // CHECK: %4 = integer_literal $Builtin.Int32, 0
312
+ // CHECK: br bb3(%4 : $Builtin.Int32)
313
+
314
+ // CHECK: bb1:
315
+ // CHECK: %6 = function_ref @use : $@convention(thin) (@in Builtin.Int8) -> ()
316
+ // CHECK: %7 = apply %6(%1) : $@convention(thin) (@in Builtin.Int8) -> ()
317
+ // CHECK: dealloc_stack %1 : $*Builtin.Int8
318
+ // CHECK: %9 = tuple ()
319
+ // CHECK: br bb5
320
+
321
+ // CHECK: bb2:
322
+ // CHECK: %11 = integer_literal $Builtin.Int32, 3000
323
+ // CHECK: %12 = function_ref @marker : $@convention(thin) (Builtin.Int32) -> ()
324
+ // CHECK: %13 = apply %12(%11) : $@convention(thin) (Builtin.Int32) -> ()
325
+ // CHECK: dealloc_stack %1 : $*Builtin.Int8
326
+ // CHECK: br bb7
327
+
328
+ // CHECK: bb3(%16 : @trivial $Builtin.Int32):
329
+ // CHECK: cond_br %0, bb4, bb6
330
+
331
+ // CHECK: bb4:
332
+ // CHECK: %18 = integer_literal $Builtin.Int8, 8
333
+ // CHECK: store %18 to [trivial] %1 : $*Builtin.Int8
334
+ // CHECK: %20 = integer_literal $Builtin.Int32, 0
335
+ // CHECK: switch_value %16 : $Builtin.Int32, case %20: bb1
336
+
337
+ // CHECK: bb5:
338
+ // CHECK: br bb8
339
+
340
+ // CHECK: bb6:
341
+ // CHECK: %23 = integer_literal $Builtin.Int32, 0
342
+ // CHECK: switch_value %16 : $Builtin.Int32, case %23: bb2
343
+
344
+ // CHECK: bb7:
345
+ // CHECK: br bb8
346
+
347
+ // CHECK: bb8:
348
+ // CHECK: %26 = tuple ()
349
+ // CHECK: return %26 : $()
350
+ // CHECK: }
351
+
352
+ sil @test_simple_call_yield_inout : $(Builtin.Int1) -> () {
353
+ entry(%flag : @trivial $Builtin.Int1):
354
+ %0 = function_ref @yield_inout : $@convention(thin) @yield_once() -> (@yields @inout Builtin.Int8)
355
+ (%addr, %token) = begin_apply %0() : $@convention(thin) @yield_once() -> (@yields @inout Builtin.Int8)
356
+ cond_br %flag, yes, no
357
+
358
+ yes:
359
+ %8 = integer_literal $Builtin.Int8, 8
360
+ store %8 to [trivial] %addr : $*Builtin.Int8
361
+ end_apply %token
362
+ br cont
363
+
364
+ no:
365
+ abort_apply %token
366
+ br cont
367
+
368
+ cont:
369
+ %ret = tuple ()
370
+ return %ret : $()
371
+ }
0 commit comments