| // RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil -O %s -emit-sil | %FileCheck %s |
| |
| // rdar://16761933 |
| // Make sure we can handle recursive function within a class that |
| // calls itself once. |
| |
| // CHECK-LABEL: @main |
| // CHECK: function_ref |
| |
| sil_stage raw |
| |
| import Builtin |
| import Swift |
| |
| class REC { |
| func recursive(a: Int) |
| } |
| |
| sil @main : $@convention(c) (Builtin.Int32, Builtin.RawPointer) -> Builtin.Int32 { |
| bb0(%c : $Builtin.Int32, %v : $Builtin.RawPointer): |
| // function_ref single.test (Swift.Int) -> () |
| %0 = function_ref @_TF6single4testFSiT_ : $@convention(thin) (Int) -> () // user: %5 |
| // function_ref Swift.Int._convertFromBuiltinIntegerLiteral (Swift.Int.Type)(Builtin.Int2048) -> Swift.Int |
| %1 = function_ref @_TFSi33_convertFromBuiltinIntegerLiteralfMSiFBi2048_Si : $@convention(thin) (Builtin.Int2048, @thin Int.Type) -> Int // user: %4 |
| %2 = metatype $@thin Int.Type // user: %4 |
| %3 = integer_literal $Builtin.Int2048, 1000 // user: %4 |
| %4 = apply %1(%3, %2) : $@convention(thin) (Builtin.Int2048, @thin Int.Type) -> Int // user: %5 |
| %5 = apply %0(%4) : $@convention(thin) (Int) -> () |
| %6 = integer_literal $Builtin.Int32, 0 |
| return %6 : $Builtin.Int32 |
| } |
| |
| // single.REC.recursive (single.REC)(Swift.Int) -> () |
| sil @_TFC6single3REC9recursivefS0_FSiT_ : $@convention(method) (Int, @guaranteed REC) -> () { |
| bb0(%0 : $Int, %1 : $REC): |
| debug_value %0 : $Int, let, name "a" // id: %2 |
| debug_value %1 : $REC, let, name "self" // id: %3 |
| // function_ref Swift.Bool._getBuiltinLogicValue (Swift.Bool)() -> Builtin.Int1 |
| %4 = function_ref @_TFSb21_getBuiltinLogicValuefSbFT_Bi1_ : $@convention(method) (Bool) -> Builtin.Int1 // user: %11 |
| // function_ref Swift.>= @infix (Swift.Int, Swift.Int) -> Swift.Bool |
| %5 = function_ref @_TFsoi2geFTSiSi_Sb : $@convention(thin) (Int, Int) -> Bool // user: %10 |
| // function_ref Swift.Int._convertFromBuiltinIntegerLiteral (Swift.Int.Type)(Builtin.Int2048) -> Swift.Int |
| %6 = function_ref @_TFSi33_convertFromBuiltinIntegerLiteralfMSiFBi2048_Si : $@convention(thin) (Builtin.Int2048, @thin Int.Type) -> Int // user: %9 |
| %7 = metatype $@thin Int.Type // user: %9 |
| %8 = integer_literal $Builtin.Int2048, 2 // user: %9 |
| %9 = apply %6(%8, %7) : $@convention(thin) (Builtin.Int2048, @thin Int.Type) -> Int // user: %10 |
| %10 = apply %5(%0, %9) : $@convention(thin) (Int, Int) -> Bool // user: %11 |
| %11 = apply %4(%10) : $@convention(method) (Bool) -> Builtin.Int1 // user: %12 |
| cond_br %11, bb1, bb2 // id: %12 |
| |
| bb1: // Preds: bb0 |
| strong_retain %1 : $REC // id: %13 |
| %14 = class_method %1 : $REC, #REC.recursive!1 : (REC) -> (Int) -> (), $@convention(method) (Int, @guaranteed REC) -> () // user: %21 |
| // function_ref Swift.- @infix (Swift.Int, Swift.Int) -> Swift.Int |
| %15 = function_ref @_TFsoi1sFTSiSi_Si : $@convention(thin) (Int, Int) -> Int // user: %20 |
| // function_ref Swift.Int._convertFromBuiltinIntegerLiteral (Swift.Int.Type)(Builtin.Int2048) -> Swift.Int |
| %16 = function_ref @_TFSi33_convertFromBuiltinIntegerLiteralfMSiFBi2048_Si : $@convention(thin) (Builtin.Int2048, @thin Int.Type) -> Int // user: %19 |
| %17 = metatype $@thin Int.Type // user: %19 |
| %18 = integer_literal $Builtin.Int2048, 2 // user: %19 |
| %19 = apply %16(%18, %17) : $@convention(thin) (Builtin.Int2048, @thin Int.Type) -> Int // user: %20 |
| %20 = apply %15(%0, %19) : $@convention(thin) (Int, Int) -> Int // user: %21 |
| %21 = apply %14(%20, %1) : $@convention(method) (Int, @guaranteed REC) -> () |
| br bb2 // id: %22 |
| |
| bb2: // Preds: bb0 bb1 |
| strong_release %1 : $REC // id: %23 |
| %24 = tuple () // user: %25 |
| return %24 : $() // id: %25 |
| } |
| |
| // Swift.Bool._getBuiltinLogicValue (Swift.Bool)() -> Builtin.Int1 |
| sil [transparent] @_TFSb21_getBuiltinLogicValuefSbFT_Bi1_ : $@convention(method) (Bool) -> Builtin.Int1 |
| |
| // Swift.>= @infix (Swift.Int, Swift.Int) -> Swift.Bool |
| sil [transparent] @_TFsoi2geFTSiSi_Sb : $@convention(thin) (Int, Int) -> Bool |
| |
| // Swift.Int._convertFromBuiltinIntegerLiteral (Swift.Int.Type)(Builtin.Int2048) -> Swift.Int |
| sil [transparent] @_TFSi33_convertFromBuiltinIntegerLiteralfMSiFBi2048_Si : $@convention(thin) (Builtin.Int2048, @thin Int.Type) -> Int |
| |
| // Swift.- @infix (Swift.Int, Swift.Int) -> Swift.Int |
| sil [transparent] @_TFsoi1sFTSiSi_Si : $@convention(thin) (Int, Int) -> Int |
| |
| // single.REC.deinit |
| sil @_TFC6single3RECd : $@convention(method) (@owned REC) -> @owned Builtin.NativeObject { |
| bb0(%0 : $REC): |
| debug_value %0 : $REC, let, name "self" // id: %1 |
| %2 = unchecked_ref_cast %0 : $REC to $Builtin.NativeObject // user: %3 |
| return %2 : $Builtin.NativeObject // id: %3 |
| } |
| |
| // single.REC.__deallocating_deinit |
| sil @_TFC6single3RECD : $@convention(method) (@owned REC) -> () { |
| bb0(%0 : $REC): |
| debug_value %0 : $REC, let, name "self" // id: %1 |
| // function_ref single.REC.deinit |
| %2 = function_ref @_TFC6single3RECd : $@convention(method) (@owned REC) -> @owned Builtin.NativeObject // user: %3 |
| %3 = apply %2(%0) : $@convention(method) (@owned REC) -> @owned Builtin.NativeObject // user: %4 |
| %4 = unchecked_ref_cast %3 : $Builtin.NativeObject to $REC // user: %5 |
| dealloc_ref %4 : $REC // id: %5 |
| %6 = tuple () // user: %7 |
| return %6 : $() // id: %7 |
| } |
| |
| // single.REC.init (single.REC.Type)() -> single.REC |
| sil @_TFC6single3RECcfMS0_FT_S0_ : $@convention(method) (@owned REC) -> @owned REC { |
| bb0(%0 : $REC): |
| debug_value %0 : $REC, let, name "self" // id: %1 |
| %2 = mark_uninitialized [rootself] %0 : $REC // user: %3 |
| return %2 : $REC // id: %3 |
| } |
| |
| // single.REC.__allocating_init (single.REC.Type)() -> single.REC |
| sil @_TFC6single3RECCfMS0_FT_S0_ : $@convention(thin) (@thick REC.Type) -> @owned REC { |
| bb0(%0 : $@thick REC.Type): |
| %1 = alloc_ref $REC // user: %3 |
| // function_ref single.REC.init (single.REC.Type)() -> single.REC |
| %2 = function_ref @_TFC6single3RECcfMS0_FT_S0_ : $@convention(method) (@owned REC) -> @owned REC // user: %3 |
| %3 = apply %2(%1) : $@convention(method) (@owned REC) -> @owned REC // user: %4 |
| return %3 : $REC // id: %4 |
| } |
| |
| // single.test (Swift.Int) -> () |
| sil @_TF6single4testFSiT_ : $@convention(thin) (Int) -> () { |
| bb0(%0 : $Int): |
| debug_value %0 : $Int, let, name "N" // id: %1 |
| // function_ref single.REC.__allocating_init (single.REC.Type)() -> single.REC |
| %2 = function_ref @_TFC6single3RECCfMS0_FT_S0_ : $@convention(thin) (@thick REC.Type) -> @owned REC // user: %4 |
| %3 = metatype $@thick REC.Type // user: %4 |
| %4 = apply %2(%3) : $@convention(thin) (@thick REC.Type) -> @owned REC // users: %5, %6, %7, %8, %9 |
| debug_value %4 : $REC, let, name "rec" // id: %5 |
| strong_retain %4 : $REC // id: %6 |
| %7 = class_method %4 : $REC, #REC.recursive!1 : (REC) -> (Int) -> (), $@convention(method) (Int, @guaranteed REC) -> () // user: %8 |
| %8 = apply %7(%0, %4) : $@convention(method) (Int, @guaranteed REC) -> () |
| strong_release %4 : $REC // id: %9 |
| %10 = tuple () // user: %11 |
| return %10 : $() // id: %11 |
| } |
| |
| sil_vtable REC { |
| #REC.recursive!1: _TFC6single3REC9recursivefS0_FSiT_ // single.REC.recursive (single.REC)(Swift.Int) -> () |
| #REC.init!initializer.1: _TFC6single3RECcfMS0_FT_S0_ // single.REC.init (single.REC.Type)() -> single.REC |
| } |