mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
* Fix the mid-level pass pipeline. Module passes need to be in a separate pipeline, otherwise the pipeline restart mechanism will be broken. This makes GlobalOpt and serialization run earlier in the pipeline. There's no explicit reason for them to be run later, in the middle of a function pass pipeline. Also, pipeline boundaries, like serialization and module passes should be explicit at the the top level function that creates the pass pipelines. * SILOptimizer: Add enforcement of function-pass pipelines. Don't allow module passes to be inserted within a function pass pipeline. This silently breaks the function pipeline both interfering with analysis and the normal pipeline restart mechanism. * Add misssing pass in addFunctionPasses Co-authored-by: Andrew Trick <atrick@apple.com>
102 lines
5.0 KiB
Plaintext
102 lines
5.0 KiB
Plaintext
// RUN: %target-sil-opt -enable-sil-verify-all %s -O -sil-stats-modules 2>&1 | %FileCheck --check-prefix=CHECK-SIL-STATS-MODULES %s
|
|
// RUN: %target-sil-opt -enable-sil-verify-all %s -O -sil-stats-functions 2>&1 | %FileCheck --check-prefix=CHECK-SIL-STATS-FUNCTIONS %s
|
|
// RUN: %target-sil-opt -enable-sil-verify-all %s -O -sil-stats-dump-all 2>&1 | %FileCheck --check-prefix=CHECK-SIL-STATS-ALL %s
|
|
// RUN: %target-sil-opt -enable-sil-verify-all %s -O -sil-stats-modules -sil-stats-only-instructions=integer_literal,builtin 2>&1 | %FileCheck --check-prefix=CHECK-SIL-STATS-ONLY-INSTRUCTIONS %s
|
|
// RUN: %target-sil-opt -enable-sil-verify-all %s -O -sil-stats-functions -sil-stats-only-function=test_simple 2>&1 | %FileCheck --check-prefix=CHECK-SIL-STATS-ONLY-FUNCTION %s
|
|
// RUN: %target-sil-opt -enable-sil-verify-all %s -O -sil-stats-functions -sil-stats-only-functions=test 2>&1 | %FileCheck --check-prefix=CHECK-SIL-STATS-ONLY-FUNCTIONS %s
|
|
|
|
|
|
// Test different modes of optimizer counters statistics collection.
|
|
|
|
sil_stage canonical
|
|
|
|
import Builtin
|
|
import Swift
|
|
|
|
sil @fatalError : $@convention(thin) () -> Never
|
|
|
|
// Check that module level statistics are produced.
|
|
//
|
|
// CHECK-SIL-STATS-MODULES: module, inst, HighLevel,Function+EarlyLoopOpt, PerformanceConstantPropagation, {{.*}}, 15, 12
|
|
// CHECK-SIL-STATS-MODULES: module, block, HighLevel,Function+EarlyLoopOpt, SimplifyCFG, {{.*}}, 6, 3
|
|
// CHECK-SIL-STATS-MODULES: module, inst, HighLevel,Function+EarlyLoopOpt, SimplifyCFG, {{.*}}, 12, 6
|
|
|
|
// Check that module level statistics are produced.
|
|
//
|
|
// CHECK-SIL-STATS-FUNCTIONS: function_history, block,{{.*}}, test_multiply
|
|
// CHECK-SIL-STATS-FUNCTIONS: function_history, inst,{{.*}}, test_multiply
|
|
// CHECK-SIL-STATS-FUNCTIONS: function_history, block,{{.*}}, test_simple
|
|
// CHECK-SIL-STATS-FUNCTIONS: function_history, inst,{{.*}}, test_simple
|
|
// CHECK-SIL-STATS-FUNCTIONS: function_history, block,{{.*}}, another_simple_func
|
|
// CHECK-SIL-STATS-FUNCTIONS: function_history, inst,{{.*}}, another_simple_func
|
|
|
|
|
|
|
|
// Check that -sil-stats-all produces module and function level statistics.
|
|
//
|
|
// CHECK-SIL-STATS-ALL: module, block,
|
|
// CHECK-SIL-STATS-ALL: function, inst
|
|
|
|
// Check that -sil-stats-only-instructions=integer_literal,builtin produces stats about these instruction.
|
|
//
|
|
// CHECK-SIL-STATS-ONLY-INSTRUCTIONS: module, inst_integer_literal
|
|
// CHECK-SIL-STATS-ONLY-INSTRUCTIONS: module, inst_builtin
|
|
|
|
sil @test_multiply : $@convention(thin) () -> Builtin.Int64 {
|
|
bb0:
|
|
%1 = integer_literal $Builtin.Int64, 10
|
|
%2 = integer_literal $Builtin.Int1, 0
|
|
%3 = builtin "umul_with_overflow_Int64"(%1 : $Builtin.Int64, %1 : $Builtin.Int64, %2 : $Builtin.Int1) : $(Builtin.Int64, Builtin.Int1)
|
|
%4 = tuple_extract %3 : $(Builtin.Int64, Builtin.Int1), 1
|
|
cond_br %4, bb1, bb2
|
|
|
|
bb1:
|
|
%f = function_ref @fatalError : $@convention(thin) () -> Never
|
|
apply %f() : $@convention(thin) () -> Never
|
|
unreachable
|
|
|
|
bb2:
|
|
%v = tuple_extract %3 : $(Builtin.Int64, Builtin.Int1), 0
|
|
br bb3 (%v : $Builtin.Int64)
|
|
|
|
bb3(%r : $Builtin.Int64):
|
|
return %r: $Builtin.Int64
|
|
}
|
|
|
|
// Check that -sil-stats-only-function=test_simple produces stats only about test_simple
|
|
//
|
|
// CHECK-SIL-STATS-ONLY-FUNCTION-NOT: function_history, block,{{.*}}, test_multiply
|
|
// CHECK-SIL-STATS-ONLY-FUNCTION-NOT: function_history, inst,{{.*}}, test_multiply
|
|
// CHECK-SIL-STATS-ONLY-FUNCTION-NOT: function_history, block,{{.*}}, another_simple_func
|
|
// CHECK-SIL-STATS-ONLY-FUNCTION-NOT: function_history, inst,{{.*}}, another_simple_func
|
|
// CHECK-SIL-STATS-ONLY-FUNCTION: function_history, block,{{.*}}, test_simple
|
|
// CHECK-SIL-STATS-ONLY-FUNCTION: function_history, inst,{{.*}}, test_simple
|
|
// CHECK-SIL-STATS-ONLY-FUNCTION-NOT: function_history, block,{{.*}}, test_multiply
|
|
// CHECK-SIL-STATS-ONLY-FUNCTION-NOT: function_history, inst,{{.*}}, test_multiply
|
|
// CHECK-SIL-STATS-ONLY-FUNCTION-NOT: function_history, block,{{.*}}, another_simple_func
|
|
// CHECK-SIL-STATS-ONLY-FUNCTION-NOT: function_history, inst,{{.*}}, another_simple_func
|
|
|
|
sil @test_simple : $@convention(thin) () -> Builtin.Int64 {
|
|
%0 = integer_literal $Builtin.Int64, 10
|
|
return %0 : $Builtin.Int64
|
|
}
|
|
|
|
sil @another_simple_func : $@convention(thin) () -> Builtin.Int64 {
|
|
%0 = integer_literal $Builtin.Int64, 10
|
|
return %0 : $Builtin.Int64
|
|
}
|
|
|
|
// Check that -sil-stats-only-functions=test produces stats only about functions,
|
|
// whose name contains "test"
|
|
//
|
|
// CHECK-SIL-STATS-ONLY-FUNCTIONS-NOT: function_history, block,{{.*}}, another_simple_func
|
|
// CHECK-SIL-STATS-ONLY-FUNCTIONS-NOT: function_history, inst,{{.*}}, another_simple_func
|
|
// CHECK-SIL-STATS-ONLY-FUNCTIONS: function_history, block,{{.*}}, test_multiply
|
|
// CHECK-SIL-STATS-ONLY-FUNCTIONS: function_history, inst,{{.*}}, test_multiply
|
|
// CHECK-SIL-STATS-ONLY-FUNCTIONS: function_history, block,{{.*}}, test_simple
|
|
// CHECK-SIL-STATS-ONLY-FUNCTIONS: function_history, inst,{{.*}}, test_simple
|
|
// CHECK-SIL-STATS-ONLY-FUNCTIONS-NOT: function_history, block,{{.*}}, another_simple_func
|
|
// CHECK-SIL-STATS-ONLY-FUNCTIONS-NOT: function_history, inst,{{.*}}, another_simple_func
|
|
|
|
|