blob: 15fc8791cbfa1d950166b2cf9d487430ca24ab73 [file] [log] [blame]
// RUN: %target-sil-opt -enable-sil-verify-all %s -early-inline -sil-inline-threshold=50 | %FileCheck %s
sil_stage canonical
import Builtin
import Swift
sil [_semantics "no_inline_plz"] @callee_func : $@convention(thin) () -> Int32 {
bb0:
%0 = integer_literal $Builtin.Int32, 3
%1 = struct $Int32 (%0 : $Builtin.Int32)
return %1 : $Int32
}
//Not every @_semantics should be skipped during the early inlining pass, but
//only those ones which are explicitly listed in shouldSkipApplyDuringEarlyInlining.
//CHECK-LABEL: caller_func
//CHECK-NOT: function_ref
//CHECK-NOT: apply
//CHECK: end sil function 'caller_func'
sil @caller_func : $@convention(thin) () -> Int32 {
bb0:
%0 = function_ref @callee_func : $@convention(thin) () -> Int32
%1 = apply %0() : $@convention(thin) () -> Int32
return %1 : $Int32
}
sil [_semantics "array.make_mutable"] @callee_func_with_to_be_skipped_during_inlining_semantics : $@convention(method) (@inout Int32) -> Int32 {
bb0(%self : $*Int32):
%0 = integer_literal $Builtin.Int32, 3
%1 = struct $Int32 (%0 : $Builtin.Int32)
return %1 : $Int32
}
//Not every @_semantics should be skipped during the early inlining pass, but
//only those ones which are explicitly listed in shouldSkipApplyDuringEarlyInlining.
//CHECK-LABEL: caller_func2
//CHECK: function_ref
//CHECK: apply
//CHECK: end sil function 'caller_func2'
sil @caller_func2 : $@convention(thin) () -> Int32 {
bb0:
%self = alloc_stack $Int32
%0 = function_ref @callee_func_with_to_be_skipped_during_inlining_semantics : $@convention(method) (@inout Int32) -> Int32 // user: %1
%1 = apply %0(%self) : $@convention(method) (@inout Int32) -> Int32
dealloc_stack %self : $*Int32
return %1 : $Int32
}
sil [_semantics "pair_no_escaping_closure"] @callee_func_with_pair_no_escaping_closure_semantics : $@convention(method) (@inout Int32) -> Int32 {
bb0(%self : $*Int32):
%0 = integer_literal $Builtin.Int32, 3
%1 = struct $Int32 (%0 : $Builtin.Int32)
return %1 : $Int32
}
//CHECK-LABEL: caller_func3
//CHECK: function_ref
//CHECK: apply
//CHECK: end sil function 'caller_func3'
sil @caller_func3 : $@convention(thin) () -> Int32 {
bb0:
%self = alloc_stack $Int32
%0 = function_ref @callee_func_with_pair_no_escaping_closure_semantics : $@convention(method) (@inout Int32) -> Int32 // user: %1
%1 = apply %0(%self) : $@convention(method) (@inout Int32) -> Int32
dealloc_stack %self : $*Int32
return %1 : $Int32
}
sil [_semantics "self_no_escaping_closure"] @callee_func_with_self_no_escaping_closure_semantics : $@convention(method) (@inout Int32) -> Int32 {
bb0(%self : $*Int32):
%0 = integer_literal $Builtin.Int32, 3
%1 = struct $Int32 (%0 : $Builtin.Int32)
return %1 : $Int32
}
//CHECK-LABEL: caller_func4
//CHECK: function_ref
//CHECK: apply
//CHECK: end sil function 'caller_func4'
sil @caller_func4 : $@convention(thin) () -> Int32 {
bb0:
%self = alloc_stack $Int32
%0 = function_ref @callee_func_with_self_no_escaping_closure_semantics : $@convention(method) (@inout Int32) -> Int32 // user: %1
%1 = apply %0(%self) : $@convention(method) (@inout Int32) -> Int32
dealloc_stack %self : $*Int32
return %1 : $Int32
}
// A function annotated with the @_effects(readonly) attribute.
sil [readonly] @callee_func2 : $@convention(thin) () -> Int32 {
bb0:
%0 = integer_literal $Builtin.Int32, 3
%1 = struct $Int32 (%0 : $Builtin.Int32)
return %1 : $Int32
}
//CHECK-LABEL: caller_func1
//CHECK: function_ref
//CHECK: apply
//CHECK-NEXT: ret
sil @caller_func1 : $@convention(thin) () -> Int32 {
bb0:
%0 = function_ref @callee_func2 : $@convention(thin) () -> Int32
%1 = apply %0() : $@convention(thin) () -> Int32
return %1 : $Int32
}