@@ -339,3 +339,86 @@ bb4:
339339 return %res : $()
340340}
341341
342+ struct TestStruct {
343+ var val:Klass
344+ var index:Int
345+ }
346+
347+ // CHECK-LABEL: sil [ossa] @dce_destructurenotfullydead :
348+ // CHECK-NOT: copy_value
349+ // CHECK-LABEL: } // end sil function 'dce_destructurenotfullydead'
350+ sil [ossa] @dce_destructurenotfullydead : $@convention(thin) (@owned TestStruct) -> Int {
351+ bb0(%0 : @owned $TestStruct):
352+ %stk = alloc_stack $TestStruct
353+ store %0 to [init] %stk : $*TestStruct
354+ %copy = load [take] %stk : $*TestStruct
355+ (%2, %3) = destructure_struct %copy : $TestStruct
356+ %4 = struct $TestStruct (%2 : $Klass, %3 : $Int)
357+ destroy_value %4 : $TestStruct
358+ dealloc_stack %stk : $*TestStruct
359+ return %3 : $Int
360+ }
361+
362+ // CHECK-LABEL: sil [ossa] @dce_borrowlifetime1 :
363+ // CHECK: bb1([[ARG1:%.*]] : @owned $NonTrivialStruct, [[ARG2:%.*]] : @guaranteed $NonTrivialStruct):
364+ // CHECK-LABEL: } // end sil function 'dce_borrowlifetime1'
365+ sil [ossa] @dce_borrowlifetime1 : $@convention(thin) (@guaranteed NonTrivialStruct) -> @owned NonTrivialStruct {
366+ bb0(%0 : @guaranteed $NonTrivialStruct):
367+ %copy = copy_value %0 : $NonTrivialStruct
368+ %borrow = begin_borrow %copy : $NonTrivialStruct
369+ br bb1(%copy : $NonTrivialStruct, %borrow : $NonTrivialStruct)
370+
371+ bb1(%copy2 : @owned $NonTrivialStruct, %borrow2 : @guaranteed $NonTrivialStruct):
372+ %newcopy = copy_value %borrow2 : $NonTrivialStruct
373+ end_borrow %borrow2 : $NonTrivialStruct
374+ destroy_value %copy2 : $NonTrivialStruct
375+ return %newcopy : $NonTrivialStruct
376+ }
377+
378+ // CHECK-LABEL: sil [ossa] @infinite_loop :
379+ // CHECK-NOT: copy_value
380+ // CHECK-LABEL: } // end sil function 'infinite_loop'
381+ sil [ossa] @infinite_loop : $@convention(thin) (@guaranteed NonTrivialStruct, @guaranteed NonTrivialStruct) -> () {
382+ bb0(%0 : @guaranteed $NonTrivialStruct, %1 : @guaranteed $NonTrivialStruct):
383+ cond_br undef, bb1, bb4
384+
385+ bb1:
386+ %copy0 = copy_value %0 : $NonTrivialStruct
387+ %borrow0 = begin_borrow %copy0 : $NonTrivialStruct
388+ br bb3(%borrow0 : $NonTrivialStruct, %copy0 : $NonTrivialStruct)
389+
390+ bb3(%newborrow : @guaranteed $NonTrivialStruct, %newowned : @owned $NonTrivialStruct):
391+ br bb3(%newborrow : $NonTrivialStruct, %newowned : $NonTrivialStruct)
392+
393+ bb4:
394+ %ret = tuple ()
395+ return %ret : $()
396+ }
397+
398+ // CHECK-LABEL: sil [ossa] @dce_reborrow_with_different_basevalues :
399+ // CHECK: bb3([[ARG1:%.*]] : @guaranteed $NonTrivialStruct, [[ARG2:%.*]] : @owned $NonTrivialStruct, [[ARG3:%.*]] : @owned $NonTrivialStruct):
400+ // CHECK-LABEL: } // end sil function 'dce_reborrow_with_different_basevalues'
401+ sil [ossa] @dce_reborrow_with_different_basevalues : $@convention(thin) (@guaranteed NonTrivialStruct, @guaranteed NonTrivialStruct) -> @owned NonTrivialStruct {
402+ bb0(%0 : @guaranteed $NonTrivialStruct, %1 : @guaranteed $NonTrivialStruct):
403+ cond_br undef, bb1, bb2
404+
405+ bb1:
406+ %copy0a = copy_value %0 : $NonTrivialStruct
407+ %borrow0a = begin_borrow %copy0a : $NonTrivialStruct
408+ %copy1a = copy_value %1 : $NonTrivialStruct
409+ br bb3(%borrow0a : $NonTrivialStruct, %copy0a : $NonTrivialStruct, %copy1a : $NonTrivialStruct)
410+
411+ bb2:
412+ %copy1b = copy_value %1 : $NonTrivialStruct
413+ %borrow0b = begin_borrow %copy1b : $NonTrivialStruct
414+ %copy0b = copy_value %0 : $NonTrivialStruct
415+ br bb3(%borrow0b : $NonTrivialStruct, %copy0b : $NonTrivialStruct, %copy1b : $NonTrivialStruct)
416+
417+ bb3(%newborrow : @guaranteed $NonTrivialStruct, %newowned1 : @owned $NonTrivialStruct, %newowned2 : @owned $NonTrivialStruct):
418+ %res = copy_value %newborrow : $NonTrivialStruct
419+ end_borrow %newborrow : $NonTrivialStruct
420+ destroy_value %newowned1 : $NonTrivialStruct
421+ destroy_value %newowned2 : $NonTrivialStruct
422+ return %res : $NonTrivialStruct
423+ }
424+
0 commit comments