@@ -25,12 +25,29 @@ struct AggStruct {
25
25
var pair: KlassPair
26
26
}
27
27
28
+ @_moveOnly
29
+ struct KlassPair2 {
30
+ var lhs: MoveOnlyKlass
31
+ var rhs: MoveOnlyKlass
32
+ }
33
+
34
+ @_moveOnly
35
+ struct AggStruct2 {
36
+ var lhs: MoveOnlyKlass
37
+ var pair: KlassPair2
38
+ var rhs: MoveOnlyKlass
39
+ }
40
+
28
41
@_moveOnly
29
42
struct SingleIntContainingStruct {
30
43
var value: Builtin.Int32
31
44
}
32
45
33
46
sil @misc_use : $@convention(thin) () -> ()
47
+ sil @aggstruct_consume : $@convention(thin) (@owned AggStruct) -> ()
48
+ sil @moveonlyklass_consume : $@convention(thin) (@owned MoveOnlyKlass) -> ()
49
+ sil @moveonlyklass_use : $@convention(thin) (@guaranteed MoveOnlyKlass) -> ()
50
+ sil @klass_use : $@convention(thin) (@guaranteed Klass) -> ()
34
51
35
52
///////////
36
53
// Tests //
@@ -137,6 +154,61 @@ bb0(%0 : @guaranteed $SingleIntContainingStruct):
137
154
return %5 : $Builtin.Int32
138
155
}
139
156
157
+ // CHECK-LABEL: sil [ossa] @phis_are_cleaned_up : $@convention(thin) (@owned AggStruct2) -> () {
158
+ // CHECK: bb3([[FIRST_PHI:%.*]] : @owned $MoveOnlyKlass, [[SECOND_PHI:%.*]] : @owned $MoveOnlyKlass, [[THIRD_PHI:%.*]] : @owned $MoveOnlyKlass):
159
+ // CHECK: destroy_value [[SECOND_PHI]]
160
+ // CHECK: destroy_value [[THIRD_PHI]]
161
+ // CHECK: apply {{%.*}}([[FIRST_PHI]])
162
+ // CHECK: destroy_value [[FIRST_PHI]]
163
+ // CHECK: } // end sil function 'phis_are_cleaned_up'
164
+ sil [ossa] @phis_are_cleaned_up : $@convention(thin) (@owned AggStruct2) -> () {
165
+ bb0(%0 : @owned $AggStruct2):
166
+ %1 = move_value [lexical] %0 : $AggStruct2
167
+ %2 = mark_must_check [no_implicit_copy] %1 : $AggStruct2
168
+ debug_value %2 : $AggStruct2, let, name "x2", argno 1
169
+ cond_br undef, bb1, bb2
170
+
171
+ bb1:
172
+ %8 = begin_borrow %2 : $AggStruct2
173
+ %9 = struct_extract %8 : $AggStruct2, #AggStruct2.pair
174
+ %10 = copy_value %9 : $KlassPair2
175
+ %11 = begin_borrow %10 : $KlassPair2
176
+ %12 = struct_extract %11 : $KlassPair2, #KlassPair2.rhs
177
+ %13 = copy_value %12 : $MoveOnlyKlass
178
+ end_borrow %11 : $KlassPair2
179
+ destroy_value %10 : $KlassPair2
180
+ %16 = function_ref @moveonlyklass_consume : $@convention(thin) (@owned MoveOnlyKlass) -> ()
181
+ %17 = apply %16(%13) : $@convention(thin) (@owned MoveOnlyKlass) -> ()
182
+ end_borrow %8 : $AggStruct2
183
+ br bb3
184
+
185
+ bb2:
186
+ %20 = begin_borrow %2 : $AggStruct2
187
+ %21 = struct_extract %20 : $AggStruct2, #AggStruct2.pair
188
+ %22 = copy_value %21 : $KlassPair2
189
+ %23 = begin_borrow %22 : $KlassPair2
190
+ %24 = struct_extract %23 : $KlassPair2, #KlassPair2.rhs
191
+ %25 = copy_value %24 : $MoveOnlyKlass
192
+ end_borrow %23 : $KlassPair2
193
+ destroy_value %22 : $KlassPair2
194
+ %28 = function_ref @moveonlyklass_consume : $@convention(thin) (@owned MoveOnlyKlass) -> ()
195
+ %29 = apply %28(%25) : $@convention(thin) (@owned MoveOnlyKlass) -> ()
196
+ end_borrow %20 : $AggStruct2
197
+ br bb3
198
+
199
+ bb3:
200
+ %32 = begin_borrow %2 : $AggStruct2
201
+ %33 = struct_extract %32 : $AggStruct2, #AggStruct2.lhs
202
+ %34 = copy_value %33 : $MoveOnlyKlass
203
+ %35 = function_ref @moveonlyklass_use : $@convention(thin) (@guaranteed MoveOnlyKlass) -> ()
204
+ %36 = apply %35(%34) : $@convention(thin) (@guaranteed MoveOnlyKlass) -> ()
205
+ destroy_value %34 : $MoveOnlyKlass
206
+ end_borrow %32 : $AggStruct2
207
+ destroy_value %2 : $AggStruct2
208
+ %39 = tuple ()
209
+ return %39 : $()
210
+ }
211
+
140
212
///////////////////////////////
141
213
// Single Field Struct Tests //
142
214
///////////////////////////////
0 commit comments