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

109 lines
5.1 KiB
Plaintext

// RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil -enable-sil-verify-all %s -inline -specdevirt -code-sinking -sil-verify-without-invalidation
sil_stage canonical
import Builtin
import Swift
public class Foo {
deinit
func doSomething() -> Foo
init()
}
public class Foo2 : Foo {
deinit
override func doSomething() -> Foo
override init()
}
// test.Foo.doSomething (test.Foo)() -> test.Foo
sil hidden_external @_TFC4test3Foo11doSomethingfS0_FT_S0_ : $@convention(method) (@guaranteed Foo) -> @owned Foo
// test.Foo.init (test.Foo.Type)() -> test.Foo
sil hidden_external @_TFC4test3FoocfMS0_FT_S0_ : $@convention(method) (@owned Foo) -> @owned Foo
// test.Foo2.doSomething (test.Foo2)() -> test.Foo
sil hidden @_TFC4test4Foo211doSomethingfS0_FT_CS_3Foo : $@convention(method) (@guaranteed Foo2) -> @owned Foo {
bb0(%0 : $Foo2):
debug_value %0 : $Foo2 // id: %1
strong_retain %0 : $Foo2 // id: %2
%3 = upcast %0 : $Foo2 to $Foo // user: %4
return %3 : $Foo // id: %4
}
// test.Foo2.__deallocating_deinit
sil @_TFC4test4Foo2D : $@convention(method) (@owned Foo2) -> () {
bb0(%0 : $Foo2):
debug_value %0 : $Foo2 // id: %1
%2 = upcast %0 : $Foo2 to $Foo // user: %4
// function_ref test.Foo.deinit
%3 = function_ref @_TFC4test3Food : $@convention(method) (@guaranteed Foo) -> @owned Builtin.NativeObject // user: %4
%4 = apply %3(%2) : $@convention(method) (@guaranteed Foo) -> @owned Builtin.NativeObject // user: %5
%5 = unchecked_ref_cast %4 : $Builtin.NativeObject to $Foo2 // user: %6
dealloc_ref %5 : $Foo2 // id: %6
%7 = tuple () // user: %8
return %7 : $() // id: %8
}
// test.Foo2.deinit
sil @_TFC4test4Foo2d : $@convention(method) (@guaranteed Foo2) -> @owned Builtin.NativeObject {
bb0(%0 : $Foo2):
debug_value %0 : $Foo2 // id: %1
%2 = upcast %0 : $Foo2 to $Foo // user: %4
// function_ref test.Foo.deinit
%3 = function_ref @_TFC4test3Food : $@convention(method) (@guaranteed Foo) -> @owned Builtin.NativeObject // user: %4
%4 = apply %3(%2) : $@convention(method) (@guaranteed Foo) -> @owned Builtin.NativeObject // user: %5
return %4 : $Builtin.NativeObject // id: %5
}
// test.Foo.deinit
sil @_TFC4test3Food : $@convention(method) (@guaranteed Foo) -> @owned Builtin.NativeObject
// test.Foo2.init (test.Foo2.Type)() -> test.Foo2
sil hidden @_TFC4test4Foo2cfMS0_FT_S0_ : $@convention(method) (@owned Foo2) -> @owned Foo2 {
bb0(%0 : $Foo2):
%1 = alloc_stack $Foo2 // users: %2, %6, %9, %10
store %0 to %1 : $*Foo2 // id: %2
%3 = upcast %0 : $Foo2 to $Foo // user: %7
// function_ref test.Foo.init (test.Foo.Type)() -> test.Foo
%4 = function_ref @_TFC4test3FoocfMS0_FT_S0_ : $@convention(method) (@owned Foo) -> @owned Foo // user: %7
%7 = apply %4(%3) : $@convention(method) (@owned Foo) -> @owned Foo // user: %8
%8 = unchecked_ref_cast %7 : $Foo to $Foo2 // users: %9, %11
store %8 to %1 : $*Foo2 // id: %9
dealloc_stack %1 : $*Foo2 // id: %10
return %8 : $Foo2 // id: %11
}
// test.Foo2.__allocating_init (test.Foo2.Type)() -> test.Foo2
sil hidden @_TFC4test4Foo2CfMS0_FT_S0_ : $@convention(thin) (@thick Foo2.Type) -> @owned Foo2 {
bb0(%0 : $@thick Foo2.Type):
%1 = alloc_ref $Foo2 // users: %3, %4
%2 = alloc_stack $Foo2 // users: %3, %7, %10, %11
store %1 to %2 : $*Foo2 // id: %3
%4 = upcast %1 : $Foo2 to $Foo // user: %8
// function_ref test.Foo.init (test.Foo.Type)() -> test.Foo
%5 = function_ref @_TFC4test3FoocfMS0_FT_S0_ : $@convention(method) (@owned Foo) -> @owned Foo // user: %8
%8 = apply %5(%4) : $@convention(method) (@owned Foo) -> @owned Foo // user: %9
%9 = unchecked_ref_cast %8 : $Foo to $Foo2 // users: %10, %12
store %9 to %2 : $*Foo2 // id: %10
dealloc_stack %2 : $*Foo2 // id: %11
return %9 : $Foo2 // id: %12
}
// test.main (test.Foo) -> test.Foo
sil hidden @_TF4test4mainFCS_3FooS0_ : $@convention(thin) (@owned Foo) -> @owned Foo {
bb0(%0 : $Foo):
debug_value %0 : $Foo // id: %1
%2 = class_method %0 : $Foo, #Foo.doSomething!1 : (Foo) -> () -> Foo, $@convention(method) (@guaranteed Foo) -> @owned Foo // user: %3
%3 = apply %2(%0) : $@convention(method) (@guaranteed Foo) -> @owned Foo // user: %5
strong_release %0 : $Foo // id: %4
return %3 : $Foo // id: %5
}
sil_vtable Foo2 {
#Foo.doSomething!1: _TFC4test4Foo211doSomethingfS0_FT_CS_3Foo // test.Foo2.doSomething (test.Foo2)() -> test.Foo
#Foo.init!initializer.1: _TFC4test4Foo2cfMS0_FT_S0_ // test.Foo2.init (test.Foo2.Type)() -> test.Foo2
#Foo2.deinit!deallocator: _TFC4test4Foo2D // test.Foo2.__deallocating_deinit
}