| |
| // RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil -array-element-propagation %s | %FileCheck %s |
| sil_stage canonical |
| |
| import Builtin |
| import Swift |
| |
| struct MyInt { |
| @sil_stored var _value: Builtin.Int64 |
| } |
| |
| struct MyBool {} |
| struct _MyDependenceToken {} |
| |
| struct _MyBridgeStorage { |
| @sil_stored var rawValue : Builtin.BridgeObject |
| } |
| |
| struct _MyArrayBuffer<T> { |
| @sil_stored var _storage : _MyBridgeStorage |
| } |
| |
| |
| struct MyArray<T> { |
| @sil_stored var _buffer : _MyArrayBuffer<T> |
| } |
| |
| sil @swift_bufferAllocate : $@convention(thin)() -> @owned AnyObject |
| sil [_semantics "array.uninitialized"] @adoptStorage : $@convention(thin) (@owned AnyObject, MyInt, @thin MyArray<MyInt>.Type) -> @owned (MyArray<MyInt>, UnsafeMutablePointer<MyInt>) |
| sil [_semantics "array.props.isNativeTypeChecked"] @hoistableIsNativeTypeChecked : $@convention(method) (@guaranteed MyArray<MyInt>) -> MyBool |
| sil [_semantics "array.check_subscript"] @checkSubscript : $@convention(method) (MyInt, MyBool, @guaranteed MyArray<MyInt>) -> _MyDependenceToken |
| sil [_semantics "array.get_element"] @getElement : $@convention(method) (MyInt, MyBool, _MyDependenceToken, @guaranteed MyArray<MyInt>) -> @out MyInt |
| sil [_semantics "array.get_element"] @getElement2 : $@convention(method) (MyInt, MyBool, _MyDependenceToken, @guaranteed MyArray<MyInt>) -> MyInt |
| sil @unknown_array_use : $@convention(method) (@guaranteed MyArray<MyInt>) -> MyBool |
| sil [_semantics "array.uninitialized"] @arrayAdoptStorage : $@convention(thin) (@owned AnyObject, MyInt, @thin Array<MyInt>.Type) -> @owned (Array<MyInt>, UnsafeMutablePointer<MyInt>) |
| sil @arrayInit : $@convention(method) (@thin Array<MyInt>.Type) -> @owned Array<MyInt> |
| sil [_semantics "array.append_contentsOf"] @arrayAppendContentsOf : $@convention(method) (@owned Array<MyInt>, @inout Array<MyInt>) -> () |
| |
| // CHECK-LABEL: sil @propagate01 |
| // CHECK: struct $MyInt |
| // CHECK: [[V0:%.*]] = integer_literal $Builtin.Int64, 0 |
| // CHECK: [[I0:%.*]] = struct $MyInt ([[V0]] : $Builtin.Int64) |
| // CHECK: [[V1:%.*]] = integer_literal $Builtin.Int64, 1 |
| // CHECK: [[I1:%.*]] = struct $MyInt ([[V1]] : $Builtin.Int64) |
| // CHECK: [[V2:%.*]] = integer_literal $Builtin.Int64, 2 |
| // CHECK: [[I2:%.*]] = struct $MyInt ([[V2]] : $Builtin.Int64) |
| // CHECK: [[S0:%.*]] = alloc_stack $MyInt |
| // CHECK: [[HFUN:%.*]] = function_ref @hoistableIsNativeTypeChecked |
| // CHECK-NOT: apply [[HFUN]] |
| // CHECK: [[CFUN:%.*]] = function_ref @checkSubscript |
| // CHECK-NOT: apply [[CFUN]] |
| // CHECK: [[GFUN:%.*]] = function_ref @getElement |
| // CHECK-NOT: apply [[GFUN]] |
| // CHECK-NOT: apply [[HFUN]] |
| // CHECK-NOT: apply [[CFUN]] |
| // CHECK-NOT: apply [[GFUN]] |
| // CHECK: store [[I0]] to [[S0]] |
| // CHECK: [[S1:%.*]] = alloc_stack $MyInt |
| // CHECK: store [[I1]] to [[S1]] |
| // CHECK: [[S2:%.*]] = alloc_stack $MyInt |
| // CHECK: store [[I2]] to [[S2]] |
| // CHECK: return |
| |
| sil @propagate01 : $@convention(thin) () -> () { |
| %0 = function_ref @swift_bufferAllocate : $@convention(thin) () -> @owned AnyObject |
| %1 = integer_literal $Builtin.Int64, 3 |
| %2 = struct $MyInt (%1 : $Builtin.Int64) |
| %3 = apply %0() : $@convention(thin) () -> @owned AnyObject |
| %4 = metatype $@thin MyArray<MyInt>.Type |
| %5 = function_ref @adoptStorage : $@convention(thin) (@owned AnyObject, MyInt, @thin MyArray<MyInt>.Type) -> @owned (MyArray<MyInt>, UnsafeMutablePointer<MyInt>) |
| %6 = apply %5(%3, %2, %4) : $@convention(thin) (@owned AnyObject, MyInt, @thin MyArray<MyInt>.Type) -> @owned (MyArray<MyInt>, UnsafeMutablePointer<MyInt>) |
| %7 = tuple_extract %6 : $(MyArray<MyInt>, UnsafeMutablePointer<MyInt>), 0 |
| %8 = tuple_extract %6 : $(MyArray<MyInt>, UnsafeMutablePointer<MyInt>), 1 |
| debug_value %7 : $MyArray<MyInt> |
| debug_value %8 : $UnsafeMutablePointer<MyInt> |
| %9 = struct_extract %8 : $UnsafeMutablePointer<MyInt>, #UnsafeMutablePointer._rawValue |
| %10 = pointer_to_address %9 : $Builtin.RawPointer to [strict] $*MyInt |
| %11 = integer_literal $Builtin.Int64, 0 |
| %12 = struct $MyInt (%11 : $Builtin.Int64) |
| store %12 to %10 : $*MyInt |
| %13 = integer_literal $Builtin.Word, 1 |
| %14 = index_addr %10 : $*MyInt, %13 : $Builtin.Word |
| %15 = integer_literal $Builtin.Int64, 1 |
| %16 = struct $MyInt (%15 : $Builtin.Int64) |
| store %16 to %14 : $*MyInt |
| %17 = integer_literal $Builtin.Word, 2 |
| %18 = index_addr %10 : $*MyInt, %17 : $Builtin.Word |
| %19 = integer_literal $Builtin.Int64, 2 |
| %20 = struct $MyInt (%19 : $Builtin.Int64) |
| store %20 to %18 : $*MyInt |
| %23 = struct_extract %7 : $MyArray<MyInt>, #MyArray._buffer |
| %24 = struct_extract %23 : $_MyArrayBuffer<MyInt>, #_MyArrayBuffer._storage |
| %25 = struct_extract %24 : $_MyBridgeStorage, #_MyBridgeStorage.rawValue |
| %26 = alloc_stack $MyInt |
| debug_value %7 : $MyArray<MyInt> |
| %27 = function_ref @hoistableIsNativeTypeChecked : $@convention(method) (@guaranteed MyArray<MyInt>) -> MyBool |
| %28 = apply %27(%7) : $@convention(method) (@guaranteed MyArray<MyInt>) -> MyBool |
| debug_value %28 : $MyBool // id: %104 |
| %29 = function_ref @checkSubscript : $@convention(method) (MyInt, MyBool, @guaranteed MyArray<MyInt>) -> _MyDependenceToken |
| %30 = apply %29(%12, %28, %7) : $@convention(method) (MyInt, MyBool, @guaranteed MyArray<MyInt>) -> _MyDependenceToken |
| debug_value %30 : $_MyDependenceToken |
| %31 = function_ref @getElement : $@convention(method) (MyInt, MyBool, _MyDependenceToken, @guaranteed MyArray<MyInt>) -> @out MyInt |
| %32 = apply %31(%26, %12, %28, %30, %7) : $@convention(method) (MyInt, MyBool, _MyDependenceToken, @guaranteed MyArray<MyInt>) -> @out MyInt |
| %35 = alloc_stack $MyInt |
| debug_value %16 : $MyInt |
| debug_value %7 : $MyArray<MyInt> |
| debug_value %28 : $MyBool |
| strong_retain %25 : $Builtin.BridgeObject |
| %36 = apply %29(%16, %28, %7) : $@convention(method) (MyInt, MyBool, @guaranteed MyArray<MyInt>) -> _MyDependenceToken |
| debug_value %36 : $_MyDependenceToken |
| %37 = apply %31(%35, %16, %28, %36, %7) : $@convention(method) (MyInt, MyBool, _MyDependenceToken, @guaranteed MyArray<MyInt>) -> @out MyInt |
| strong_release %25 : $Builtin.BridgeObject |
| %44 = alloc_stack $MyInt |
| debug_value %7 : $MyArray<MyInt> |
| debug_value %28 : $MyBool |
| strong_retain %25 : $Builtin.BridgeObject |
| %45 = apply %29(%20, %28, %7) : $@convention(method) (MyInt, MyBool, @guaranteed MyArray<MyInt>) -> _MyDependenceToken |
| debug_value %45 : $_MyDependenceToken |
| %46 = apply %31(%44, %20, %28, %45, %7) : $@convention(method) (MyInt, MyBool, _MyDependenceToken, @guaranteed MyArray<MyInt>) -> @out MyInt |
| strong_release %25 : $Builtin.BridgeObject |
| %52 = tuple () |
| dealloc_stack %44 : $*MyInt |
| dealloc_stack %35 : $*MyInt |
| dealloc_stack %26 : $*MyInt |
| strong_release %25 : $Builtin.BridgeObject |
| return %52 : $() |
| } |
| |
| // CHECK-LABEL: sil @propagate_with_get_element_returning_direct_result |
| // CHECK: struct $MyInt |
| // CHECK: [[V0:%.*]] = integer_literal $Builtin.Int64, 0 |
| // CHECK: [[I0:%.*]] = struct $MyInt ([[V0]] : $Builtin.Int64) |
| // CHECK: [[V1:%.*]] = integer_literal $Builtin.Int64, 1 |
| // CHECK: [[I1:%.*]] = struct $MyInt ([[V1]] : $Builtin.Int64) |
| // CHECK: [[V2:%.*]] = integer_literal $Builtin.Int64, 2 |
| // CHECK: [[I2:%.*]] = struct $MyInt ([[V2]] : $Builtin.Int64) |
| // CHECK: [[S0:%.*]] = alloc_stack $MyInt |
| // CHECK: [[HFUN:%.*]] = function_ref @hoistableIsNativeTypeChecked |
| // CHECK-NOT: apply [[HFUN]] |
| // CHECK: [[CFUN:%.*]] = function_ref @checkSubscript |
| // CHECK-NOT: apply [[CFUN]] |
| // CHECK: [[GFUN:%.*]] = function_ref @getElement |
| // CHECK-NOT: apply [[GFUN]] |
| // CHECK-NOT: apply [[HFUN]] |
| // CHECK-NOT: apply [[CFUN]] |
| // CHECK-NOT: apply [[GFUN]] |
| // CHECK: store [[I0]] to [[S0]] |
| // CHECK: [[S1:%.*]] = alloc_stack $MyInt |
| // CHECK: store [[I1]] to [[S1]] |
| // CHECK: [[S2:%.*]] = alloc_stack $MyInt |
| // CHECK: store [[I2]] to [[S2]] |
| // CHECK: return |
| |
| sil @propagate_with_get_element_returning_direct_result : $@convention(thin) () -> () { |
| %0 = function_ref @swift_bufferAllocate : $@convention(thin) () -> @owned AnyObject |
| %1 = integer_literal $Builtin.Int64, 3 |
| %2 = struct $MyInt (%1 : $Builtin.Int64) |
| %3 = apply %0() : $@convention(thin) () -> @owned AnyObject |
| %4 = metatype $@thin MyArray<MyInt>.Type |
| %5 = function_ref @adoptStorage : $@convention(thin) (@owned AnyObject, MyInt, @thin MyArray<MyInt>.Type) -> @owned (MyArray<MyInt>, UnsafeMutablePointer<MyInt>) |
| %6 = apply %5(%3, %2, %4) : $@convention(thin) (@owned AnyObject, MyInt, @thin MyArray<MyInt>.Type) -> @owned (MyArray<MyInt>, UnsafeMutablePointer<MyInt>) |
| %7 = tuple_extract %6 : $(MyArray<MyInt>, UnsafeMutablePointer<MyInt>), 0 |
| %8 = tuple_extract %6 : $(MyArray<MyInt>, UnsafeMutablePointer<MyInt>), 1 |
| debug_value %7 : $MyArray<MyInt> |
| debug_value %8 : $UnsafeMutablePointer<MyInt> |
| %9 = struct_extract %8 : $UnsafeMutablePointer<MyInt>, #UnsafeMutablePointer._rawValue |
| %10 = pointer_to_address %9 : $Builtin.RawPointer to [strict] $*MyInt |
| %11 = integer_literal $Builtin.Int64, 0 |
| %12 = struct $MyInt (%11 : $Builtin.Int64) |
| store %12 to %10 : $*MyInt |
| %13 = integer_literal $Builtin.Word, 1 |
| %14 = index_addr %10 : $*MyInt, %13 : $Builtin.Word |
| %15 = integer_literal $Builtin.Int64, 1 |
| %16 = struct $MyInt (%15 : $Builtin.Int64) |
| store %16 to %14 : $*MyInt |
| %17 = integer_literal $Builtin.Word, 2 |
| %18 = index_addr %10 : $*MyInt, %17 : $Builtin.Word |
| %19 = integer_literal $Builtin.Int64, 2 |
| %20 = struct $MyInt (%19 : $Builtin.Int64) |
| store %20 to %18 : $*MyInt |
| %23 = struct_extract %7 : $MyArray<MyInt>, #MyArray._buffer |
| %24 = struct_extract %23 : $_MyArrayBuffer<MyInt>, #_MyArrayBuffer._storage |
| %25 = struct_extract %24 : $_MyBridgeStorage, #_MyBridgeStorage.rawValue |
| %26 = alloc_stack $MyInt |
| debug_value %7 : $MyArray<MyInt> |
| %27 = function_ref @hoistableIsNativeTypeChecked : $@convention(method) (@guaranteed MyArray<MyInt>) -> MyBool |
| %28 = apply %27(%7) : $@convention(method) (@guaranteed MyArray<MyInt>) -> MyBool |
| debug_value %28 : $MyBool // id: %104 |
| %29 = function_ref @checkSubscript : $@convention(method) (MyInt, MyBool, @guaranteed MyArray<MyInt>) -> _MyDependenceToken |
| %30 = apply %29(%12, %28, %7) : $@convention(method) (MyInt, MyBool, @guaranteed MyArray<MyInt>) -> _MyDependenceToken |
| debug_value %30 : $_MyDependenceToken |
| %31 = function_ref @getElement2 : $@convention(method) (MyInt, MyBool, _MyDependenceToken, @guaranteed MyArray<MyInt>) -> MyInt |
| %32 = apply %31(%12, %28, %30, %7) : $@convention(method) (MyInt, MyBool, _MyDependenceToken, @guaranteed MyArray<MyInt>) -> MyInt |
| store %32 to %26 : $*MyInt |
| %35 = alloc_stack $MyInt |
| debug_value %16 : $MyInt |
| debug_value %7 : $MyArray<MyInt> |
| debug_value %28 : $MyBool |
| strong_retain %25 : $Builtin.BridgeObject |
| %36 = apply %29(%16, %28, %7) : $@convention(method) (MyInt, MyBool, @guaranteed MyArray<MyInt>) -> _MyDependenceToken |
| debug_value %36 : $_MyDependenceToken |
| %37 = apply %31(%16, %28, %36, %7) : $@convention(method) (MyInt, MyBool, _MyDependenceToken, @guaranteed MyArray<MyInt>) -> MyInt |
| store %37 to %35 : $*MyInt |
| strong_release %25 : $Builtin.BridgeObject |
| %44 = alloc_stack $MyInt |
| debug_value %7 : $MyArray<MyInt> |
| debug_value %28 : $MyBool |
| strong_retain %25 : $Builtin.BridgeObject |
| %45 = apply %29(%20, %28, %7) : $@convention(method) (MyInt, MyBool, @guaranteed MyArray<MyInt>) -> _MyDependenceToken |
| debug_value %45 : $_MyDependenceToken |
| %46 = apply %31(%20, %28, %45, %7) : $@convention(method) (MyInt, MyBool, _MyDependenceToken, @guaranteed MyArray<MyInt>) -> MyInt |
| store %46 to %44 : $*MyInt |
| strong_release %25 : $Builtin.BridgeObject |
| %52 = tuple () |
| dealloc_stack %44 : $*MyInt |
| dealloc_stack %35 : $*MyInt |
| dealloc_stack %26 : $*MyInt |
| strong_release %25 : $Builtin.BridgeObject |
| return %52 : $() |
| } |
| |
| // CHECK-LABEL: sil @repeated_initialization |
| // CHECK: [[GFUN:%.*]] = function_ref @getElement |
| // CHECK: apply [[GFUN]] |
| // CHECK: apply [[GFUN]] |
| // CHECK: return |
| |
| sil @repeated_initialization : $@convention(thin) () -> () { |
| %0 = function_ref @swift_bufferAllocate : $@convention(thin) () -> @owned AnyObject |
| %1 = integer_literal $Builtin.Int64, 2 |
| %2 = struct $MyInt (%1 : $Builtin.Int64) |
| %3 = apply %0() : $@convention(thin) () -> @owned AnyObject |
| %4 = metatype $@thin MyArray<MyInt>.Type |
| %5 = function_ref @adoptStorage : $@convention(thin) (@owned AnyObject, MyInt, @thin MyArray<MyInt>.Type) -> @owned (MyArray<MyInt>, UnsafeMutablePointer<MyInt>) |
| %6 = apply %5(%3, %2, %4) : $@convention(thin) (@owned AnyObject, MyInt, @thin MyArray<MyInt>.Type) -> @owned (MyArray<MyInt>, UnsafeMutablePointer<MyInt>) |
| %7 = tuple_extract %6 : $(MyArray<MyInt>, UnsafeMutablePointer<MyInt>), 0 |
| %8 = tuple_extract %6 : $(MyArray<MyInt>, UnsafeMutablePointer<MyInt>), 1 |
| %9 = struct_extract %8 : $UnsafeMutablePointer<MyInt>, #UnsafeMutablePointer._rawValue |
| %10 = pointer_to_address %9 : $Builtin.RawPointer to [strict] $*MyInt |
| %11 = integer_literal $Builtin.Int64, 0 |
| %12 = struct $MyInt (%11 : $Builtin.Int64) |
| store %12 to %10 : $*MyInt |
| %13 = integer_literal $Builtin.Word, 0 |
| %14 = index_addr %10 : $*MyInt, %13 : $Builtin.Word |
| %15 = integer_literal $Builtin.Int64, 1 |
| %16 = struct $MyInt (%15 : $Builtin.Int64) |
| store %16 to %14 : $*MyInt |
| %23 = struct_extract %7 : $MyArray<MyInt>, #MyArray._buffer |
| %24 = struct_extract %23 : $_MyArrayBuffer<MyInt>, #_MyArrayBuffer._storage |
| %25 = struct_extract %24 : $_MyBridgeStorage, #_MyBridgeStorage.rawValue |
| %26 = alloc_stack $MyInt |
| %27 = function_ref @hoistableIsNativeTypeChecked : $@convention(method) (@guaranteed MyArray<MyInt>) -> MyBool |
| %28 = apply %27(%7) : $@convention(method) (@guaranteed MyArray<MyInt>) -> MyBool |
| %29 = function_ref @checkSubscript : $@convention(method) (MyInt, MyBool, @guaranteed MyArray<MyInt>) -> _MyDependenceToken |
| %30 = apply %29(%12, %28, %7) : $@convention(method) (MyInt, MyBool, @guaranteed MyArray<MyInt>) -> _MyDependenceToken |
| %31 = function_ref @getElement : $@convention(method) (MyInt, MyBool, _MyDependenceToken, @guaranteed MyArray<MyInt>) -> @out MyInt |
| %32 = apply %31(%26, %12, %28, %30, %7) : $@convention(method) (MyInt, MyBool, _MyDependenceToken, @guaranteed MyArray<MyInt>) -> @out MyInt |
| %35 = alloc_stack $MyInt |
| strong_retain %25 : $Builtin.BridgeObject |
| %36 = apply %29(%16, %28, %7) : $@convention(method) (MyInt, MyBool, @guaranteed MyArray<MyInt>) -> _MyDependenceToken |
| %37 = apply %31(%35, %16, %28, %36, %7) : $@convention(method) (MyInt, MyBool, _MyDependenceToken, @guaranteed MyArray<MyInt>) -> @out MyInt |
| strong_release %25 : $Builtin.BridgeObject |
| %52 = tuple () |
| dealloc_stack %35 : $*MyInt |
| dealloc_stack %26 : $*MyInt |
| strong_release %25 : $Builtin.BridgeObject |
| return %52 : $() |
| } |
| |
| // CHECK-LABEL: sil @unknown_use |
| // CHECK: [[GFUN:%.*]] = function_ref @getElement |
| // CHECK: apply [[GFUN]] |
| // CHECK: return |
| |
| sil @unknown_use : $@convention(thin) () -> () { |
| %0 = function_ref @swift_bufferAllocate : $@convention(thin) () -> @owned AnyObject |
| %1 = integer_literal $Builtin.Int64, 2 |
| %2 = struct $MyInt (%1 : $Builtin.Int64) |
| %3 = apply %0() : $@convention(thin) () -> @owned AnyObject |
| %4 = metatype $@thin MyArray<MyInt>.Type |
| %5 = function_ref @adoptStorage : $@convention(thin) (@owned AnyObject, MyInt, @thin MyArray<MyInt>.Type) -> @owned (MyArray<MyInt>, UnsafeMutablePointer<MyInt>) |
| %6 = apply %5(%3, %2, %4) : $@convention(thin) (@owned AnyObject, MyInt, @thin MyArray<MyInt>.Type) -> @owned (MyArray<MyInt>, UnsafeMutablePointer<MyInt>) |
| %7 = tuple_extract %6 : $(MyArray<MyInt>, UnsafeMutablePointer<MyInt>), 0 |
| %8 = tuple_extract %6 : $(MyArray<MyInt>, UnsafeMutablePointer<MyInt>), 1 |
| %9 = struct_extract %8 : $UnsafeMutablePointer<MyInt>, #UnsafeMutablePointer._rawValue |
| %10 = pointer_to_address %9 : $Builtin.RawPointer to [strict] $*MyInt |
| %11 = integer_literal $Builtin.Int64, 0 |
| %12 = struct $MyInt (%11 : $Builtin.Int64) |
| store %12 to %10 : $*MyInt |
| %23 = struct_extract %7 : $MyArray<MyInt>, #MyArray._buffer |
| %24 = struct_extract %23 : $_MyArrayBuffer<MyInt>, #_MyArrayBuffer._storage |
| %25 = struct_extract %24 : $_MyBridgeStorage, #_MyBridgeStorage.rawValue |
| %26 = alloc_stack $MyInt |
| %27 = function_ref @hoistableIsNativeTypeChecked : $@convention(method) (@guaranteed MyArray<MyInt>) -> MyBool |
| %28 = apply %27(%7) : $@convention(method) (@guaranteed MyArray<MyInt>) -> MyBool |
| %29 = function_ref @checkSubscript : $@convention(method) (MyInt, MyBool, @guaranteed MyArray<MyInt>) -> _MyDependenceToken |
| %30 = apply %29(%12, %28, %7) : $@convention(method) (MyInt, MyBool, @guaranteed MyArray<MyInt>) -> _MyDependenceToken |
| %31 = function_ref @getElement : $@convention(method) (MyInt, MyBool, _MyDependenceToken, @guaranteed MyArray<MyInt>) -> @out MyInt |
| %32 = apply %31(%26, %12, %28, %30, %7) : $@convention(method) (MyInt, MyBool, _MyDependenceToken, @guaranteed MyArray<MyInt>) -> @out MyInt |
| %33 = function_ref @unknown_array_use : $@convention(method) (@guaranteed MyArray<MyInt>) -> MyBool |
| %34 = apply %33(%7) : $@convention(method) (@guaranteed MyArray<MyInt>) -> MyBool |
| %52 = tuple () |
| dealloc_stack %26 : $*MyInt |
| strong_release %25 : $Builtin.BridgeObject |
| return %52 : $() |
| } |
| |
| // CHECK-LABEL: sil @append_contentsOf_int |
| // CHECK: [[ASFUN:%.*]] = function_ref @arrayAdoptStorage |
| // CHECK-NEXT: [[ARR:%.*]] = apply [[ASFUN]] |
| // CHECK-NEXT: [[OWNER:%.*]] = tuple_extract [[ARR]]{{.*}}, 0 |
| // CHECK-NOT: apply [[ACFUN]] |
| // CHECK: [[AEFUN:%.*]] = function_ref @$SSa6appendyyxF |
| // CHECK-NEXT: [[STACK:%.*]] = alloc_stack $MyInt |
| // CHECK-NEXT: store %{{[0-9]+}} to [[STACK]] |
| // CHECK-NEXT: apply [[AEFUN]]<MyInt>([[STACK]] |
| // CHECK-NEXT: dealloc_stack [[STACK]] |
| // CHECK-NEXT: release_value [[OWNER]] |
| // CHECK: return |
| sil @append_contentsOf_int : $@convention(thin) () -> () { |
| %0 = function_ref @swift_bufferAllocate : $@convention(thin) () -> @owned AnyObject |
| %1 = integer_literal $Builtin.Int64, 1 |
| %2 = struct $MyInt (%1 : $Builtin.Int64) |
| %3 = apply %0() : $@convention(thin) () -> @owned AnyObject |
| %4 = metatype $@thin Array<MyInt>.Type |
| %5 = function_ref @arrayAdoptStorage : $@convention(thin) (@owned AnyObject, MyInt, @thin Array<MyInt>.Type) -> @owned (Array<MyInt>, UnsafeMutablePointer<MyInt>) |
| %6 = apply %5(%3, %2, %4) : $@convention(thin) (@owned AnyObject, MyInt, @thin Array<MyInt>.Type) -> @owned (Array<MyInt>, UnsafeMutablePointer<MyInt>) |
| %7 = tuple_extract %6 : $(Array<MyInt>, UnsafeMutablePointer<MyInt>), 0 |
| %8 = tuple_extract %6 : $(Array<MyInt>, UnsafeMutablePointer<MyInt>), 1 |
| %9 = struct_extract %8 : $UnsafeMutablePointer<MyInt>, #UnsafeMutablePointer._rawValue |
| %10 = pointer_to_address %9 : $Builtin.RawPointer to [strict] $*MyInt |
| %11 = integer_literal $Builtin.Int64, 27 |
| %12 = struct $MyInt (%11 : $Builtin.Int64) |
| store %12 to %10 : $*MyInt |
| %13 = alloc_stack $Array<MyInt> |
| %14 = metatype $@thin Array<MyInt>.Type |
| %15 = function_ref @arrayInit : $@convention(method) (@thin Array<MyInt>.Type) -> @owned Array<MyInt> |
| %16 = apply %15(%14) : $@convention(method) (@thin Array<MyInt>.Type) -> @owned Array<MyInt> |
| store %16 to %13 : $*Array<MyInt> |
| %17 = function_ref @arrayAppendContentsOf : $@convention(method) (@owned Array<MyInt>, @inout Array<MyInt>) -> () |
| %18 = apply %17(%7, %13) : $@convention(method) (@owned Array<MyInt>, @inout Array<MyInt>) -> () |
| dealloc_stack %13 : $*Array<MyInt> |
| %19 = tuple () |
| return %19 : $() |
| } |
| |
| class Hello { |
| } |
| |
| sil [_semantics "array.uninitialized"] @adoptStorageHello : $@convention(method) (@owned _ContiguousArrayStorage<Hello>, MyInt, @thin Array<Hello>.Type) -> (@owned Array<Hello>, UnsafeMutablePointer<Hello>) |
| sil [_semantics "array.append_contentsOf"] @arrayAppendContentsOfHello : $@convention(method) (@owned Array<Hello>, @inout Array<Hello>) -> () |
| |
| // CHECK-LABEL: sil @append_contentsOf_class |
| // CHECK: [[ASFUN:%.*]] = function_ref @adoptStorageHello |
| // CHECK-NEXT: [[ARR:%.*]] = apply [[ASFUN]] |
| // CHECK-NEXT: [[OWNER:%.*]] = tuple_extract [[ARR]]{{.*}}, 0 |
| // CHECK: strong_retain %1 : $Hello |
| // CHECK-NEXT: store %1 to %{{[0-9]+}} : $*Hello |
| // CHECK-NOT: apply |
| // CHECK: [[AEFUN:%.*]] = function_ref @$SSa6appendyyxF |
| // CHECK-NEXT: strong_retain %1 : $Hello |
| // CHECK-NEXT: [[STACK:%.*]] = alloc_stack $Hello |
| // CHECK-NEXT: store %1 to [[STACK]] |
| // CHECK-NEXT: apply [[AEFUN]]<Hello>([[STACK]], %0) |
| // CHECK-NEXT: dealloc_stack [[STACK]] |
| // CHECK-NEXT: strong_release %1 |
| // CHECK-NEXT: release_value [[OWNER]] |
| // CHECK-NEXT: return |
| sil @append_contentsOf_class : $@convention(thin) (@inout Array<Hello>, @owned Hello) -> @owned Hello { |
| bb0(%0 : $*Array<Hello>, %1 : $Hello): |
| %4 = integer_literal $Builtin.Word, 1 |
| %5 = integer_literal $Builtin.Int64, 1 |
| %6 = struct $MyInt (%5 : $Builtin.Int64) |
| %7 = alloc_ref [tail_elems $Hello * %4 : $Builtin.Word] $_ContiguousArrayStorage<Hello> |
| %8 = metatype $@thin Array<Hello>.Type |
| %9 = function_ref @adoptStorageHello : $@convention(method) (@owned _ContiguousArrayStorage<Hello>, MyInt, @thin Array<Hello>.Type) -> (@owned Array<Hello>, UnsafeMutablePointer<Hello>) |
| %10 = apply %9(%7, %6, %8) : $@convention(method) (@owned _ContiguousArrayStorage<Hello>, MyInt, @thin Array<Hello>.Type) -> (@owned Array<Hello>, UnsafeMutablePointer<Hello>) |
| %11 = tuple_extract %10 : $(Array<Hello>, UnsafeMutablePointer<Hello>), 0 |
| %12 = tuple_extract %10 : $(Array<Hello>, UnsafeMutablePointer<Hello>), 1 |
| %13 = struct_extract %12 : $UnsafeMutablePointer<Hello>, #UnsafeMutablePointer._rawValue |
| %22 = pointer_to_address %13 : $Builtin.RawPointer to [strict] $*Hello |
| strong_retain %1 : $Hello |
| store %1 to %22 : $*Hello |
| %25 = function_ref @arrayAppendContentsOfHello : $@convention(method) (@owned Array<Hello>, @inout Array<Hello>) -> () |
| %26 = apply %25(%11, %0) : $@convention(method) (@owned Array<Hello>, @inout Array<Hello>) -> () |
| return %1 : $Hello |
| } |