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

143 lines
7.6 KiB
Plaintext

// 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
}