Files
swift-mirror/test/SILOptimizer/devirt_override.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

136 lines
3.8 KiB
Plaintext

// RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil -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_
}