Files
swift-mirror/test/SILOptimizer/simplify_apply.sil
Erik Eckstein 8b9f2a73d0 SimplifyApply: optimize thick calls where the callee is a thin_to_thick_function
```
   %2 = thin_to_thick_function %1
   %3 = apply %2(...) : @callee_guaranteed
 ->
   %2 = thin_to_thick_function %1
   %3 = apply %1(...): @convention(thin)
```
2023-10-27 10:47:07 +02:00

49 lines
1.4 KiB
Plaintext

// RUN: %target-sil-opt -enable-sil-verify-all %s -onone-simplification -simplify-instruction=apply | %FileCheck %s
// REQUIRES: swift_in_compiler
sil_stage canonical
import Builtin
import Swift
import SwiftShims
class Bar {
init()
func foo() -> Int
}
sil @cl : $@convention(thin) () -> Int
// CHECK-LABEL: sil [ossa] @thick_to_thin :
// CHECK: [[F:%.*]] = function_ref @cl
// CHECK: apply [[F]]() : $@convention(thin
// CHECK: } // end sil function 'thick_to_thin'
sil [ossa] @thick_to_thin : $@convention(thin) () -> Int {
bb0:
%0 = function_ref @cl : $@convention(thin) () -> Int
%1 = thin_to_thick_function %0 : $@convention(thin) () -> Int to $@callee_guaranteed () -> Int
%2 = apply %1() : $@callee_guaranteed () -> Int
return %2 : $Int
}
// CHECK-LABEL: sil @devirt_class_method :
// CHECK: [[F:%.*]] = function_ref @bar_foo
// CHECK: apply [[F]]
// CHECK: } // end sil function 'devirt_class_method'
sil @devirt_class_method : $@convention(thin) () -> Int {
bb0:
%0 = alloc_ref $Bar
%1 = class_method %0 : $Bar, #Bar.foo : (Bar) -> () -> Int, $@convention(method) (@guaranteed Bar) -> Int
%2 = apply %1(%0) : $@convention(method) (@guaranteed Bar) -> Int
strong_release %0 : $Bar
return %2 : $Int
}
sil @bar_foo : $@convention(method) (@guaranteed Bar) -> Int
sil_vtable Bar {
#Bar.foo: @bar_foo
}