| // RUN: %target-sil-opt -enable-sil-ownership -enable-sil-verify-all %s -mandatory-inlining | %FileCheck %s |
| |
| sil_stage raw |
| |
| import Builtin |
| import Swift |
| |
| @_fixed_layout |
| public struct S { |
| public let y: Int |
| } |
| |
| sil_global [let] @my_global : $Int |
| |
| sil hidden [global_init] @private_function : $@convention(thin) () -> Builtin.RawPointer { |
| bb0: |
| %4 = global_addr @my_global : $*Int |
| %5 = address_to_pointer %4 : $*Int to $Builtin.RawPointer |
| return %5 : $Builtin.RawPointer |
| } |
| |
| // This function is transparent, but not serialized. We cannot inline it into |
| // serialized_caller. |
| sil [transparent] @transparent_callee : $@convention(thin) () -> Int { |
| bb0: |
| %0 = function_ref @private_function : $@convention(thin) () -> Builtin.RawPointer |
| %1 = apply %0() : $@convention(thin) () -> Builtin.RawPointer |
| %2 = pointer_to_address %1 : $Builtin.RawPointer to [strict] $*Int |
| %3 = load [trivial] %2 : $*Int |
| return %3 : $Int |
| } |
| |
| // CHECK-LABEL: sil [serialized] @serialized_callee |
| sil [serialized] @serialized_callee : $@convention(method) (@thin S.Type) -> S { |
| bb0(%0 : @trivial $@thin S.Type): |
| %1 = alloc_box ${ var S }, var, name "self" |
| %2 = mark_uninitialized [rootself] %1 : ${ var S } |
| %3 = project_box %2 : ${ var S }, 0 |
| // CHECK: function_ref @transparent_callee |
| %4 = function_ref @transparent_callee : $@convention(thin) () -> Int |
| %5 = apply %4() : $@convention(thin) () -> Int |
| %6 = struct_element_addr %3 : $*S, #S.y |
| assign %5 to %6 : $*Int |
| %8 = load [trivial] %3 : $*S |
| destroy_value %2 : ${ var S } |
| // CHECK: return |
| return %8 : $S |
| } |
| |