mirror of
https://github.com/apple/swift.git
synced 2026-09-30 10:17:34 +02:00
141 lines
3.9 KiB
Plaintext
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
|
|
}
|
|
|