@@ -66,15 +66,12 @@ struct Small {
6666// CHECK: bb0:
6767// CHECK: %0 = alloc_stack $Optional<X>
6868// 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
7472// 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>
7875// CHECK: dealloc_stack %1 : $*X
7976// CHECK: dealloc_stack %0 : $*Optional<X>
8077// CHECK: } // end sil function 'test1'
9289 return %t : $()
9390}
9491
92+ sil @useX : $@convention(thin) (X) -> ()
93+
9594// CHECK: sil @test2 : $@convention(thin) () -> () {
9695// CHECK: bb0:
9796// CHECK: %0 = alloc_stack $Optional<X>
98- // CHECK: %1 = alloc_stack $Optional<X>
97+ // CHECK: %1 = alloc_stack $X
9998// 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
103101
104102// 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) -> ()
106107// CHECK: br bb3
107108
108109// CHECK: bb2:
109110// CHECK: br bb3
110111
111112// CHECK: bb3:
112113// CHECK: dealloc_stack %2 : $*Optional<X>
113- // CHECK: dealloc_stack %1 : $*Optional<X>
114+ // CHECK: dealloc_stack %1 : $*X
114115// CHECK: dealloc_stack %0 : $*Optional<X>
115116// CHECK: } // end sil function 'test2'
116117
121122 switch_enum %2 : $Optional<X>, case #Optional.some!enumelt: bb1, case #Optional.none!enumelt: bb2
122123
123124bb1(%3: $X):
125+ %f = function_ref @useX : $@convention(thin) (X) -> ()
126+ apply %f(%3) : $@convention(thin) (X) -> ()
124127 br bb3
125128
126129bb2:
@@ -184,11 +187,9 @@ bb0:
184187
185188// CHECK: sil @test5 : $@convention(thin) (@in (X, X)) -> () {
186189// 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
192193// CHECK: } // end sil function 'test5'
193194
194195sil @test5 : $@convention(thin) (@in (X, X)) -> () {
@@ -231,11 +232,9 @@ bb0:
231232
232233// CHECK: sil @test7 : $@convention(thin) (@in Y) -> () {
233234// 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
239238// CHECK: } // end sil function 'test7'
240239
241240sil @test7 : $@convention(thin) (@in Y) -> () {
339338}
340339
341340// 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
344343// CHECK: } // end sil function 'test13'
345344sil @test13 : $@convention(thin) (@in X) -> () {
346345bb0(%0 : $*X):
@@ -443,3 +442,24 @@ bb0(%0 : $String):
443442 %13 = tuple ()
444443 return %13 : $()
445444}
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