@@ -66,15 +66,12 @@ struct Small {
66
66
// CHECK: bb0:
67
67
// CHECK: %0 = alloc_stack $Optional<X>
68
68
// CHECK: %1 = alloc_stack $X
69
- // CHECK: %2 = alloc_stack $X
70
- // CHECK: %3 = alloc_stack $Optional<X>
71
- // CHECK: copy_addr [take] %2 to [init] %1 : $*X
72
- // CHECK: %5 = init_enum_data_addr %0 : $*Optional<X>, #Optional.some!enumelt
73
- // CHECK: copy_addr [take] %1 to [init] %5 : $*X
69
+ // CHECK: %2 = alloc_stack $Optional<X>
70
+ // CHECK: %3 = init_enum_data_addr %0 : $*Optional<X>, #Optional.some!enumelt
71
+ // CHECK: copy_addr [take] %1 to [init] %3 : $*X
74
72
// CHECK: inject_enum_addr %0 : $*Optional<X>, #Optional.some!enumelt
75
- // CHECK: copy_addr [take] %0 to [init] %3 : $*Optional<X>
76
- // CHECK: dealloc_stack %3 : $*Optional<X>
77
- // CHECK: dealloc_stack %2 : $*X
73
+ // CHECK: copy_addr [take] %0 to [init] %2 : $*Optional<X>
74
+ // CHECK: dealloc_stack %2 : $*Optional<X>
78
75
// CHECK: dealloc_stack %1 : $*X
79
76
// CHECK: dealloc_stack %0 : $*Optional<X>
80
77
// CHECK: } // end sil function 'test1'
92
89
return %t : $()
93
90
}
94
91
92
+ sil @useX : $@convention(thin) (X) -> ()
93
+
95
94
// CHECK: sil @test2 : $@convention(thin) () -> () {
96
95
// CHECK: bb0:
97
96
// CHECK: %0 = alloc_stack $Optional<X>
98
- // CHECK: %1 = alloc_stack $Optional<X>
97
+ // CHECK: %1 = alloc_stack $X
99
98
// CHECK: %2 = alloc_stack $Optional<X>
100
- // CHECK: copy_addr [take] %2 to [init] %1 : $*Optional<X>
101
- // CHECK: copy_addr [take] %1 to [init] %0 : $*Optional<X>
102
- // CHECK: switch_enum_addr %0 : $*Optional<X>, case #Optional.some!enumelt: bb1, case #Optional.none!enumelt: bb2
99
+ // CHECK: copy_addr [take] %2 to [init] %0 : $*Optional<X>
100
+ // CHECK: switch_enum_addr %2 : $*Optional<X>, case #Optional.some!enumelt: bb1, case #Optional.none!enumelt: bb2
103
101
104
102
// CHECK: bb1:
105
- // CHECK: %6 = unchecked_take_enum_data_addr %0 : $*Optional<X>, #Optional.some!enumelt
103
+ // CHECK: %5 = unchecked_take_enum_data_addr %0 : $*Optional<X>, #Optional.some!enumelt
104
+ // CHECK: copy_addr [take] %5 to [init] %1 : $*X
105
+ // CHECK: %7 = function_ref @useX : $@convention(thin) (@in_guaranteed X) -> ()
106
+ // CHECK: %8 = apply %7(%1) : $@convention(thin) (@in_guaranteed X) -> ()
106
107
// CHECK: br bb3
107
108
108
109
// CHECK: bb2:
109
110
// CHECK: br bb3
110
111
111
112
// CHECK: bb3:
112
113
// CHECK: dealloc_stack %2 : $*Optional<X>
113
- // CHECK: dealloc_stack %1 : $*Optional<X>
114
+ // CHECK: dealloc_stack %1 : $*X
114
115
// CHECK: dealloc_stack %0 : $*Optional<X>
115
116
// CHECK: } // end sil function 'test2'
116
117
121
122
switch_enum %2 : $Optional<X>, case #Optional.some!enumelt: bb1, case #Optional.none!enumelt: bb2
122
123
123
124
bb1(%3: $X):
125
+ %f = function_ref @useX : $@convention(thin) (X) -> ()
126
+ apply %f(%3) : $@convention(thin) (X) -> ()
124
127
br bb3
125
128
126
129
bb2:
@@ -184,11 +187,9 @@ bb0:
184
187
185
188
// CHECK: sil @test5 : $@convention(thin) (@in (X, X)) -> () {
186
189
// CHECK: bb0(%0 : $*(X, X)):
187
- // CHECK: %1 = alloc_stack $(X, X)
188
- // CHECK: %2 = alloc_stack $X
189
- // CHECK: copy_addr [take] %0 to [init] %1 : $*(X, X)
190
- // CHECK: %4 = tuple_element_addr %1 : $*(X, X), 1
191
- // CHECK: copy_addr [take] %4 to [init] %2 : $*X
190
+ // CHECK: %1 = alloc_stack $X
191
+ // CHECK: %2 = tuple_element_addr %0 : $*(X, X), 1
192
+ // CHECK: copy_addr [take] %2 to [init] %1 : $*X
192
193
// CHECK: } // end sil function 'test5'
193
194
194
195
sil @test5 : $@convention(thin) (@in (X, X)) -> () {
@@ -231,11 +232,9 @@ bb0:
231
232
232
233
// CHECK: sil @test7 : $@convention(thin) (@in Y) -> () {
233
234
// CHECK: bb0(%0 : $*Y):
234
- // CHECK: %1 = alloc_stack $Y
235
- // CHECK: %2 = alloc_stack $X
236
- // CHECK: copy_addr [take] %0 to [init] %1 : $*Y
237
- // CHECK: %4 = struct_element_addr %1 : $*Y, #Y.y1
238
- // CHECK: copy_addr [take] %4 to [init] %2 : $*X
235
+ // CHECK: %1 = alloc_stack $X
236
+ // CHECK: %2 = struct_element_addr %0 : $*Y, #Y.y1
237
+ // CHECK: copy_addr [take] %2 to [init] %1 : $*X
239
238
// CHECK: } // end sil function 'test7'
240
239
241
240
sil @test7 : $@convention(thin) (@in Y) -> () {
339
338
}
340
339
341
340
// CHECK: sil @test13
342
- // CHECK: [[ADDR:%.*]] = unchecked_addr_cast %1 : $*X to $*Y
343
- // CHECK: copy_addr [take] [[ADDR]] to [init] %2 : $*Y
341
+ // CHECK: [[ADDR:%.*]] = unchecked_addr_cast %2 : $*X to $*Y
342
+ // CHECK: copy_addr [take] [[ADDR]] to [init] %1 : $*Y
344
343
// CHECK: } // end sil function 'test13'
345
344
sil @test13 : $@convention(thin) (@in X) -> () {
346
345
bb0(%0 : $*X):
@@ -443,3 +442,24 @@ bb0(%0 : $String):
443
442
%13 = tuple ()
444
443
return %13 : $()
445
444
}
445
+
446
+ sil_global private @global : $Optional<X>
447
+
448
+ sil @test18: $@convention(thin) () -> () {
449
+ bb0:
450
+ %0 = global_addr @global : $*Optional<X>
451
+ %1 = begin_access [modify] [static] [no_nested_conflict] %0
452
+ %2 = load %1
453
+ switch_enum %2, case #Optional.some!enumelt: bb2, case #Optional.none!enumelt: bb1
454
+
455
+ bb1:
456
+ %4 = integer_literal $Builtin.Int1, -1
457
+ cond_fail %4, "Unexpectedly found nil while unwrapping an Optional value"
458
+ unreachable
459
+
460
+ bb2(%7 : $X):
461
+ %8 = unchecked_take_enum_data_addr %1, #Optional.some!enumelt
462
+ end_access %1
463
+ %13 = tuple ()
464
+ return %13 : $()
465
+ }
0 commit comments