blob: adf7ac72861a8ea3814e5d6dd5bedd647e894366 [file] [log] [blame]
// RUN: %target-sil-opt -array-element-propagation %s | %FileCheck %s
sil_stage canonical
import Builtin
import Swift
struct MyInt {
@_hasStorage var _value: Builtin.Int64
}
struct MyBool {}
struct _MyDependenceToken {}
struct _MyBridgeStorage {
@_hasStorage var rawValue : Builtin.BridgeObject
}
struct _MyArrayBuffer<T> {
@_hasStorage var _storage : _MyBridgeStorage
}
struct MyArray<T> {
@_hasStorage 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 @$sSa6appendyyxnF
// 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 @$sSa6appendyyxnF
// 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: 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
}