mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Specifically, do not perform the early inlining for functions annotated with @_semantics("pair_no_escaping_closure") and @_semantics("self_no_escaping_closure")
Add new tests and cleanup some tests.
It recovers from the performance regression that was recently introduced.
Fixes rdar://32555803
111 lines
3.7 KiB
Plaintext
111 lines
3.7 KiB
Plaintext
// RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil -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
|
|
}
|
|
|