Files
swift-mirror/test/SILOptimizer/inline_caches.sil
Roman Levenstein 8ad61d5cd6 Use function signatures for SILDeclRefs in witness_tables, vtables and witness_method instructions.
Textual SIL was sometimes ambiguous when SILDeclRefs were used, because the textual representation of SILDeclRefs was the same for functions that have the same name, but different signatures.
2017-01-27 12:16:14 -08:00

75 lines
2.4 KiB
Plaintext

// RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil -enable-sil-verify-all %s -specdevirt -code-sinking | %FileCheck %s
sil_stage canonical
import Builtin
import Swift
// Make sure we convert a class_method into a diamond control flow
// where one of the sides is a direct call to FOO::ping.
class Foo {
func ping()
}
sil @_TFC8testcase3Foo4pingfS0_FT_T_ : $@convention(method) (@guaranteed Foo) -> ()
sil @_TFC8testcase3FoocfMS0_FT_S0_ : $@convention(method) (@owned Foo) -> @owned Foo
sil @_TF8testcase7my_mainFCS_3FooT_ : $@convention(thin) (@owned Foo) -> () {
bb0(%0 : $Foo):
//CHECK: checked_cast_br [exact] %0 : $Foo to $Foo
//CHECK: function_ref @_TFC8testcase3Foo4pingfS0_FT_T_
//CHECK: apply
//CHECK: class_method
//CHECK-NEXT: apply
%1 = class_method %0 : $Foo, #Foo.ping!1 : (Foo) -> () -> (), $@convention(method) (@guaranteed Foo) -> () // user: %2
%2 = apply %1(%0) : $@convention(method) (@guaranteed Foo) -> ()
%3 = tuple () // user: %4
return %3 : $() // id: %4
}
sil_vtable Foo {
#Foo.ping!1: _TFC8testcase3Foo4pingfS0_FT_T_ // testcase.Foo.ping (testcase.Foo)() -> ()
#Foo.init!initializer.1: _TFC8testcase3FoocfMS0_FT_S0_ // testcase.Foo.init (testcase.Foo.Type)() -> testcase.Foo
}
class C {
class func foo()
class func bar()
}
// CHECK-LABEL: sil @_TZFC4spec1C3foofMS0_FT_T_
sil @_TZFC4spec1C3foofMS0_FT_T_ : $@convention(method) (@thick C.Type) -> () {
bb0(%0 : $@thick C.Type):
%2 = tuple ()
return %2 : $()
}
// CHECK-LABEL: sil @_TZFC4spec1C3barfMS0_FT_T_
sil @_TZFC4spec1C3barfMS0_FT_T_ : $@convention(method) (@thick C.Type) -> () {
// CHECK: bb0
bb0(%0 : $@thick C.Type):
// CHECK-NOT: class_method
// CHECK: checked_cast_br [exact] %0 : $@thick C.Type to $@thick C.Type, bb2, bb3
// CHECK: bb1
// CHECK: return
// CHECK: bb2
// CHECK: [[REF:%.*]] = function_ref @_TZFC4spec1C3foofMS0_FT_T_
// CHECK: apply [[REF]]
// CHECK: br bb1
// CHECK: bb3
// CHECK: [[METHOD:%.*]] = class_method %0 : $@thick C.Type, #C.foo!1 : (C.Type) -> () -> (), $@convention(method) (@thick C.Type) -> ()
// CHECK: apply [[METHOD]]
%2 = class_method %0 : $@thick C.Type, #C.foo!1 : (C.Type) -> () -> (), $@convention(method) (@thick C.Type) -> ()
%3 = apply %2(%0) : $@convention(method) (@thick C.Type) -> ()
%4 = tuple ()
return %4 : $()
}
sil_vtable C {
#C.foo!1: _TZFC4spec1C3foofMS0_FT_T_
#C.bar!1: _TZFC4spec1C3barfMS0_FT_T_
}