@@ -16,6 +16,10 @@ class C {
1616 var a: Builtin.Int64
1717}
1818
19+ struct MOS : ~Copyable {
20+ deinit {}
21+ }
22+
1923sil [ossa] @dummy : $@convention(thin) () -> ()
2024sil [ossa] @barrier : $@convention(thin) () -> ()
2125sil [ossa] @getOwnedC : $@convention(thin) () -> (@owned C)
@@ -26,6 +30,7 @@ sil [ossa] @takeOwnedCAndGuaranteedC : $@convention(thin) (@owned C, @guaranteed
2630sil [ossa] @takeGuaranteedC : $@convention(thin) (@guaranteed C) -> ()
2731sil [ossa] @borrowB : $@convention(thin) (@guaranteed B) -> ()
2832sil [ossa] @takeGuaranteedAnyObject : $@convention(thin) (@guaranteed AnyObject) -> ()
33+ sil [ossa] @getMOS : $() -> (@owned MOS)
2934
3035// -O hoists the destroy
3136//
@@ -1047,3 +1052,23 @@ entry(%instance : @owned $C):
10471052 %retval = tuple ()
10481053 return %retval : $()
10491054}
1055+
1056+ // CHECK-LABEL: sil [ossa] @dontShortenDeadMoveOnlyLifetime : {{.*}} {
1057+ // CHECK: [[GET:%[^,]+]] = function_ref @getMOS
1058+ // CHECK: [[BARRIER:%[^,]+]] = function_ref @barrier
1059+ // CHECK: [[MOS:%[^,]+]] = apply [[GET]]()
1060+ // CHECK: [[MOV:%[^,]+]] = move_value [lexical] [[MOS]]
1061+ // CHECK: apply [[BARRIER]]()
1062+ // CHECK: destroy_value [[MOV]]
1063+ // CHECK-LABEL: } // end sil function 'dontShortenDeadMoveOnlyLifetime'
1064+ sil [ossa] @dontShortenDeadMoveOnlyLifetime : $@convention(thin) () -> () {
1065+ %get = function_ref @getMOS : $@convention(thin) () -> (@owned MOS)
1066+ %barrier = function_ref @barrier : $@convention(thin) () -> ()
1067+ %mos = apply %get() : $@convention(thin) () -> (@owned MOS)
1068+ // Note: This must be lexical so that it doesn't get eliminated as redundant.
1069+ %mov = move_value [lexical] %mos : $MOS
1070+ apply %barrier() : $@convention(thin) () -> ()
1071+ destroy_value %mov : $MOS
1072+ %retval = tuple ()
1073+ return %retval : $()
1074+ }
0 commit comments