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 83 84 85 86 87 88 89 90 91
|
// RUN: %target-swift-frontend -target %module-target-future -primary-file %s -O -sil-verify-all -disable-availability-checking -Xllvm -sil-disable-pass=FunctionSignatureOpts -module-name=test -emit-ir | %FileCheck %s
// Also do an end-to-end test to check all components, including IRGen.
// RUN: %empty-directory(%t)
// RUN: %target-build-swift -target %target-future-triple -O -Xllvm -sil-disable-pass=FunctionSignatureOpts -module-name=test %s -o %t/a.out
// RUN: %target-run %t/a.out | %FileCheck %s -check-prefix=CHECK-OUTPUT
// REQUIRES: executable_test,swift_stdlib_no_asserts,optimized_stdlib
// Check if the optimizer is able to convert array literals to constant statically initialized arrays.
// CHECK-DAG: @"$s4test11arrayLookupyS2iFTv_r" = {{.*}} constant {{.*}} @"$ss20__StaticArrayStorageCN", {{.*}} @_swiftImmortalRefCount
// CHECK-DAG: @"$s4test11returnArraySaySiGyFTv_r" = {{.*}} constant {{.*}} @"$ss20__StaticArrayStorageCN", {{.*}} @_swiftImmortalRefCount
// CHECK-DAG: @"$s4test9passArrayyyFTv_r" = {{.*}} constant {{.*}} @"$ss20__StaticArrayStorageCN", {{.*}} @_swiftImmortalRefCount
// CHECK-DAG: @"$s4test9passArrayyyFTv0_r" = {{.*}} constant {{.*}} @"$ss20__StaticArrayStorageCN", {{.*}} @_swiftImmortalRefCount
// CHECK-DAG: @"$s4test10storeArrayyyFTv_r" = {{.*}} constant {{.*}} @"$ss20__StaticArrayStorageCN", {{.*}} @_swiftImmortalRefCount
// CHECK-DAG: @"$s4test3StrV14staticVariable_WZTv_r" = {{.*}} constant {{.*}} @"$ss20__StaticArrayStorageCN", {{.*}} @_swiftImmortalRefCount
// CHECK-NOT: swift_initStaticObject
// UNSUPPORTED: use_os_stdlib
// Currently, constant static arrays only work on Darwin platforms.
// REQUIRES: VENDOR=apple
public struct Str {
public static let staticVariable = [ 200, 201, 202 ]
}
@inline(never)
public func arrayLookup(_ i: Int) -> Int {
let lookupTable = [10, 11, 12]
return lookupTable[i]
}
@inline(never)
public func returnArray() -> [Int] {
return [20, 21]
}
@inline(never)
public func modifyArray() -> [Int] {
var a = returnArray()
a[1] = 27
return a
}
public var gg: [Int]?
@inline(never)
public func receiveArray(_ a: [Int]) {
gg = a
}
@inline(never)
public func passArray() {
receiveArray([27, 28])
receiveArray([29])
}
@inline(never)
public func storeArray() {
gg = [227, 228]
}
// CHECK-OUTPUT: [200, 201, 202]
print(Str.staticVariable)
// CHECK-OUTPUT-NEXT: 11
print(arrayLookup(1))
// CHECK-OUTPUT-NEXT: [20, 21]
print(returnArray())
// CHECK-OUTPUT-NEXT: [20, 27]
// CHECK-OUTPUT-NEXT: [20, 27]
// CHECK-OUTPUT-NEXT: [20, 27]
// CHECK-OUTPUT-NEXT: [20, 27]
// CHECK-OUTPUT-NEXT: [20, 27]
for _ in 0..<5 {
print(modifyArray())
}
passArray()
// CHECK-OUTPUT-NEXT: [29]
print(gg!)
storeArray()
// CHECK-OUTPUT-NEXT: [227, 228]
print(gg!)
|