blob: cd2402bc8352ffbea0499abc9f9a522d05d594c0 [file] [log] [blame]
// RUN: %empty-directory(%t)
// RUN: %target-sil-opt -enable-sil-verify-all %s -inline -sil-remarks=sil-inliner -o %t.sil 2>&1 | %FileCheck -check-prefix=REMARKS_PASSED %s
// RUN: %FileCheck %s < %t.sil
// RUN: %target-sil-opt -enable-sil-verify-all %s -inline -sil-remarks-missed=sil-inliner -o /dev/null 2>&1 | %FileCheck -check-prefix=REMARKS_MISSED %s
// RUN: %target-sil-opt -enable-sil-verify-all %s -inline -save-optimization-record-path %t.yaml -o /dev/null 2>&1 | %FileCheck -allow-empty -check-prefix=NO_REMARKS %s
// RUN: %FileCheck -check-prefix=YAML %s < %t.yaml
// REMARKS_PASSED-NOT: remark:
// REMARKS_MISSED-NOT: remark:
// NO_REMARKS-NOT: remark:
sil_stage canonical
import Builtin
import Swift
import SwiftShims
sil_global public @sil_global1 : $Builtin.Int32
sil @update_global: $@convention(thin) () -> () {
bb0:
%sil_global1_addr = global_addr @sil_global1 : $*Builtin.Int32
%1 = integer_literal $Builtin.Int32, 1
store %1 to %sil_global1_addr : $*Builtin.Int32
%4 = tuple ()
return %4 : $()
}
sil @callee : $@convention(thin) () -> () {
bb0:
// make it a non-trivial function
%c1 = builtin "assert_configuration"() : $Builtin.Int32
%c2 = builtin "assert_configuration"() : $Builtin.Int32
%c3 = builtin "assert_configuration"() : $Builtin.Int32
%c4 = builtin "assert_configuration"() : $Builtin.Int32
%c5 = builtin "assert_configuration"() : $Builtin.Int32
%c6 = builtin "assert_configuration"() : $Builtin.Int32
%c7 = builtin "assert_configuration"() : $Builtin.Int32
%c8 = builtin "assert_configuration"() : $Builtin.Int32
%c9 = builtin "assert_configuration"() : $Builtin.Int32
%c10 = builtin "assert_configuration"() : $Builtin.Int32
%c11 = builtin "assert_configuration"() : $Builtin.Int32
%c12 = builtin "assert_configuration"() : $Builtin.Int32
%c13 = builtin "assert_configuration"() : $Builtin.Int32
%c14 = builtin "assert_configuration"() : $Builtin.Int32
%c15 = builtin "assert_configuration"() : $Builtin.Int32
%c16 = builtin "assert_configuration"() : $Builtin.Int32
%c17 = builtin "assert_configuration"() : $Builtin.Int32
%c18 = builtin "assert_configuration"() : $Builtin.Int32
%c19 = builtin "assert_configuration"() : $Builtin.Int32
%c20 = builtin "assert_configuration"() : $Builtin.Int32
%r = tuple ()
return %r : $()
}
// CHECK-LABEL: sil @inline_into_hotblock
// CHECK: builtin
// CHECK: builtin
// CHECK: return
sil @inline_into_hotblock : $@convention(thin) () -> () {
bb0:
%i1 = integer_literal $Builtin.Int1, -1
%ex = builtin "int_expect_Int1"(undef : $Builtin.Int1, %i1 : $Builtin.Int1) : $Builtin.Int1
cond_br %ex, bb1, bb2
bb1:
%f = function_ref @callee : $@convention(thin) () -> ()
%a = apply %f() : $@convention(thin) () -> ()
br bb2
bb2:
%r = tuple ()
return %r : $()
}
// CHECK-LABEL: sil @dont_inline_into_coldblock__simple
// CHECK: function_ref
// CHECK: apply
// CHECK: return
sil @dont_inline_into_coldblock__simple : $@convention(thin) () -> () {
bb0:
%i0 = integer_literal $Builtin.Int1, 0
%ex = builtin "int_expect_Int1"(undef : $Builtin.Int1, %i0 : $Builtin.Int1) : $Builtin.Int1
cond_br %ex, bb1, bb2
bb1:
%f = function_ref @callee : $@convention(thin) () -> ()
%a = apply %f() : $@convention(thin) () -> ()
br bb2
bb2:
%r = tuple ()
return %r : $()
}
// CHECK-LABEL: sil @dont_inline_into_coldblock__condition_is_arg__simple
// CHECK: function_ref
// CHECK: apply
// CHECK: return
sil @dont_inline_into_coldblock__condition_is_arg__simple : $@convention(thin) () -> () {
bb0:
%i0 = integer_literal $Builtin.Int1, 0
%i1 = integer_literal $Builtin.Int1, -1
%ex = builtin "int_expect_Int1"(undef : $Builtin.Int1, %i1 : $Builtin.Int1) : $Builtin.Int1
cond_br %ex, bb1, bb2
bb1:
br bb3(%i0 : $Builtin.Int1)
bb2:
br bb3(%i1 : $Builtin.Int1)
bb3(%c : $Builtin.Int1):
cond_br %c, bb4, bb5
bb4:
%f = function_ref @callee : $@convention(thin) () -> ()
%a = apply %f() : $@convention(thin) () -> ()
br bb5
bb5:
%r = tuple ()
return %r : $()
}
// CHECK-LABEL: sil @dont_inline_into_coldblock__condition_is_arg__complex
// CHECK: function_ref
// CHECK: apply
// CHECK: return
sil @dont_inline_into_coldblock__condition_is_arg__complex : $@convention(thin) () -> () {
bb0:
%i0 = integer_literal $Builtin.Int1, 0
%i1 = integer_literal $Builtin.Int1, -1
%ex = builtin "int_expect_Int1"(undef : $Builtin.Int1, %i1 : $Builtin.Int1) : $Builtin.Int1
cond_br %ex, bb1, bb4
bb1:
cond_br undef, bb2, bb3
bb2:
br bb5(%i0 : $Builtin.Int1)
bb3:
br bb5(%i0 : $Builtin.Int1)
bb4:
br bb5(%i1 : $Builtin.Int1)
bb5(%c : $Builtin.Int1):
cond_br %c, bb6, bb7
bb6:
%f = function_ref @callee : $@convention(thin) () -> ()
%a = apply %f() : $@convention(thin) () -> ()
br bb7
bb7:
%r = tuple ()
return %r : $()
}
sil @regular_large_callee : $@convention(thin) () -> () {
bb0:
// make it a "large" function
%c1 = builtin "assert_configuration"() : $Builtin.Int32
%c2 = builtin "assert_configuration"() : $Builtin.Int32
%c3 = builtin "assert_configuration"() : $Builtin.Int32
%c4 = builtin "assert_configuration"() : $Builtin.Int32
%c5 = builtin "assert_configuration"() : $Builtin.Int32
%c6 = builtin "assert_configuration"() : $Builtin.Int32
%c7 = builtin "assert_configuration"() : $Builtin.Int32
%c8 = builtin "assert_configuration"() : $Builtin.Int32
%c9 = builtin "assert_configuration"() : $Builtin.Int32
%c10 = builtin "assert_configuration"() : $Builtin.Int32
%c11 = builtin "assert_configuration"() : $Builtin.Int32
%c12 = builtin "assert_configuration"() : $Builtin.Int32
%c13 = builtin "assert_configuration"() : $Builtin.Int32
%c14 = builtin "assert_configuration"() : $Builtin.Int32
%c15 = builtin "assert_configuration"() : $Builtin.Int32
%c16 = builtin "assert_configuration"() : $Builtin.Int32
%c17 = builtin "assert_configuration"() : $Builtin.Int32
%c18 = builtin "assert_configuration"() : $Builtin.Int32
%c19 = builtin "assert_configuration"() : $Builtin.Int32
%c20 = builtin "assert_configuration"() : $Builtin.Int32
%c21 = builtin "assert_configuration"() : $Builtin.Int32
%c22 = builtin "assert_configuration"() : $Builtin.Int32
%c23 = builtin "assert_configuration"() : $Builtin.Int32
%c25 = builtin "assert_configuration"() : $Builtin.Int32
%c26 = builtin "assert_configuration"() : $Builtin.Int32
%c27 = builtin "assert_configuration"() : $Builtin.Int32
%c28 = builtin "assert_configuration"() : $Builtin.Int32
%c29 = builtin "assert_configuration"() : $Builtin.Int32
%c30 = builtin "assert_configuration"() : $Builtin.Int32
%f = function_ref @update_global: $@convention(thin) () -> ()
// REMARKS_PASSED: inliner_coldblocks.sil:223:3: remark: "update_global" inlined into "regular_large_callee" (cost = {{.*}}, benefit = {{.*}})
// YAML: --- !Passed
// YAML-NEXT: Pass: sil-inliner
// YAML-NEXT: Name: sil.Inlined
// YAML-NEXT: DebugLoc:
// YAML-NEXT: File: {{.*}}inliner_coldblocks.sil
// YAML-NEXT: Line: 223
// YAML-NEXT: Column: 3
// YAML-NEXT: Function: regular_large_callee
// YAML-NEXT: Args:
// YAML-NEXT: - Callee: '"update_global"'
// YAML-NEXT: DebugLoc:
// YAML-NEXT: File: {{.*}}inliner_coldblocks.sil
// YAML-NEXT: Line: 20
// YAML-NEXT: Column: 6
// YAML-NEXT: - String: ' inlined into '
// YAML-NEXT: - Caller: '"regular_large_callee"'
// YAML-NEXT: DebugLoc:
// YAML-NEXT: File: {{.*}}inliner_coldblocks.sil
// YAML-NEXT: Line: 162
// YAML-NEXT: Column: 6
// YAML-NEXT: - String: ' (cost = '
// YAML-NEXT: - Cost: '{{.*}}'
// YAML-NEXT: - String: ', benefit = '
// YAML-NEXT: - Benefit: '{{.*}}'
// YAML-NEXT: - String: ')'
// YAML-NEXT: ...
apply %f() : $@convention(thin) () -> ()
%r = tuple ()
return %r : $()
}
// CHECK-LABEL: sil @dont_inline_regular_large_callee
// CHECK: function_ref
// CHECK: apply
// CHECK: return
sil @dont_inline_regular_large_callee : $@convention(thin) () -> () {
bb0:
%f = function_ref @regular_large_callee : $@convention(thin) () -> ()
// REMARKS_MISSED: inliner_coldblocks.sil:258:8: remark: Not profitable to inline function "regular_large_callee" (cost = {{.*}}, benefit = {{.*}})
// YAML: --- !Missed
// YAML-NEXT: Pass: sil-inliner
// YAML-NEXT: Name: sil.NoInlinedCost
// YAML-NEXT: DebugLoc:
// YAML-NEXT: File: {{.*}}inliner_coldblocks.sil
// YAML-NEXT: Line: 258
// YAML-NEXT: Column: 8
// YAML-NEXT: Function: dont_inline_regular_large_callee
// YAML-NEXT: Args:
// YAML-NEXT: - String: 'Not profitable to inline function '
// YAML-NEXT: - Callee: '"regular_large_callee"'
// YAML-NEXT: DebugLoc:
// YAML-NEXT: File: {{.*}}inliner_coldblocks.sil
// YAML-NEXT: Line: 162
// YAML-NEXT: Column: 6
// YAML-NEXT: - String: ' (cost = '
// YAML-NEXT: - Cost: '{{.*}}'
// YAML-NEXT: - String: ', benefit = '
// YAML-NEXT: - Benefit: '{{.*}}'
// YAML-NEXT: - String: ')'
// YAML-NEXT: ...
%a = apply %f() : $@convention(thin) () -> ()
%r = tuple ()
return %r : $()
}
sil @large_callee_on_fast_path : $@convention(thin) () -> () {
bb0:
%f = builtin "onFastPath"() : $()
// make it a "large" function
%c1 = builtin "assert_configuration"() : $Builtin.Int32
%c2 = builtin "assert_configuration"() : $Builtin.Int32
%c3 = builtin "assert_configuration"() : $Builtin.Int32
%c4 = builtin "assert_configuration"() : $Builtin.Int32
%c5 = builtin "assert_configuration"() : $Builtin.Int32
%c6 = builtin "assert_configuration"() : $Builtin.Int32
%c7 = builtin "assert_configuration"() : $Builtin.Int32
%c8 = builtin "assert_configuration"() : $Builtin.Int32
%c9 = builtin "assert_configuration"() : $Builtin.Int32
%c10 = builtin "assert_configuration"() : $Builtin.Int32
%c11 = builtin "assert_configuration"() : $Builtin.Int32
%c12 = builtin "assert_configuration"() : $Builtin.Int32
%c13 = builtin "assert_configuration"() : $Builtin.Int32
%c14 = builtin "assert_configuration"() : $Builtin.Int32
%c15 = builtin "assert_configuration"() : $Builtin.Int32
%c16 = builtin "assert_configuration"() : $Builtin.Int32
%c17 = builtin "assert_configuration"() : $Builtin.Int32
%c18 = builtin "assert_configuration"() : $Builtin.Int32
%c19 = builtin "assert_configuration"() : $Builtin.Int32
%c20 = builtin "assert_configuration"() : $Builtin.Int32
%c21 = builtin "assert_configuration"() : $Builtin.Int32
%c22 = builtin "assert_configuration"() : $Builtin.Int32
%c23 = builtin "assert_configuration"() : $Builtin.Int32
%c25 = builtin "assert_configuration"() : $Builtin.Int32
%c26 = builtin "assert_configuration"() : $Builtin.Int32
%c27 = builtin "assert_configuration"() : $Builtin.Int32
%c28 = builtin "assert_configuration"() : $Builtin.Int32
%c29 = builtin "assert_configuration"() : $Builtin.Int32
%c30 = builtin "assert_configuration"() : $Builtin.Int32
%r = tuple ()
return %r : $()
}
// CHECK-LABEL: sil @inline_large_callee_on_fast_path
// CHECK: builtin
// CHECK-NOT: apply
// CHECK: return
sil @inline_large_callee_on_fast_path : $@convention(thin) () -> () {
bb0:
%f = function_ref @large_callee_on_fast_path : $@convention(thin) () -> ()
%a = apply %f() : $@convention(thin) () -> ()
%r = tuple ()
return %r : $()
}
// REMARKS_PASSED-NOT: remark:
// REMARKS_MISSED-NOT: remark: