// RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil -enable-sil-verify-all -inline -performance-constant-propagation -sil-verify-without-invalidation sil_stage canonical import Builtin import Swift import SwiftShims private class Foo { func speak() deinit init() } private class Foo2 : Foo { override func speak() deinit override init() } // static Swift.Process._argc : Swift.Int32 sil_global [serialized] @_TZvOs7Process5_argcVs5Int32 : $Int32 // globalinit_33_1BDF70FFC18749BAB495A73B459ED2F0_token5 sil_global private_external [serialized] @globalinit_33_1BDF70FFC18749BAB495A73B459ED2F0_token5 : $Builtin.Word // static Swift.Process._unsafeArgv : Swift.UnsafeMutablePointer> sil_global [serialized] @_TZvOs7Process11_unsafeArgvGVs20UnsafeMutablePointerGS0_Vs4Int8__ : $UnsafeMutablePointer> // main sil @main : $@convention(c) (Int32, UnsafeMutablePointer>) -> Int32 { bb0(%0 : $Int32, %1 : $UnsafeMutablePointer>): %2 = global_addr @_TZvOs7Process5_argcVs5Int32 : $*Int32 // user: %3 store %0 to %2 : $*Int32 // id: %3 %4 = global_addr @globalinit_33_1BDF70FFC18749BAB495A73B459ED2F0_token5 : $*Builtin.Word // user: %5 %5 = address_to_pointer %4 : $*Builtin.Word to $Builtin.RawPointer // user: %7 // function_ref globalinit_33_1BDF70FFC18749BAB495A73B459ED2F0_func5 %6 = function_ref @globalinit_33_1BDF70FFC18749BAB495A73B459ED2F0_func5 : $@convention(thin) () -> () // user: %7 %7 = builtin "once"(%5 : $Builtin.RawPointer, %6 : $@convention(thin) () -> ()) : $() %8 = global_addr @_TZvOs7Process11_unsafeArgvGVs20UnsafeMutablePointerGS0_Vs4Int8__ : $*UnsafeMutablePointer> // user: %9 store %1 to %8 : $*UnsafeMutablePointer> // id: %9 %10 = integer_literal $Builtin.Int32, 0 // user: %11 %11 = struct $Int32 (%10 : $Builtin.Int32) // user: %12 return %11 : $Int32 // id: %12 } // Swift._didEnterMain (Swift.Int32, argv : Swift.UnsafeMutablePointer>) -> () sil [transparent] [serialized] @_TFs13_didEnterMainFTVs5Int324argvGVs20UnsafeMutablePointerGS0_Vs4Int8___T_ : $@convention(thin) (Int32, UnsafeMutablePointer>) -> () // main.(Foo in _9ACC0692747077F216D14C36CD927671).speak (main.(Foo in _9ACC0692747077F216D14C36CD927671))() -> () sil private @_TFC4mainP33_9ACC0692747077F216D14C36CD9276713Foo5speakfS0_FT_T_ : $@convention(method) (@guaranteed Foo) -> () { bb0(%0 : $Foo): debug_value %0 : $Foo // id: %1 // function_ref speakFoo %2 = function_ref @speakFoo : $@convention(thin) () -> () // user: %3 %3 = apply %2() : $@convention(thin) () -> () %4 = tuple () // user: %5 return %4 : $() // id: %5 } // speakFoo sil hidden_external @speakFoo : $@convention(thin) () -> () // main.(Foo in _9ACC0692747077F216D14C36CD927671).__deallocating_deinit sil private @_TFC4mainP33_9ACC0692747077F216D14C36CD9276713FooD : $@convention(method) (@owned Foo) -> () { bb0(%0 : $Foo): debug_value %0 : $Foo // id: %1 dealloc_ref %0 : $Foo // id: %2 %3 = tuple () // user: %4 return %3 : $() // id: %4 } // main.(Foo in _9ACC0692747077F216D14C36CD927671).deinit sil private @_TFC4mainP33_9ACC0692747077F216D14C36CD9276713Food : $@convention(method) (@guaranteed Foo) -> @owned Builtin.NativeObject { bb0(%0 : $Foo): debug_value %0 : $Foo // id: %1 %2 = unchecked_ref_cast %0 : $Foo to $Builtin.NativeObject // user: %3 return %2 : $Builtin.NativeObject // id: %3 } // main.(Foo in _9ACC0692747077F216D14C36CD927671).init (main.(Foo in _9ACC0692747077F216D14C36CD927671).Type)() -> main.(Foo in _9ACC0692747077F216D14C36CD927671) sil private @_TFC4mainP33_9ACC0692747077F216D14C36CD9276713FoocfMS0_FT_S0_ : $@convention(method) (@owned Foo) -> @owned Foo { bb0(%0 : $Foo): debug_value %0 : $Foo // id: %1 return %0 : $Foo // id: %2 } // main.(Foo2 in _9ACC0692747077F216D14C36CD927671).speak (main.(Foo2 in _9ACC0692747077F216D14C36CD927671))() -> () sil private @_TFC4mainP33_9ACC0692747077F216D14C36CD9276714Foo25speakfS0_FT_T_ : $@convention(method) (@guaranteed Foo2) -> () { bb0(%0 : $Foo2): debug_value %0 : $Foo2 // id: %1 // function_ref speakFoo2 %2 = function_ref @speakFoo2 : $@convention(thin) () -> () // user: %3 %3 = apply %2() : $@convention(thin) () -> () %4 = tuple () // user: %5 return %4 : $() // id: %5 } // speakFoo2 sil hidden_external @speakFoo2 : $@convention(thin) () -> () // main.(Foo2 in _9ACC0692747077F216D14C36CD927671).__deallocating_deinit sil private @_TFC4mainP33_9ACC0692747077F216D14C36CD9276714Foo2D : $@convention(method) (@owned Foo2) -> () { bb0(%0 : $Foo2): debug_value %0 : $Foo2 // id: %1 dealloc_ref %0 : $Foo2 // id: %2 %3 = tuple () // user: %4 return %3 : $() // id: %4 } // main.(Foo2 in _9ACC0692747077F216D14C36CD927671).deinit sil private @_TFC4mainP33_9ACC0692747077F216D14C36CD9276714Foo2d : $@convention(method) (@guaranteed Foo2) -> @owned Builtin.NativeObject { bb0(%0 : $Foo2): debug_value %0 : $Foo2 // id: %1 %2 = unchecked_ref_cast %0 : $Foo2 to $Builtin.NativeObject // user: %3 return %2 : $Builtin.NativeObject // id: %3 } // main.(Foo2 in _9ACC0692747077F216D14C36CD927671).init (main.(Foo2 in _9ACC0692747077F216D14C36CD927671).Type)() -> main.(Foo2 in _9ACC0692747077F216D14C36CD927671) sil private @_TFC4mainP33_9ACC0692747077F216D14C36CD9276714Foo2cfMS0_FT_S0_ : $@convention(method) (@owned Foo2) -> @owned Foo2 { bb0(%0 : $Foo2): return %0 : $Foo2 // id: %2 } // main.(Foo2 in _9ACC0692747077F216D14C36CD927671).__allocating_init (main.(Foo2 in _9ACC0692747077F216D14C36CD927671).Type)() -> main.(Foo2 in _9ACC0692747077F216D14C36CD927671) sil private @_TFC4mainP33_9ACC0692747077F216D14C36CD9276714Foo2CfMS0_FT_S0_ : $@convention(thin) (@thick Foo2.Type) -> @owned Foo2 { bb0(%0 : $@thick Foo2.Type): %1 = alloc_ref $Foo2 // user: %3 return %1 : $Foo2 // id: %3 } // main.callSpeak () -> () sil hidden @_TF4main9callSpeakFT_T_ : $@convention(thin) () -> () { bb0: %0 = alloc_ref $Foo2 // users: %2, %3, %4, %27 debug_value %0 : $Foo2 // id: %2 strong_retain %0 : $Foo2 // id: %3 %4 = upcast %0 : $Foo2 to $Foo // users: %5, %6, %17, %23 checked_cast_br %0 : $Foo2 to $Foo2, bb1, bb6 // id: %6 bb1(%7 : $Foo2): // Preds: bb0 %8 = enum $Optional, #Optional.some!enumelt.1, %7 : $Foo2 // user: %9 br bb2(%8 : $Optional) // id: %9 bb2(%10 : $Optional): // Preds: bb1 bb6 switch_enum %10 : $Optional, case #Optional.some!enumelt.1: bb3, default bb5 // id: %11 bb3(%12 : $Foo2): // Preds: bb2 // function_ref speakFoo2 %13 = function_ref @speakFoo2 : $@convention(thin) () -> () // user: %14 %14 = apply %13() : $@convention(thin) () -> () strong_release %12 : $Foo2 // id: %15 br bb4 // id: %16 bb4: // Preds: bb3 bb5 strong_release %4 : $Foo // id: %17 %18 = tuple () // user: %19 br bb7(%18 : $()) // id: %19 bb5: // Preds: bb2 // function_ref speakFoo2 %20 = function_ref @speakFoo2 : $@convention(thin) () -> () // user: %21 %21 = apply %20() : $@convention(thin) () -> () br bb4 // id: %22 bb6: // Preds: bb0 strong_release %4 : $Foo // id: %23 %24 = enum $Optional, #Optional.none!enumelt // user: %25 br bb2(%24 : $Optional) // id: %25 bb7(%26 : $()): // Preds: bb4 strong_release %0 : $Foo2 // id: %27 %28 = tuple () // user: %29 return %28 : $() // id: %29 } // main.(speak in _9ACC0692747077F216D14C36CD927671) (main.(Foo in _9ACC0692747077F216D14C36CD927671)) -> () sil private [always_inline] @_TF4mainP33_9ACC0692747077F216D14C36CD9276715speakFCS_P33_9ACC0692747077F216D14C36CD9276713FooT_ : $@convention(thin) (@owned Foo) -> () { bb0(%0 : $Foo): debug_value %0 : $Foo // id: %1 strong_retain %0 : $Foo // id: %2 checked_cast_br %0 : $Foo to $Foo2, bb1, bb2 // id: %3 bb1(%4 : $Foo2): // Preds: bb0 %5 = enum $Optional, #Optional.some!enumelt.1, %4 : $Foo2 // user: %6 br bb3(%5 : $Optional) // id: %6 bb2: // Preds: bb0 strong_release %0 : $Foo // id: %7 %8 = enum $Optional, #Optional.none!enumelt // user: %9 br bb3(%8 : $Optional) // id: %9 bb3(%10 : $Optional): // Preds: bb1 bb2 switch_enum %10 : $Optional, case #Optional.some!enumelt.1: bb4, default bb5 // id: %11 bb4(%12 : $Foo2): // Preds: bb3 debug_value %12 : $Foo2 // id: %13 // function_ref speakFoo2 %14 = function_ref @speakFoo2 : $@convention(thin) () -> () // user: %15 %15 = apply %14() : $@convention(thin) () -> () strong_release %12 : $Foo2 // id: %16 br bb6 // id: %17 bb5: // Preds: bb3 %18 = class_method %0 : $Foo, #Foo.speak!1 : Foo -> () -> (), $@convention(method) (@guaranteed Foo) -> () // user: %19 %19 = apply %18(%0) : $@convention(method) (@guaranteed Foo) -> () br bb6 // id: %20 bb6: // Preds: bb4 bb5 strong_release %0 : $Foo // id: %21 %22 = tuple () // user: %23 return %22 : $() // id: %23 } // globalinit_33_1BDF70FFC18749BAB495A73B459ED2F0_func5 sil private_external [serialized] @globalinit_33_1BDF70FFC18749BAB495A73B459ED2F0_func5 : $@convention(thin) () -> () { bb0: %0 = global_addr @_TZvOs7Process11_unsafeArgvGVs20UnsafeMutablePointerGS0_Vs4Int8__ : $*UnsafeMutablePointer> // user: %4 %1 = integer_literal $Builtin.Int8, 0 // user: %2 %2 = builtin "inttoptr_Int8"(%1 : $Builtin.Int8) : $Builtin.RawPointer // user: %3 %3 = struct $UnsafeMutablePointer> (%2 : $Builtin.RawPointer) // user: %4 store %3 to %0 : $*UnsafeMutablePointer> // id: %4 %5 = tuple () // user: %6 return %5 : $() // id: %6 } sil_vtable Foo { #Foo.speak!1: _TFC4mainP33_9ACC0692747077F216D14C36CD9276713Foo5speakfS0_FT_T_ // main.(Foo in _9ACC0692747077F216D14C36CD927671).speak (main.(Foo in _9ACC0692747077F216D14C36CD927671))() -> () #Foo.deinit!deallocator: _TFC4mainP33_9ACC0692747077F216D14C36CD9276713FooD // main.(Foo in _9ACC0692747077F216D14C36CD927671).__deallocating_deinit #Foo.init!initializer.1: _TFC4mainP33_9ACC0692747077F216D14C36CD9276713FoocfMS0_FT_S0_ // main.(Foo in _9ACC0692747077F216D14C36CD927671).init (main.(Foo in _9ACC0692747077F216D14C36CD927671).Type)() -> main.(Foo in _9ACC0692747077F216D14C36CD927671) } sil_vtable Foo2 { #Foo.speak!1: _TFC4mainP33_9ACC0692747077F216D14C36CD9276714Foo25speakfS0_FT_T_ // main.(Foo2 in _9ACC0692747077F216D14C36CD927671).speak (main.(Foo2 in _9ACC0692747077F216D14C36CD927671))() -> () #Foo.init!initializer.1: _TFC4mainP33_9ACC0692747077F216D14C36CD9276714Foo2cfMS0_FT_S0_ // main.(Foo2 in _9ACC0692747077F216D14C36CD927671).init (main.(Foo2 in _9ACC0692747077F216D14C36CD927671).Type)() -> main.(Foo2 in _9ACC0692747077F216D14C36CD927671) #Foo2.deinit!deallocator: _TFC4mainP33_9ACC0692747077F216D14C36CD9276714Foo2D // main.(Foo2 in _9ACC0692747077F216D14C36CD927671).__deallocating_deinit }