Files
swift-mirror/test/SILOptimizer/simplify_fix_lifetime.sil
2026-07-03 10:32:32 +02:00

141 lines
3.9 KiB
Plaintext

// RUN: %target-sil-opt %s -simplification -simplify-instruction=fix_lifetime | %FileCheck %s
import Swift
import Builtin
class C {}
struct EmptyArrayStorage { }
class ArrayStorage {}
sil_global public_external @emptyArrayStorage : $EmptyArrayStorage
// CHECK-LABEL: sil @load_from_alloc_stack :
// CHECK: %1 = alloc_stack
// CHECK-NEXT: store %0 to %1
// CHECK-NEXT: %3 = load %1
// CHECK-NEXT: fix_lifetime %3
// CHECK-NEXT: dealloc_stack %1
// CHECK: } // end sil function 'load_from_alloc_stack'
sil @load_from_alloc_stack : $@convention(thin) (@owned C) -> () {
bb0(%0: $C):
%1 = alloc_stack $C
store %0 to %1
fix_lifetime %1
dealloc_stack %1
%r = tuple ()
return %r : $()
}
// CHECK-LABEL: sil @load_from_inout :
// CHECK-NOT: load
// CHECK: fix_lifetime %0
// CHECK: } // end sil function 'load_from_inout'
sil @load_from_inout : $@convention(thin) (@inout C) -> () {
bb0(%0: $*C):
fix_lifetime %0
%r = tuple ()
return %r : $()
}
// CHECK-LABEL: sil @not_loadable :
// CHECK-NOT: load
// CHECK: fix_lifetime %1
// CHECK: } // end sil function 'not_loadable'
sil @not_loadable : $@convention(thin) <T> (@in_guaranteed T) -> () {
bb0(%0: $*T):
%1 = alloc_stack $T
copy_addr %0 to %1
fix_lifetime %1
dealloc_stack %1
%r = tuple ()
return %r : $()
}
// CHECK-LABEL: sil [ossa] @load_from_alloc_stack_ossa :
// CHECK: %1 = alloc_stack
// CHECK-NEXT: store %0 to [init] %1
// CHECK-NEXT: %3 = load_borrow %1
// CHECK-NEXT: fix_lifetime %3
// CHECK-NEXT: end_borrow %3
// CHECK-NEXT: destroy_addr %1
// CHECK-NEXT: dealloc_stack %1
// CHECK: } // end sil function 'load_from_alloc_stack_ossa'
sil [ossa] @load_from_alloc_stack_ossa : $@convention(thin) (@owned C) -> () {
bb0(%0: @owned $C):
%1 = alloc_stack $C
store %0 to [init] %1
fix_lifetime %1
destroy_addr %1
dealloc_stack %1
%r = tuple ()
return %r : $()
}
// CHECK-LABEL: sil [ossa] @load_from_store_borrow :
// CHECK: %1 = alloc_stack
// CHECK-NEXT: %2 = store_borrow %0 to %1
// CHECK-NEXT: %3 = load_borrow %2
// CHECK-NEXT: fix_lifetime %3
// CHECK-NEXT: end_borrow %3
// CHECK-NEXT: end_borrow %2
// CHECK-NEXT: dealloc_stack %1
// CHECK: } // end sil function 'load_from_store_borrow'
sil [ossa] @load_from_store_borrow : $@convention(thin) (@guaranteed C) -> () {
bb0(%0: @guaranteed $C):
%1 = alloc_stack $C
%2 = store_borrow %0 to %1
fix_lifetime %2
end_borrow %2
dealloc_stack %1
%r = tuple ()
return %r : $()
}
// CHECK-LABEL: sil [ossa] @load_trivial_from_alloc_stack :
// CHECK: %1 = alloc_stack
// CHECK-NEXT: store %0 to [trivial] %1
// CHECK-NEXT: %3 = load [trivial] %1
// CHECK-NEXT: fix_lifetime %3
// CHECK-NEXT: dealloc_stack %1
// CHECK: } // end sil function 'load_trivial_from_alloc_stack'
sil [ossa] @load_trivial_from_alloc_stack : $@convention(thin) (Int) -> () {
bb0(%0: $Int):
%1 = alloc_stack $Int
store %0 to [trivial] %1
fix_lifetime %1
dealloc_stack %1
%r = tuple ()
return %r : $()
}
// CHECK-LABEL: sil [ossa] @fix_lifetime_of_empty_array :
// CHECK-NOT: fix_lifetime
// CHECK: } // end sil function 'fix_lifetime_of_empty_array'
sil [ossa] @fix_lifetime_of_empty_array : $@convention(thin) () -> () {
bb0:
%0 = global_addr @emptyArrayStorage : $*EmptyArrayStorage
%1 = address_to_pointer [stack_protection] %0 to $Builtin.RawPointer
%2 = raw_pointer_to_ref %1 to $ArrayStorage
%3 = copy_value %2
fix_lifetime %3
destroy_value %3
%6 = tuple ()
return %6
}
// CHECK-LABEL: sil [ossa] @dont_remove_fix_lifetime_of_copy :
// CHECK: fix_lifetime
// CHECK: } // end sil function 'dont_remove_fix_lifetime_of_copy'
sil [ossa] @dont_remove_fix_lifetime_of_copy : $@convention(thin) (@guaranteed C) -> () {
bb0(%0 : @guaranteed $C):
%1 = copy_value %0
fix_lifetime %1
destroy_value %1
%r = tuple ()
return %r
}