@@ -25,12 +25,29 @@ struct AggStruct {
2525 var pair: KlassPair
2626}
2727
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+
2841@_moveOnly
2942struct SingleIntContainingStruct {
3043 var value: Builtin.Int32
3144}
3245
3346sil @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) -> ()
3451
3552///////////
3653// Tests //
@@ -137,6 +154,61 @@ bb0(%0 : @guaranteed $SingleIntContainingStruct):
137154 return %5 : $Builtin.Int32
138155}
139156
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+
140212///////////////////////////////
141213// Single Field Struct Tests //
142214///////////////////////////////
0 commit comments