mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
to check for improperly nested '@_semantic' functions.
Add a missing @_semantics("array.init") in ArraySlice found by the
diagnostic.
Distinguish between array.init and array.init.empty.
Categorize the types of semantic functions by how they affect the
inliner and pass pipeline, and centralize this logic in
PerformanceInlinerUtils. The ultimate goal is to prevent inlining of
"Fundamental" @_semantics calls and @_effects calls until the late
pipeline where we can safely discard semantics. However, that requires
significant pipeline changes.
In the meantime, this change prevents the situation from getting worse
and makes the intention clear. However, it has no significant effect
on the pass pipeline and inliner.
65 lines
1.9 KiB
Plaintext
65 lines
1.9 KiB
Plaintext
// 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
|
|
}
|
|
|
|
//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
|
|
}
|
|
|
|
//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
|
|
}
|
|
|
|
// 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
|
|
}
|
|
|