| // 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#1 : $*Array<X> |
| |
| %m1 = function_ref @_array_X_mutate : $@convention(method) (@inout Array<X>) -> () |
| %m2 = apply %m1(%1#1) : $@convention(method) (@inout Array<X>) -> () |
| |
| %5 = load %1#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#0 : $*@local_storage 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#1 : $*Array<X> |
| |
| %m1 = function_ref @_take_array_addr : $@convention(method) (@inout Array<X>) -> () |
| %m2 = apply %m1(%1#1) : $@convention(method) (@inout Array<X>) -> () |
| |
| %5 = load %1#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#0 : $*@local_storage 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#1 : $*Array<X> |
| |
| store %0 to %1#1 : $*Array<X> |
| |
| %5 = load %1#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#0 : $*@local_storage 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#1 : $*(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#1 : $*(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#0 : $*@local_storage (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) |
| |