blob: 2893b8d3f8237212d8e9c472855588a87d6b21cc [file] [log] [blame]
// RUN: %target-sil-opt -enable-sil-verify-all -global-property-opt %s | %FileCheck %s
sil_stage canonical
import Builtin
import Swift
import SwiftShims
public class X {
}
public class Holder {
init()
private var arrFieldNative: [X]
public var arrFieldPublic: [X]
private var arrFieldUnknown: [X]
private var arrFieldEscaped: [X]
}
public struct StructHolder {
init()
private var arrFieldNative: [X]
public var arrFieldPublic: [X]
private var arrFieldUnknown: [X]
private var arrFieldEscaped: [X]
}
struct DepStruct {
private var depField: [X]
private var depField2: [X]
}
// CHECK-LABEL: sil @test_alloc_stack
// CHECK: [[I:%[0-9]+]] = integer_literal $Builtin.Int1, -1
// CHECK: [[R:%[0-9]+]] = struct $Bool ([[I]] : $Builtin.Int1)
// CHECK: return [[R]]
sil @test_alloc_stack : $@convention(thin) () -> Bool {
bb0:
%1 = alloc_stack $Array<X>
%3 = function_ref @_array_X_init : $@convention(thin) () -> @owned Array<X>
%4 = apply %3() : $@convention(thin) () -> @owned Array<X>
store %4 to %1 : $*Array<X>
%m1 = function_ref @_array_X_mutate : $@convention(method) (@inout Array<X>) -> ()
%m2 = apply %m1(%1) : $@convention(method) (@inout Array<X>) -> ()
%5 = load %1 : $*Array<X>
%6 = function_ref @_is_native_X_no_type_check : $@convention(method) (@guaranteed Array<X>) -> Bool
%10 = apply %6(%5) : $@convention(method) (@guaranteed Array<X>) -> Bool
dealloc_stack %1 : $*Array<X>
return %10 : $Bool
}
// CHECK-LABEL: sil @test_alloc_stack_escapes
// CHECK: [[F:%[0-9]+]] = function_ref @_is_native_X_no_type_check
// CHECK: [[R:%[0-9]+]] = apply [[F]]
// CHECK: return [[R]]
sil @test_alloc_stack_escapes : $@convention(thin) () -> Bool {
bb0:
%1 = alloc_stack $Array<X>
%3 = function_ref @_array_X_init : $@convention(thin) () -> @owned Array<X>
%4 = apply %3() : $@convention(thin) () -> @owned Array<X>
store %4 to %1 : $*Array<X>
%m1 = function_ref @_take_array_addr : $@convention(method) (@inout Array<X>) -> ()
%m2 = apply %m1(%1) : $@convention(method) (@inout Array<X>) -> ()
%5 = load %1 : $*Array<X>
%6 = function_ref @_is_native_X_no_type_check : $@convention(method) (@guaranteed Array<X>) -> Bool
%10 = apply %6(%5) : $@convention(method) (@guaranteed Array<X>) -> Bool
dealloc_stack %1 : $*Array<X>
return %10 : $Bool
}
// CHECK-LABEL: sil @test_alloc_write_unknown
// CHECK: [[F:%[0-9]+]] = function_ref @_is_native_X_no_type_check
// CHECK: [[R:%[0-9]+]] = apply [[F]]
// CHECK: return [[R]]
sil @test_alloc_write_unknown : $@convention(thin) (@owned Array<X>) -> Bool {
bb0(%0 : $Array<X>):
%1 = alloc_stack $Array<X>
%3 = function_ref @_array_X_init : $@convention(thin) () -> @owned Array<X>
%4 = apply %3() : $@convention(thin) () -> @owned Array<X>
store %4 to %1 : $*Array<X>
store %0 to %1 : $*Array<X>
%5 = load %1 : $*Array<X>
%6 = function_ref @_is_native_X_no_type_check : $@convention(method) (@guaranteed Array<X>) -> Bool
%10 = apply %6(%5) : $@convention(method) (@guaranteed Array<X>) -> Bool
dealloc_stack %1 : $*Array<X>
return %10 : $Bool
}
// CHECK-LABEL: sil @test_phi
// CHECK: [[I:%[0-9]+]] = integer_literal $Builtin.Int1, -1
// CHECK: [[R:%[0-9]+]] = struct $Bool ([[I]] : $Builtin.Int1)
// CHECK: return [[R]]
sil @test_phi : $@convention(thin) (Bool) -> Bool {
bb0(%0 : $Bool):
%2 = struct_extract %0 : $Bool, #Bool._value
%3 = function_ref @_array_X_init : $@convention(thin) () -> @owned Array<X>
cond_br %2, bb1, bb2
bb1:
%4 = apply %3() : $@convention(thin) () -> @owned Array<X>
br bb3(%4 : $Array<X>)
bb2:
%6 = apply %3() : $@convention(thin) () -> @owned Array<X>
br bb3(%6 : $Array<X>)
bb3(%a1 : $Array<X>):
%f1 = function_ref @_is_native_X_no_type_check : $@convention(method) (@guaranteed Array<X>) -> Bool
%10 = apply %f1(%a1) : $@convention(method) (@guaranteed Array<X>) -> Bool
return %10 : $Bool
}
// CHECK-LABEL: sil @negative_test_phi
// CHECK: [[F:%[0-9]+]] = function_ref @_is_native_X_no_type_check
// CHECK: [[R:%[0-9]+]] = apply [[F]]
// CHECK: return [[R]]
sil @negative_test_phi : $@convention(thin) (Bool, @owned Array<X>) -> Bool {
bb0(%0 : $Bool, %1 : $Array<X>):
%2 = struct_extract %0 : $Bool, #Bool._value
cond_br %2, bb1, bb2
bb1:
%3 = function_ref @_array_X_init : $@convention(thin) () -> @owned Array<X>
%4 = apply %3() : $@convention(thin) () -> @owned Array<X>
br bb3(%4 : $Array<X>)
bb2:
br bb3(%1 : $Array<X>)
bb3(%a1 : $Array<X>):
%f1 = function_ref @_is_native_X_no_type_check : $@convention(method) (@guaranteed Array<X>) -> Bool
%10 = apply %f1(%a1) : $@convention(method) (@guaranteed Array<X>) -> Bool
return %10 : $Bool
}
// CHECK-LABEL: sil @test_tuple
// CHECK: [[I:%[0-9]+]] = integer_literal $Builtin.Int1, -1
// CHECK: [[R:%[0-9]+]] = struct $Bool ([[I]] : $Builtin.Int1)
// CHECK: return [[R]]
sil @test_tuple : $@convention(thin) () -> Bool {
bb0:
%f1 = function_ref @_array_X_init : $@convention(thin) () -> @owned Array<X>
%a1 = apply %f1() : $@convention(thin) () -> @owned Array<X>
%i1 = integer_literal $Builtin.Int64, 0
%t1 = tuple (%a1 : $Array<X>, %i1 : $Builtin.Int64)
%a2 = tuple_extract %t1 : $(Array<X>, Builtin.Int64), 0
%f2 = function_ref @_is_native_X_no_type_check : $@convention(method) (@guaranteed Array<X>) -> Bool
%r1 = apply %f2(%a2) : $@convention(method) (@guaranteed Array<X>) -> Bool
return %r1 : $Bool
}
// CHECK-LABEL: sil @test_tuple_unknown_member
// CHECK: [[F:%[0-9]+]] = function_ref @_is_native_X_no_type_check
// CHECK: [[R:%[0-9]+]] = apply [[F]]
// CHECK: return [[R]]
sil @test_tuple_unknown_member : $@convention(thin) (@owned Array<X>) -> Bool {
bb0(%0 : $Array<X>):
%i1 = integer_literal $Builtin.Int64, 0
%t1 = tuple (%0 : $Array<X>, %i1 : $Builtin.Int64)
%a2 = tuple_extract %t1 : $(Array<X>, Builtin.Int64), 0
%f2 = function_ref @_is_native_X_no_type_check : $@convention(method) (@guaranteed Array<X>) -> Bool
%r1 = apply %f2(%a2) : $@convention(method) (@guaranteed Array<X>) -> Bool
return %r1 : $Bool
}
// CHECK-LABEL: sil @test_unknown_tuple
// CHECK: [[F:%[0-9]+]] = function_ref @_is_native_X_no_type_check
// CHECK: [[R:%[0-9]+]] = apply [[F]]
// CHECK: return [[R]]
sil @test_unknown_tuple : $@convention(thin) () -> Bool {
bb0:
%f1 = function_ref @provide_tuple : $@convention(thin) () -> @owned (Array<X>, Builtin.Int64)
%t1 = apply %f1() : $@convention(thin) () -> @owned (Array<X>, Builtin.Int64)
%a2 = tuple_extract %t1 : $(Array<X>, Builtin.Int64), 0
%f2 = function_ref @_is_native_X_no_type_check : $@convention(method) (@guaranteed Array<X>) -> Bool
%r1 = apply %f2(%a2) : $@convention(method) (@guaranteed Array<X>) -> Bool
return %r1 : $Bool
}
// CHECK-LABEL: sil @test_tuple_member_escapes
// CHECK: [[F:%[0-9]+]] = function_ref @_is_native_X_no_type_check
// CHECK: [[R:%[0-9]+]] = apply [[F]]
// CHECK: return [[R]]
sil @test_tuple_member_escapes : $@convention(thin) () -> Bool {
bb0:
%s1 = alloc_stack $(Array<X>, Builtin.Int64)
%a1 = tuple_element_addr %s1 : $*(Array<X>, Builtin.Int64), 0
%f1 = function_ref @_take_array_addr : $@convention(method) (@inout Array<X>) -> ()
%x1 = apply %f1(%a1) : $@convention(method) (@inout Array<X>) -> ()
%t1 = load %s1 : $*(Array<X>, Builtin.Int64)
%a2 = tuple_extract %t1 : $(Array<X>, Builtin.Int64), 0
%f2 = function_ref @_is_native_X_no_type_check : $@convention(method) (@guaranteed Array<X>) -> Bool
%r1 = apply %f2(%a2) : $@convention(method) (@guaranteed Array<X>) -> Bool
dealloc_stack %s1 : $*(Array<X>, Builtin.Int64)
return %r1 : $Bool
}
// CHECK-LABEL: sil @test_tuple_phi
// CHECK: [[I:%[0-9]+]] = integer_literal $Builtin.Int1, -1
// CHECK: [[R:%[0-9]+]] = struct $Bool ([[I]] : $Builtin.Int1)
// CHECK: return [[R]]
sil @test_tuple_phi : $@convention(thin) (Bool) -> Bool {
bb0(%0 : $Bool):
%i1 = integer_literal $Builtin.Int64, 0
%f1 = function_ref @_array_X_init : $@convention(thin) () -> @owned Array<X>
%2 = struct_extract %0 : $Bool, #Bool._value
cond_br %2, bb1, bb2
bb1:
%a1 = apply %f1() : $@convention(thin) () -> @owned Array<X>
%t1 = tuple (%a1 : $Array<X>, %i1 : $Builtin.Int64)
br bb3(%t1 : $(Array<X>, Builtin.Int64))
bb2:
%a2 = apply %f1() : $@convention(thin) () -> @owned Array<X>
%t2 = tuple (%a2 : $Array<X>, %i1 : $Builtin.Int64)
br bb3(%t2 : $(Array<X>, Builtin.Int64))
bb3(%t3 : $(Array<X>, Builtin.Int64)):
%a3 = tuple_extract %t3 : $(Array<X>, Builtin.Int64), 0
%f2 = function_ref @_is_native_X_no_type_check : $@convention(method) (@guaranteed Array<X>) -> Bool
%10 = apply %f2(%a3) : $@convention(method) (@guaranteed Array<X>) -> Bool
return %10 : $Bool
}
// CHECK-LABEL: sil @test_tuple_phi_unknown
// CHECK: [[F:%[0-9]+]] = function_ref @_is_native_X_no_type_check
// CHECK: [[R:%[0-9]+]] = apply [[F]]
// CHECK: return [[R]]
sil @test_tuple_phi_unknown : $@convention(thin) (Bool, @owned Array<X>) -> Bool {
bb0(%0 : $Bool, %1 : $Array<X>):
%i1 = integer_literal $Builtin.Int64, 0
%f1 = function_ref @_array_X_init : $@convention(thin) () -> @owned Array<X>
%2 = struct_extract %0 : $Bool, #Bool._value
cond_br %2, bb1, bb2
bb1:
%a1 = apply %f1() : $@convention(thin) () -> @owned Array<X>
%t1 = tuple (%a1 : $Array<X>, %i1 : $Builtin.Int64)
br bb3(%t1 : $(Array<X>, Builtin.Int64))
bb2:
%t2 = tuple (%1 : $Array<X>, %i1 : $Builtin.Int64)
br bb3(%t2 : $(Array<X>, Builtin.Int64))
bb3(%t3 : $(Array<X>, Builtin.Int64)):
%a2 = tuple_extract %t3 : $(Array<X>, Builtin.Int64), 0
%f2 = function_ref @_is_native_X_no_type_check : $@convention(method) (@guaranteed Array<X>) -> Bool
%10 = apply %f2(%a2) : $@convention(method) (@guaranteed Array<X>) -> Bool
return %10 : $Bool
}
// CHECK-LABEL: sil @test_arrFieldNative
// CHECK: [[I:%[0-9]+]] = integer_literal $Builtin.Int1, -1
// CHECK: [[R:%[0-9]+]] = struct $Bool ([[I]] : $Builtin.Int1)
// CHECK: return [[R]]
sil @test_arrFieldNative : $@convention(thin) (@owned Holder) -> Bool {
bb0(%0 : $Holder):
%2 = ref_element_addr %0 : $Holder, #Holder.arrFieldNative
%3 = load %2 : $*Array<X>
%6 = function_ref @_is_native_X_no_type_check : $@convention(method) (@guaranteed Array<X>) -> Bool
%10 = apply %6(%3) : $@convention(method) (@guaranteed Array<X>) -> Bool
return %10 : $Bool
}
// CHECK-LABEL: sil @test_arrFieldPublic
// CHECK: [[F:%[0-9]+]] = function_ref @_is_native_X_no_type_check
// CHECK: [[R:%[0-9]+]] = apply [[F]]
// CHECK: return [[R]]
sil @test_arrFieldPublic : $@convention(thin) (@owned Holder) -> Bool {
bb0(%0 : $Holder):
%2 = ref_element_addr %0 : $Holder, #Holder.arrFieldPublic
%3 = load %2 : $*Array<X>
%6 = function_ref @_is_native_X_no_type_check : $@convention(method) (@guaranteed Array<X>) -> Bool
%10 = apply %6(%3) : $@convention(method) (@guaranteed Array<X>) -> Bool
return %10 : $Bool
}
// CHECK-LABEL: sil @test_arrFieldUnknown
// CHECK: [[F:%[0-9]+]] = function_ref @_is_native_X_no_type_check
// CHECK: [[R:%[0-9]+]] = apply [[F]]
// CHECK: return [[R]]
sil @test_arrFieldUnknown : $@convention(thin) (@owned Holder) -> Bool {
bb0(%0 : $Holder):
%2 = ref_element_addr %0 : $Holder, #Holder.arrFieldUnknown
%3 = load %2 : $*Array<X>
%6 = function_ref @_is_native_X_no_type_check : $@convention(method) (@guaranteed Array<X>) -> Bool
%10 = apply %6(%3) : $@convention(method) (@guaranteed Array<X>) -> Bool
return %10 : $Bool
}
// CHECK-LABEL: sil @test_arrFieldEscaped
// CHECK: [[F:%[0-9]+]] = function_ref @_is_native_X_no_type_check
// CHECK: [[R:%[0-9]+]] = apply [[F]]
// CHECK: return [[R]]
sil @test_arrFieldEscaped : $@convention(thin) (@owned Holder) -> Bool {
bb0(%0 : $Holder):
%2 = ref_element_addr %0 : $Holder, #Holder.arrFieldEscaped
%3 = load %2 : $*Array<X>
%6 = function_ref @_is_native_X_no_type_check : $@convention(method) (@guaranteed Array<X>) -> Bool
%10 = apply %6(%3) : $@convention(method) (@guaranteed Array<X>) -> Bool
return %10 : $Bool
}
// CHECK-LABEL: sil @test_struct_arrFieldNative
// CHECK: [[I:%[0-9]+]] = integer_literal $Builtin.Int1, -1
// CHECK: [[R:%[0-9]+]] = struct $Bool ([[I]] : $Builtin.Int1)
// CHECK: return [[R]]
sil @test_struct_arrFieldNative : $@convention(thin) (@inout StructHolder) -> Bool {
bb0(%0 : $*StructHolder):
%2 = struct_element_addr %0 : $*StructHolder, #StructHolder.arrFieldNative
%3 = load %2 : $*Array<X>
%6 = function_ref @_is_native_X_no_type_check : $@convention(method) (@guaranteed Array<X>) -> Bool
%10 = apply %6(%3) : $@convention(method) (@guaranteed Array<X>) -> Bool
return %10 : $Bool
}
// CHECK-LABEL: sil @test_struct_arrFieldPublic
// CHECK: [[F:%[0-9]+]] = function_ref @_is_native_X_no_type_check
// CHECK: [[R:%[0-9]+]] = apply [[F]]
// CHECK: return [[R]]
sil @test_struct_arrFieldPublic : $@convention(thin) (@inout StructHolder) -> Bool {
bb0(%0 : $*StructHolder):
%2 = struct_element_addr %0 : $*StructHolder, #StructHolder.arrFieldPublic
%3 = load %2 : $*Array<X>
%6 = function_ref @_is_native_X_no_type_check : $@convention(method) (@guaranteed Array<X>) -> Bool
%10 = apply %6(%3) : $@convention(method) (@guaranteed Array<X>) -> Bool
return %10 : $Bool
}
// CHECK-LABEL: sil @test_struct_arrFieldUnknown
// CHECK: [[F:%[0-9]+]] = function_ref @_is_native_X_no_type_check
// CHECK: [[R:%[0-9]+]] = apply [[F]]
// CHECK: return [[R]]
sil @test_struct_arrFieldUnknown : $@convention(thin) (@inout StructHolder) -> Bool {
bb0(%0 : $*StructHolder):
%2 = struct_element_addr %0 : $*StructHolder, #StructHolder.arrFieldUnknown
%3 = load %2 : $*Array<X>
%6 = function_ref @_is_native_X_no_type_check : $@convention(method) (@guaranteed Array<X>) -> Bool
%10 = apply %6(%3) : $@convention(method) (@guaranteed Array<X>) -> Bool
return %10 : $Bool
}
// CHECK-LABEL: sil @test_struct_arrFieldEscaped
// CHECK: [[F:%[0-9]+]] = function_ref @_is_native_X_no_type_check
// CHECK: [[R:%[0-9]+]] = apply [[F]]
// CHECK: return [[R]]
sil @test_struct_arrFieldEscaped : $@convention(thin) (@inout StructHolder) -> Bool {
bb0(%0 : $*StructHolder):
%2 = struct_element_addr %0 : $*StructHolder, #StructHolder.arrFieldEscaped
%3 = load %2 : $*Array<X>
%6 = function_ref @_is_native_X_no_type_check : $@convention(method) (@guaranteed Array<X>) -> Bool
%10 = apply %6(%3) : $@convention(method) (@guaranteed Array<X>) -> Bool
return %10 : $Bool
}
// CHECK-LABEL: sil @test_dependencies
// CHECK: [[I:%[0-9]+]] = integer_literal $Builtin.Int1, -1
// CHECK: [[R:%[0-9]+]] = struct $Bool ([[I]] : $Builtin.Int1)
// CHECK: return [[R]]
sil @test_dependencies : $@convention(thin) (@owned Holder, Bool) -> Bool {
bb0(%0 : $Holder, %1 : $Bool):
%2 = ref_element_addr %0 : $Holder, #Holder.arrFieldNative
%3 = load %2 : $*Array<X>
%i1 = function_ref @_array_X_init : $@convention(thin) () -> @owned Array<X>
%c1 = struct_extract %1 : $Bool, #Bool._value
cond_br %c1, bb1, bb2
bb1:
br bb3(%3 : $Array<X>)
bb2:
%i2 = apply %i1() : $@convention(thin) () -> @owned Array<X>
br bb3(%i2 : $Array<X>)
bb3(%a1 : $Array<X>):
%i3 = apply %i1() : $@convention(thin) () -> @owned Array<X>
%f1 = function_ref @_take_struct : $@convention(thin) (@owned DepStruct) -> ()
%s1 = struct $DepStruct (%a1 : $Array<X>, %i3 : $Array<X>)
%s2 = apply %f1(%s1) : $@convention(thin) (@owned DepStruct) -> ()
%f2 = function_ref @_provide_struct : $@convention(thin) () -> @owned DepStruct
%s3 = apply %f2() : $@convention(thin) () -> @owned DepStruct
%x1 = struct_extract %s3 : $DepStruct, #DepStruct.depField
%f3 = function_ref @_is_native_X_no_type_check : $@convention(method) (@guaranteed Array<X>) -> Bool
%r1 = apply %f3(%x1) : $@convention(method) (@guaranteed Array<X>) -> Bool
return %r1 : $Bool
}
// Check dependency chain: load -> argument -> struct -> extract
// CHECK-LABEL: sil @test_dependencies2
// CHECK: [[F:%[0-9]+]] = function_ref @_is_native_X_no_type_check
// CHECK: [[R:%[0-9]+]] = apply [[F]]
// CHECK: return [[R]]
sil @test_dependencies2 : $@convention(thin) (@owned Holder, Bool) -> Bool {
bb0(%0 : $Holder, %1 : $Bool):
%2 = ref_element_addr %0 : $Holder, #Holder.arrFieldUnknown
%3 = load %2 : $*Array<X>
%i1 = function_ref @_array_X_init : $@convention(thin) () -> @owned Array<X>
%c1 = struct_extract %1 : $Bool, #Bool._value
cond_br %c1, bb1, bb2
bb1:
br bb3(%3 : $Array<X>)
bb2:
%i2 = apply %i1() : $@convention(thin) () -> @owned Array<X>
br bb3(%i2 : $Array<X>)
bb3(%a1 : $Array<X>):
%i3 = apply %i1() : $@convention(thin) () -> @owned Array<X>
%f1 = function_ref @_take_struct : $@convention(thin) (@owned DepStruct) -> ()
%s1 = struct $DepStruct (%i3 : $Array<X>, %a1 : $Array<X>)
%s2 = apply %f1(%s1) : $@convention(thin) (@owned DepStruct) -> ()
%f2 = function_ref @_provide_struct : $@convention(thin) () -> @owned DepStruct
%s3 = apply %f2() : $@convention(thin) () -> @owned DepStruct
%x1 = struct_extract %s3 : $DepStruct, #DepStruct.depField2
%f3 = function_ref @_is_native_X_no_type_check : $@convention(method) (@guaranteed Array<X>) -> Bool
%r1 = apply %f3(%x1) : $@convention(method) (@guaranteed Array<X>) -> Bool
return %r1 : $Bool
}
sil @setArrayFields : $@convention(thin) (@owned Holder, @inout StructHolder, @owned Array<X>) -> () {
bb0(%0 : $Holder, %1 : $*StructHolder, %2 : $Array<X>):
%l1 = integer_literal $Builtin.Word, 0 // user: %3
%f1 = function_ref @_allocate_uninitialized_X : $@convention(thin) (Builtin.Word) -> @owned (Array<X>, Builtin.RawPointer)
%f2 = function_ref @_take_array_addr : $@convention(method) (@inout Array<X>) -> ()
%c3 = apply %f1(%l1) : $@convention(thin) (Builtin.Word) -> @owned (Array<X>, Builtin.RawPointer)
%c4 = tuple_extract %c3 : $(Array<X>, Builtin.RawPointer), 0
%c5 = ref_element_addr %0 : $Holder, #Holder.arrFieldNative
store %c4 to %c5 : $*Array<X>
%c6 = apply %f1(%l1) : $@convention(thin) (Builtin.Word) -> @owned (Array<X>, Builtin.RawPointer)
%c7 = tuple_extract %c6 : $(Array<X>, Builtin.RawPointer), 0
%c8 = ref_element_addr %0 : $Holder, #Holder.arrFieldPublic
store %c7 to %c8 : $*Array<X>
%c9 = ref_element_addr %0 : $Holder, #Holder.arrFieldUnknown
store %2 to %c9 : $*Array<X>
%c11 = ref_element_addr %0 : $Holder, #Holder.arrFieldEscaped
%c12 = apply %f2(%c11) : $@convention(method) (@inout Array<X>) -> ()
%s3 = apply %f1(%l1) : $@convention(thin) (Builtin.Word) -> @owned (Array<X>, Builtin.RawPointer)
%s4 = tuple_extract %s3 : $(Array<X>, Builtin.RawPointer), 0
%s5 = struct_element_addr %1 : $*StructHolder, #StructHolder.arrFieldNative
store %s4 to %s5 : $*Array<X>
%s6 = apply %f1(%l1) : $@convention(thin) (Builtin.Word) -> @owned (Array<X>, Builtin.RawPointer)
%s7 = tuple_extract %s6 : $(Array<X>, Builtin.RawPointer), 0
%s8 = struct_element_addr %1 : $*StructHolder, #StructHolder.arrFieldPublic
store %s7 to %s8 : $*Array<X>
%s9 = struct_element_addr %1 : $*StructHolder, #StructHolder.arrFieldUnknown
store %2 to %s9 : $*Array<X>
%s11 = struct_element_addr %1 : $*StructHolder, #StructHolder.arrFieldEscaped
%s12 = apply %f2(%s11) : $@convention(method) (@inout Array<X>) -> ()
%t1 = tuple ()
return %t1 : $()
}
sil [_semantics "array.init"] @_array_X_init : $@convention(thin) () -> @owned Array<X>
sil [_semantics "array.mutate_unknown"] @_array_X_mutate : $@convention(method) (@inout Array<X>) -> ()
sil [_semantics "array.props.isNativeTypeChecked"] @_is_native_X_no_type_check : $@convention(method) (@guaranteed Array<X>) -> Bool
sil [_semantics "array.uninitialized"] @_allocate_uninitialized_X : $@convention(thin) (Builtin.Word) -> @owned (Array<X>, Builtin.RawPointer)
sil @_take_array_addr : $@convention(method) (@inout Array<X>) -> ()
sil @_take_struct : $@convention(thin) (@owned DepStruct) -> ()
sil @_provide_struct : $@convention(thin) () -> @owned DepStruct
sil @provide_tuple : $@convention(thin) () -> @owned (Array<X>, Builtin.Int64)