mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
I am doing this separately from the actual change to eliminate the option to make it easier to review.
136 lines
3.8 KiB
Plaintext
136 lines
3.8 KiB
Plaintext
// RUN: %target-sil-opt -enable-sil-verify-all %s -inline -devirtualizer | %FileCheck %s
|
|
|
|
sil_stage canonical
|
|
|
|
import Builtin
|
|
import Swift
|
|
|
|
class Hash {
|
|
func update()
|
|
func hash()
|
|
}
|
|
|
|
class MD5 : Hash {
|
|
override init()
|
|
override func hash()
|
|
}
|
|
|
|
|
|
sil @_TFC4test3MD5cfMS0_FT_S0_ : $@convention(method) (@owned MD5) -> @owned MD5 {
|
|
bb0(%0 : $MD5):
|
|
release_value %0 : $MD5
|
|
return %0 : $MD5
|
|
}
|
|
|
|
sil @_TFC4test3MD54hashfS0_FT3MsgVs5UInt8_T_ : $@convention(method) (@guaranteed MD5) -> ()
|
|
sil @_TFC4test4Hash4hashfS0_FT3MsgVs5UInt8_T_ : $@convention(method) (@guaranteed Hash) -> ()
|
|
sil @_TFC9hash2_new4Hash6updatefS0_FT3MsgVs5UInt83CntSi_T_ : $@convention(method) (@guaranteed Hash) -> ()
|
|
|
|
// CHECK-LABEL: @_TF4test8testHashFT_T_
|
|
sil @_TF4test8testHashFT_T_ : $@convention(thin) () -> () {
|
|
bb0:
|
|
%0 = alloc_ref $MD5
|
|
|
|
%1 = function_ref @_TFC4test3MD5cfMS0_FT_S0_ : $@convention(method) (@owned MD5) -> @owned MD5
|
|
%2 = apply %1(%0) : $@convention(method) (@owned MD5) -> @owned MD5
|
|
strong_retain %2 : $MD5
|
|
%69 = upcast %2 : $MD5 to $Hash
|
|
strong_retain %69 : $Hash
|
|
// CHECK: function_ref @_TFC4test3MD54hashfS0_FT3MsgVs5UInt8_T_ : $@convention(method) (@guaranteed MD5) -> ()
|
|
// CHECK: apply {{%[0-9]+}}({{%[0-9]+}}) : $@convention(method) (@guaranteed MD5) -> ()
|
|
%134 = class_method %69 : $Hash, #Hash.hash!1 : (Hash) -> () -> (), $@convention(method) (@guaranteed Hash) -> ()
|
|
%135 = apply %134(%69) : $@convention(method) (@guaranteed Hash) -> ()
|
|
strong_release %2 : $MD5
|
|
%17 = tuple ()
|
|
return %17 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: @test_unchecked_ref
|
|
sil @test_unchecked_ref : $@convention(thin) () -> () {
|
|
bb0:
|
|
%0 = alloc_ref $MD5
|
|
%11 = upcast %0 : $MD5 to $Hash
|
|
%21 = unchecked_ref_cast %11 : $Hash to $MD5
|
|
%61 = upcast %21 : $MD5 to $Hash
|
|
// CHECK: function_ref @_TFC9hash2_new4Hash6updatefS0_FT3MsgVs5UInt83CntSi_T_ : $@convention(method) (@guaranteed Hash) -> ()
|
|
// CHECK: apply {{%[0-9]+}}({{%[0-9]+}}) : $@convention(method) (@guaranteed Hash) -> ()
|
|
%62 = class_method %61 : $Hash, #Hash.update!1 : (Hash) -> () -> (), $@convention(method) (@guaranteed Hash) -> ()
|
|
%135 = apply %62(%61) : $@convention(method) (@guaranteed Hash) -> ()
|
|
%17 = tuple ()
|
|
// CHECK: return
|
|
return %17 : $()
|
|
}
|
|
|
|
sil_vtable Hash {
|
|
#Hash.update!1: @_TFC9hash2_new4Hash6updatefS0_FT3MsgVs5UInt83CntSi_T_
|
|
#Hash.hash!1: @_TFC4test4Hash4hashfS0_FT3MsgVs5UInt8_T_
|
|
}
|
|
|
|
sil_vtable MD5 {
|
|
// vtable should be keyed with the least-derived method, otherwise
|
|
// devirtualizer will choose the wrong function ref.
|
|
#Hash.hash!1: @_TFC4test3MD54hashfS0_FT3MsgVs5UInt8_T_
|
|
#MD5.init!initializer.1: @_TFC4test3MD5cfMS0_FT_S0_
|
|
#Hash.update!1: @_TFC9hash2_new4Hash6updatefS0_FT3MsgVs5UInt83CntSi_T_
|
|
}
|
|
|
|
class C {
|
|
func doIt()
|
|
}
|
|
|
|
class D : C {
|
|
override func doIt()
|
|
}
|
|
|
|
class E : D {
|
|
override func doIt()
|
|
}
|
|
|
|
// CHECK-LABEL: sil @_TFC1b1C4doItfS0_FT_T_
|
|
sil @_TFC1b1C4doItfS0_FT_T_ : $@convention(method) (@guaranteed C) -> () {
|
|
bb0(%0 : $C):
|
|
%2 = tuple ()
|
|
return %2 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil @_TFC1b1D4doItfS0_FT_T_
|
|
sil @_TFC1b1D4doItfS0_FT_T_ : $@convention(method) (@guaranteed D) -> () {
|
|
bb0(%0 : $D):
|
|
%2 = tuple ()
|
|
return %2 : $()
|
|
}
|
|
|
|
|
|
// CHECK-LABEL: sil @_TFC1b1E4doItfS0_FT_T_
|
|
sil @_TFC1b1E4doItfS0_FT_T_ : $@convention(method) (@guaranteed E) -> () {
|
|
bb0(%0 : $E):
|
|
%2 = tuple ()
|
|
return %2 : $()
|
|
}
|
|
|
|
|
|
// CHECK-LABEL: sil @_TF1b3fooFT_T_
|
|
sil @_TF1b3fooFT_T_ : $@convention(thin) () -> () {
|
|
bb0:
|
|
%0 = alloc_ref $E
|
|
%1 = upcast %0 : $E to $C
|
|
%2 = unconditional_checked_cast %1 : $C to $D
|
|
%3 = class_method %2 : $D, #D.doIt!1 : (D) -> () -> (), $@convention(method) (@guaranteed D) -> ()
|
|
%4 = apply %3(%2) : $@convention(method) (@guaranteed D) -> ()
|
|
%5 = tuple ()
|
|
// CHECK: return
|
|
return %5 : $()
|
|
}
|
|
|
|
sil_vtable C {
|
|
#C.doIt!1: @_TFC1b1C4doItfS0_FT_T_
|
|
}
|
|
|
|
sil_vtable D {
|
|
#C.doIt!1: @_TFC1b1D4doItfS0_FT_T_
|
|
}
|
|
|
|
sil_vtable E {
|
|
#C.doIt!1: @_TFC1b1E4doItfS0_FT_T_
|
|
}
|