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 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
// RUN: %target-swift-frontend -O -emit-ir %s | %FileCheck %s
// RUN: %target-swift-frontend -Osize -emit-ir %s | %FileCheck %s
// RUN: %empty-directory(%t)
// RUN: %target-build-swift -O -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
// REQUIRES: CPU=arm64 || CPU=x86_64
// REQUIRES: swift_in_compiler
// This is an end-to-end test to ensure that the optimizer generates
// optimal code for static String variables.
public struct S {
// CHECK: {{^@"}}[[SMALL:.*smallstr.*pZ]]" ={{.*}} constant {{.*}} inttoptr
public static let smallstr = "abc123a"
// CHECK: {{^@"}}[[LARGE:.*largestr.*pZ]]" ={{.*}} constant {{.*}} inttoptr {{.*}} add
public static let largestr = "abc123asd3sdj3basfasdf"
// CHECK: {{^@"}}[[UNICODE:.*unicodestr.*pZ]]" ={{.*}} constant {{.*}} inttoptr {{.*}} add
public static let unicodestr = "❄️gastroperiodyni"
// CHECK: {{^@"}}[[EMPTY:.*emptystr.*pZ]]" ={{.*}} constant {{.*}} inttoptr
public static let emptystr = ""
}
// unsafeMutableAddressor for S.smallstr
// CHECK: define {{.*smallstr.*}}u"
// CHECK-NEXT: entry:
// CHECK-NEXT: ret {{.*}} @"[[SMALL]]"
// CHECK-NEXT: }
// getter for S.smallstr
// CHECK: define {{.*smallstr.*}}gZ"
// CHECK-NEXT: entry:
// CHECK-NEXT: ret {{.*}}
// CHECK-NEXT: }
// unsafeMutableAddressor for S.largestr
// CHECK: define {{.*largestr.*}}u"
// CHECK-NEXT: entry:
// CHECK-NEXT: ret {{.*}} @"[[LARGE]]"
// CHECK-NEXT: }
// getter for S.largestr
// CHECK: define {{.*largestr.*}}gZ"
// CHECK-NEXT: entry:
// CHECK-NEXT: ret {{.*}}
// CHECK-NEXT: }
// unsafeMutableAddressor for S.unicodestr
// CHECK: define {{.*unicodestr.*}}u"
// CHECK-NEXT: entry:
// CHECK-NEXT: ret {{.*}} @"[[UNICODE]]"
// CHECK-NEXT: }
// getter for S.unicodestr
// CHECK: define {{.*unicodestr.*}}gZ"
// CHECK-NEXT: entry:
// CHECK-NEXT: ret {{.*}}
// CHECK-NEXT: }
// unsafeMutableAddressor for S.emptystr
// CHECK: define {{.*emptystr.*}}u"
// CHECK-NEXT: entry:
// CHECK-NEXT: ret {{.*}} @"[[EMPTY]]"
// CHECK-NEXT: }
// getter for S.emptystr
// CHECK: define {{.*emptystr.*}}gZ"
// CHECK-NEXT: entry:
// CHECK-NEXT: ret {{.*}}
// CHECK-NEXT: }
// CHECK-LABEL: define {{.*}}get_smallstr
// CHECK: entry:
// CHECK-NEXT: ret {{.*}}
// CHECK-NEXT: }
@inline(never)
public func get_smallstr() -> String {
return S.smallstr
}
// CHECK-LABEL: define {{.*}}get_largestr
// CHECK: entry:
// CHECK-NEXT: ret {{.*}}
// CHECK-NEXT: }
@inline(never)
public func get_largestr() -> String {
return S.largestr
}
// CHECK-LABEL: define {{.*}}get_unicodestr
// CHECK: entry:
// CHECK-NEXT: ret {{.*}}
// CHECK-NEXT: }
@inline(never)
public func get_unicodestr() -> String {
return S.unicodestr
}
// CHECK-LABEL: define {{.*}}get_emptystr
// CHECK: entry:
// CHECK-NEXT: ret {{.*}}
// CHECK-NEXT: }
@inline(never)
public func get_emptystr() -> String {
return S.emptystr
}
// Really load the globals from their addresses.
@_optimize(none)
func print_strings_from_addressors() {
print(S.smallstr)
print(S.largestr)
print(S.unicodestr)
print("<\(S.emptystr)>")
}
@inline(never)
func testit() {
// Also check if the generated code is correct.
// CHECK-OUTPUT: abc123a
// CHECK-OUTPUT: abc123asd3sdj3basfasdf
// CHECK-OUTPUT: ❄️gastroperiodyni
// CHECK-OUTPUT: <>
print(get_smallstr())
print(get_largestr())
print(get_unicodestr())
print("<\(get_emptystr())>")
// CHECK-OUTPUT: abc123a
// CHECK-OUTPUT: abc123asd3sdj3basfasdf
// CHECK-OUTPUT: ❄️gastroperiodyni
// CHECK-OUTPUT: <>
print_strings_from_addressors()
}
testit()
|