| // RUN: %empty-directory(%t) |
| // RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil -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 -assume-parsing-unqualified-ownership-sil -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 -assume-parsing-unqualified-ownership-sil -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: |