@@ -115,6 +115,66 @@ bb2:
115
115
return %18 : $()
116
116
}
117
117
118
+ // CHECK-LABEL: sil @tuple_extract_in_different_block
119
+ // CHECK: bb0(%0 : $TrivialDestructor):
120
+ // CHECK-NEXT: strong_retain %0
121
+ // CHECK-NEXT: br bb1
122
+ // CHECK: bb1:
123
+ // CHECK-NEXT: strong_release %0
124
+ // CHECK: return
125
+ sil @tuple_extract_in_different_block : $@convention(thin) (@owned TrivialDestructor) -> () {
126
+ bb0(%0 : $TrivialDestructor):
127
+ %2 = integer_literal $Builtin.Word, 2
128
+ // function_ref Swift._allocateUninitializedArray <A> (Builtin.Word) -> (Swift.Array<A>, Builtin.RawPointer)
129
+ %3 = function_ref @allocArray : $@convention(thin) <τ_0_0> (Builtin.Word) -> @owned (Array<τ_0_0>, Builtin.RawPointer)
130
+ %4 = apply %3<TrivialDestructor>(%2) : $@convention(thin) <τ_0_0> (Builtin.Word) -> @owned (Array<τ_0_0>, Builtin.RawPointer)
131
+ %6 = tuple_extract %4 : $(Array<TrivialDestructor>, Builtin.RawPointer), 1
132
+ %7 = pointer_to_address %6 : $Builtin.RawPointer to $*TrivialDestructor
133
+ strong_retain %0 : $TrivialDestructor
134
+ store %0 to %7 : $*TrivialDestructor
135
+ br bb1
136
+
137
+ bb1:
138
+ %5 = tuple_extract %4 : $(Array<TrivialDestructor>, Builtin.RawPointer), 0
139
+ %13 = struct_extract %5 : $Array<TrivialDestructor>, #Array._buffer
140
+ %14 = struct_extract %13 : $_ArrayBuffer<TrivialDestructor>, #_ArrayBuffer._storage
141
+ %15 = struct_extract %14 : $_BridgeStorage<_ContiguousArrayStorageBase, _NSArrayCore>, #_BridgeStorage.rawValue
142
+ strong_release %15 : $Builtin.BridgeObject
143
+ %18 = tuple ()
144
+ return %18 : $()
145
+ }
146
+
147
+
148
+ // CHECK-LABEL: sil @multiple_tuple_extracts
149
+ // CHECK: apply
150
+ // CHECK: store
151
+ // CHECK: load
152
+ // CHECK: strong_release
153
+ // CHECK: return
154
+ sil @multiple_tuple_extracts : $@convention(thin) (@owned TrivialDestructor) -> @owned TrivialDestructor {
155
+ bb0(%0 : $TrivialDestructor):
156
+ %2 = integer_literal $Builtin.Word, 2
157
+ // function_ref Swift._allocateUninitializedArray <A> (Builtin.Word) -> (Swift.Array<A>, Builtin.RawPointer)
158
+ %3 = function_ref @allocArray : $@convention(thin) <τ_0_0> (Builtin.Word) -> @owned (Array<τ_0_0>, Builtin.RawPointer)
159
+ %4 = apply %3<TrivialDestructor>(%2) : $@convention(thin) <τ_0_0> (Builtin.Word) -> @owned (Array<τ_0_0>, Builtin.RawPointer)
160
+ %10 = tuple_extract %4 : $(Array<TrivialDestructor>, Builtin.RawPointer), 1
161
+ %11 = pointer_to_address %10 : $Builtin.RawPointer to $*TrivialDestructor
162
+ strong_retain %0 : $TrivialDestructor
163
+ store %0 to %11 : $*TrivialDestructor
164
+
165
+ %20 = tuple_extract %4 : $(Array<TrivialDestructor>, Builtin.RawPointer), 1
166
+ %21 = pointer_to_address %20 : $Builtin.RawPointer to $*TrivialDestructor
167
+ %22 = load %21 : $*TrivialDestructor
168
+
169
+ %12 = tuple_extract %4 : $(Array<TrivialDestructor>, Builtin.RawPointer), 0
170
+ %13 = struct_extract %12 : $Array<TrivialDestructor>, #Array._buffer
171
+ %14 = struct_extract %13 : $_ArrayBuffer<TrivialDestructor>, #_ArrayBuffer._storage
172
+ %15 = struct_extract %14 : $_BridgeStorage<_ContiguousArrayStorageBase, _NSArrayCore>, #_BridgeStorage.rawValue
173
+ strong_release %15 : $Builtin.BridgeObject
174
+
175
+ return %22 : $TrivialDestructor
176
+ }
177
+
118
178
// CHECK-LABEL: sil @release_dead_array_on_two_branches
119
179
// CHECK: bb0(%0 : $TrivialDestructor, %1 : $TrivialDestructor):
120
180
// CHECK-NEXT: cond_br
0 commit comments