@@ -4,6 +4,8 @@ import Swift
4
4
5
5
class C {}
6
6
7
+ struct S {}
8
+
7
9
////////////////////////////////////////////////////////////////////////////////
8
10
// apply
9
11
////////////////////////////////////////////////////////////////////////////////
@@ -23,6 +25,18 @@ entry(%instance : @guaranteed $C):
23
25
return %retval : $()
24
26
}
25
27
28
+ sil [ossa] [always_inline] @callee_trivial : $@convention(thin) (S) -> () {
29
+ entry(%instance : $S):
30
+ %retval = tuple ()
31
+ return %retval : $()
32
+ }
33
+
34
+ sil [ossa] [always_inline] @callee_address : $@convention(thin) (@in S) -> () {
35
+ entry(%instance : $*S):
36
+ %retval = tuple ()
37
+ return %retval : $()
38
+ }
39
+
26
40
// tests
27
41
28
42
// CHECK-LABEL: sil [ossa] @caller_owned_callee_owned : $@convention(thin) (@owned C) -> () {
@@ -91,6 +105,30 @@ entry(%instance : @guaranteed $C):
91
105
return %result : $()
92
106
}
93
107
108
+ // CHECK-LABEL: sil [ossa] @caller_trivial_callee_trivial : $@convention(thin) (S) -> () {
109
+ // CHECK: {{bb[^,]+}}({{%[^,]+}} : $S):
110
+ // CHECK: [[RETVAL:%[^,]+]] = tuple ()
111
+ // CHECK: return [[RETVAL]]
112
+ // CHECK-LABEL: } // end sil function 'caller_trivial_callee_trivial'
113
+ sil [ossa] @caller_trivial_callee_trivial : $@convention(thin) (S) -> () {
114
+ entry(%instance : $S):
115
+ %callee_trivial = function_ref @callee_trivial : $@convention(thin) (S) -> ()
116
+ %result = apply %callee_trivial(%instance) : $@convention(thin) (S) -> ()
117
+ return %result : $()
118
+ }
119
+
120
+ // CHECK-LABEL: sil [ossa] @caller_address_callee_address : $@convention(thin) (@in S) -> () {
121
+ // CHECK: {{bb[^,]+}}({{%[^,]+}} : $*S):
122
+ // CHECK: [[RETVAL:%[^,]+]] = tuple ()
123
+ // CHECK: return [[RETVAL]]
124
+ // CHECK-LABEL: } // end sil function 'caller_address_callee_address'
125
+ sil [ossa] @caller_address_callee_address : $@convention(thin) (@in S) -> () {
126
+ entry(%instance : $*S):
127
+ %callee_address = function_ref @callee_address : $@convention(thin) (@in S) -> ()
128
+ %result = apply %callee_address(%instance) : $@convention(thin) (@in S) -> ()
129
+ return %result : $()
130
+ }
131
+
94
132
////////////////////////////////////////////////////////////////////////////////
95
133
// begin_apply
96
134
////////////////////////////////////////////////////////////////////////////////
@@ -130,6 +168,30 @@ bb2:
130
168
unwind
131
169
}
132
170
171
+ sil hidden [ossa] [always_inline] @callee_coro_trivial : $@yield_once @convention(method) (S) -> @yields @inout S {
172
+ bb0(%instance : $S):
173
+ %addr = alloc_stack $S
174
+ store %instance to [trivial] %addr : $*S
175
+ yield %addr : $*S, resume bb1, unwind bb2
176
+ bb1:
177
+ dealloc_stack %addr : $*S
178
+ %result = tuple ()
179
+ return %result : $()
180
+ bb2:
181
+ dealloc_stack %addr : $*S
182
+ unwind
183
+ }
184
+
185
+ sil hidden [ossa] [always_inline] @callee_coro_address : $@yield_once @convention(method) (@in S) -> @yields @inout S {
186
+ bb0(%instance : $*S):
187
+ yield %instance : $*S, resume bb1, unwind bb2
188
+ bb1:
189
+ %result = tuple ()
190
+ return %result : $()
191
+ bb2:
192
+ unwind
193
+ }
194
+
133
195
// tests
134
196
135
197
// CHECK-LABEL: sil [ossa] @caller_owned_callee_coro_owned : $@convention(method) (@owned C) -> () {
@@ -242,6 +304,44 @@ bb0(%instance : @guaranteed $C):
242
304
return %retval : $()
243
305
}
244
306
307
+ // CHECK-LABEL: sil hidden [ossa] @caller_trivial_callee_coro_trivial : $@convention(method) (S) -> () {
308
+ // CHECK: {{bb[0-9]+}}([[REGISTER_0:%[^,]+]] : $S):
309
+ // CHECK: [[REGISTER_1:%[^,]+]] = alloc_stack $S
310
+ // CHECK: store [[REGISTER_0]] to [trivial] [[REGISTER_1]] : $*S
311
+ // CHECK: dealloc_stack [[REGISTER_1]] : $*S
312
+ // CHECK: [[REGISTER_4:%[^,]+]] = tuple ()
313
+ // CHECK: [[REGISTER_5:%[^,]+]] = tuple ()
314
+ // CHECK: return [[REGISTER_5]] : $()
315
+ // CHECK: {{bb[0-9]+}}:
316
+ // CHECK: dealloc_stack [[REGISTER_1]] : $*S
317
+ // CHECK: unreachable
318
+ // CHECK-LABEL: } // end sil function 'caller_trivial_callee_coro_trivial'
319
+ sil hidden [ossa] @caller_trivial_callee_coro_trivial : $@convention(method) (S) -> () {
320
+ bb0(%instance : $S):
321
+ %callee_coro_trivial = function_ref @callee_coro_trivial : $@yield_once @convention(method) (S) -> @yields @inout S
322
+ (%addr, %continuation) = begin_apply %callee_coro_trivial(%instance) : $@yield_once @convention(method) (S) -> @yields @inout S
323
+ end_apply %continuation
324
+ %retval = tuple ()
325
+ return %retval : $()
326
+ }
327
+
328
+ // CHECK-LABEL: sil hidden [ossa] @caller_address_callee_coro_address : $@convention(method) (@in S) -> () {
329
+ // CHECK: {{bb[^,]+}}({{%[^,]+}} : $*S):
330
+ // CHECK: {{%[^,]+}} = tuple ()
331
+ // CHECK: [[RETVAL:%[^,]+]] = tuple ()
332
+ // CHECK: return [[RETVAL]]
333
+ // CHECK: {{bb[^,]+}}:
334
+ // CHECK: unreachable
335
+ // CHECK-LABEL: } // end sil function 'caller_address_callee_coro_address'
336
+ sil hidden [ossa] @caller_address_callee_coro_address : $@convention(method) (@in S) -> () {
337
+ bb0(%instance : $*S):
338
+ %callee_coro_address = function_ref @callee_coro_address : $@yield_once @convention(method) (@in S) -> @yields @inout S
339
+ (%addr, %continuation) = begin_apply %callee_coro_address(%instance) : $@yield_once @convention(method) (@in S) -> @yields @inout S
340
+ end_apply %continuation
341
+ %retval = tuple ()
342
+ return %retval : $()
343
+ }
344
+
245
345
////////////////////////////////////////////////////////////////////////////////
246
346
// try_apply
247
347
////////////////////////////////////////////////////////////////////////////////
@@ -270,6 +370,26 @@ bb2:
270
370
return %18 : $()
271
371
}
272
372
373
+ sil [ossa] @callee_error_trivial : $@convention(thin) (S) -> @error Error {
374
+ bb0(%0 : $S):
375
+ cond_br undef, bb1, bb2
376
+ bb1:
377
+ throw undef : $Error
378
+ bb2:
379
+ %18 = tuple ()
380
+ return %18 : $()
381
+ }
382
+
383
+ sil [ossa] @callee_error_address : $@convention(thin) (@in S) -> @error Error {
384
+ bb0(%0 : $*S):
385
+ cond_br undef, bb1, bb2
386
+ bb1:
387
+ throw undef : $Error
388
+ bb2:
389
+ %18 = tuple ()
390
+ return %18 : $()
391
+ }
392
+
273
393
// tests
274
394
275
395
// CHECK-LABEL: sil [ossa] @callee_owned_callee_error_owned : $@convention(thin) (@owned C) -> @error Error {
@@ -364,11 +484,11 @@ bb2(%12 : @owned $Error):
364
484
// CHECK-LABEL: sil [ossa] @callee_guaranteed_callee_error_guaranteed : $@convention(thin) (@guaranteed C) -> @error Error {
365
485
// CHECK: {{bb[^,]+}}([[INSTANCE:%[^,]+]] : @guaranteed $C):
366
486
// CHECK: [[LIFETIME:%[^,]+]] = begin_borrow [lexical] [[INSTANCE]]
367
- // CHECK: cond_br undef, [[BASIC_BLOCK1 :bb[^,]+]], [[BASIC_BLOCK2 :bb[0-9]+]]
368
- // CHECK: [[BASIC_BLOCK1 ]]:
487
+ // CHECK: cond_br undef, [[THROW_BLOCK :bb[^,]+]], [[REGULAR_BLOCK :bb[0-9]+]]
488
+ // CHECK: [[THROW_BLOCK ]]:
369
489
// CHECK: end_borrow [[LIFETIME]]
370
490
// CHECK: throw undef
371
- // CHECK: [[BASIC_BLOCK2 ]]:
491
+ // CHECK: [[REGULAR_BLOCK ]]:
372
492
// CHECK: [[ORIGINAL_RETVAL:%[^,]+]] = tuple ()
373
493
// CHECK: end_borrow [[LIFETIME]]
374
494
// CHECK: [[RETVAL:%[^,]+]] = tuple ()
@@ -384,3 +504,45 @@ bb1(%9 : $()):
384
504
bb2(%12 : @owned $Error):
385
505
throw %12 : $Error
386
506
}
507
+
508
+ // CHECK-LABEL: sil hidden [ossa] @callee_trivial_callee_error_trivial : $@convention(thin) (S) -> @error Error {
509
+ // CHECK: {{bb[^,]+}}({{%[^,]+}} : $S):
510
+ // CHECK: cond_br undef, [[THROW_BLOCK:bb[^,]+]], [[REGULAR_BLOCK:bb[0-9]+]]
511
+ // CHECK: [[THROW_BLOCK]]:
512
+ // CHECK: throw undef
513
+ // CHECK: [[REGULAR_BLOCK]]:
514
+ // CHECK: [[ORIGINAL_RETVAL:%[^,]+]] = tuple ()
515
+ // CHECK: [[RETVAL:%[^,]+]] = tuple ()
516
+ // CHECK: return [[RETVAL]]
517
+ // CHECK-LABEL: } // end sil function 'callee_trivial_callee_error_trivial'
518
+ sil hidden [ossa] @callee_trivial_callee_error_trivial : $@convention(thin) (S) -> @error Error {
519
+ bb0(%instance : $S):
520
+ %callee_error_trivial = function_ref @callee_error_trivial : $@convention(thin) (S) -> @error Error
521
+ try_apply %callee_error_trivial(%instance) : $@convention(thin) (S) -> @error Error, normal bb1, error bb2
522
+ bb1(%9 : $()):
523
+ %10 = tuple ()
524
+ return %10 : $()
525
+ bb2(%12 : @owned $Error):
526
+ throw %12 : $Error
527
+ }
528
+
529
+ // CHECK-LABEL: sil hidden [ossa] @callee_address_callee_error_address : $@convention(thin) (@in S) -> @error Error {
530
+ // CHECK: {{bb[^,]+}}({{%[^,]+}} : $*S):
531
+ // CHECK: cond_br undef, [[THROW_BLOCK:bb[0-9]+]], [[REGULAR_BLOCK:bb[0-9]+]]
532
+ // CHECK: [[THROW_BLOCK]]:
533
+ // CHECK: throw undef
534
+ // CHECK: [[REGULAR_BLOCK]]:
535
+ // CHECK: {{%[^,]+}} = tuple ()
536
+ // CHECK: [[RETVAL:%[^,]+]] = tuple ()
537
+ // CHECK: return [[RETVAL]]
538
+ // CHECK-LABEL: } // end sil function 'callee_address_callee_error_address'
539
+ sil hidden [ossa] @callee_address_callee_error_address : $@convention(thin) (@in S) -> @error Error {
540
+ bb0(%instance : $*S):
541
+ %callee_error_address = function_ref @callee_error_address : $@convention(thin) (@in S) -> @error Error
542
+ try_apply %callee_error_address(%instance) : $@convention(thin) (@in S) -> @error Error, normal bb1, error bb2
543
+ bb1(%9 : $()):
544
+ %10 = tuple ()
545
+ return %10 : $()
546
+ bb2(%12 : @owned $Error):
547
+ throw %12 : $Error
548
+ }
0 commit comments