1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
// RUN: %target-swift-emit-silgen -module-name main %s -define-availability 'InlineArray 0.1:macOS 9999, iOS 9999, watchOS 9999, tvOS 9999, visionOS 9999' | %FileCheck %s
@available(InlineArray 0.1, *)
struct S {
var a: InlineArray<40, Int> = .init(repeating: 0)
// CHECK-LABEL: sil {{.*}} @$s{{.*}}1SV1f
mutating func f(x: inout Int, y: Int) {
// CHECK: bb0({{.*}}, [[SELF:%.*]] : $*S):
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[SELF]]
// CHECK: [[ADDRESSOR:%.*]] = function_ref @$s{{.*}}11InlineArrayV
// CHECK: [[PTR:%.*]] = apply [[ADDRESSOR]]
// CHECK: [[RAWPTR:%.*]] = struct_extract [[PTR]]
// CHECK: [[ADDR:%.*]] = pointer_to_address [[RAWPTR]]
// CHECK: [[DEP:%.*]] = mark_dependence [unresolved] [[ADDR]]
// CHECK: [[ADDR_ACCESS:%.*]] = begin_access [read] [unsafe] [[DEP]]
// CHECK: load [trivial] [[ADDR_ACCESS]]
// CHECK: end_access [[ADDR_ACCESS]]
// CHECK: end_access [[ACCESS]]
x += a[y]
}
}
@available(InlineArray 0.1, *)
final class C {
final var a: InlineArray<40, Int> = .init(repeating: 0)
// CHECK-LABEL: sil {{.*}} @$s{{.*}}1CC1f
func f(x: inout Int, y: Int) {
// CHECK: bb0({{.*}}, [[SELF:%.*]] : @guaranteed $C):
// CHECK: [[FIELD:%.*]] = ref_element_addr [[SELF]]
// CHECK: [[ACCESS:%.*]] = begin_access [read] [dynamic] [[FIELD]]
// CHECK: [[ADDRESSOR:%.*]] = function_ref @$s{{.*}}11InlineArrayV
// CHECK: [[PTR:%.*]] = apply [[ADDRESSOR]]
// CHECK: [[RAWPTR:%.*]] = struct_extract [[PTR]]
// CHECK: [[ADDR:%.*]] = pointer_to_address [[RAWPTR]]
// CHECK: [[DEP:%.*]] = mark_dependence [unresolved] [[ADDR]]
// CHECK: [[ADDR_ACCESS:%.*]] = begin_access [read] [unsafe] [[DEP]]
// CHECK: load [trivial] [[ADDR_ACCESS]]
// CHECK: end_access [[ADDR_ACCESS]]
// CHECK: end_access [[ACCESS]]
x += a[y]
}
}
// CHECK-LABEL: sil {{.*}} @$s{{.*}}6tupleF
@available(InlineArray 0.1, *)
func tupleF(tuple: inout (Int, InlineArray<40, Int>), x: inout Int, y: Int) {
// CHECK: bb0([[TUPLE:%.*]] : $*(Int, InlineArray<40, Int>)
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[TUPLE]]
// CHECK: [[ADDRESSOR:%.*]] = function_ref @$s{{.*}}11InlineArrayV
// CHECK: [[PTR:%.*]] = apply [[ADDRESSOR]]
// CHECK: [[RAWPTR:%.*]] = struct_extract [[PTR]]
// CHECK: [[ADDR:%.*]] = pointer_to_address [[RAWPTR]]
// CHECK: [[DEP:%.*]] = mark_dependence [unresolved] [[ADDR]]
// CHECK: [[ADDR_ACCESS:%.*]] = begin_access [read] [unsafe] [[DEP]]
// CHECK: load [trivial] [[ADDR_ACCESS]]
// CHECK: end_access [[ADDR_ACCESS]]
// CHECK: end_access [[ACCESS]]
x += tuple.1[y]
}
@available(InlineArray 0.1, *)
protocol P {
var a: InlineArray<40, Int> { get set }
}
// CHECK-LABEL: sil {{.*}} @$s{{.*}}12existentialF
@available(InlineArray 0.1, *)
func existentialF(e: inout P, x: inout Int, y: Int) {
// CHECK: [[TEMP:%.*]] = alloc_stack $InlineArray
// CHECK: [[ADDRESSOR:%.*]] = function_ref @$s{{.*}}11InlineArrayV
// CHECK: [[PTR:%.*]] = apply [[ADDRESSOR]]
// CHECK: [[RAWPTR:%.*]] = struct_extract [[PTR]]
// CHECK: [[ADDR:%.*]] = pointer_to_address [[RAWPTR]]
// CHECK: [[DEP:%.*]] = mark_dependence [unresolved] [[ADDR]]
// CHECK: [[ADDR_ACCESS:%.*]] = begin_access [read] [unsafe] [[DEP]]
// CHECK: load [trivial] [[ADDR_ACCESS]]
// CHECK: end_access [[ADDR_ACCESS]]
// CHECK: dealloc_stack [[TEMP]]
x += e.a[y]
}
|