Skip to content

Commit 03a58c2

Browse files
authored
Merge pull request #84450 from slavapestov/reasonable-time-tests
Sema: Collected expression checking performance test cases from GitHub issues
2 parents 3a02b20 + 2b1e506 commit 03a58c2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+2846
-1
lines changed

validation-test/Sema/type_checker_perf/fast/array_literal_with_operators_and_double_literals.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) %s -typecheck -solver-expression-time-threshold=1
22

3-
// REQUIRES: asserts,no_asan
43
// REQUIRES: objc_interop
54

65
// FIXME: This should be a scale-test but it doesn't allow passing `%clang-importer-sdk`
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// RUN: %target-typecheck-verify-swift -solver-scope-threshold=100
2+
3+
// https://github.com/swiftlang/swift/issues/46157
4+
5+
func slow() {
6+
let _: (Double) -> Double = { x in x*x*x*x - 3*x*x*x + 2 }
7+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// RUN: %scale-test --begin 1 --end 5 --step 1 --select NumLeafScopes %s -Xfrontend=-typecheck
2+
// REQUIRES: asserts, no_asan
3+
4+
// https://github.com/swiftlang/swift/issues/46253
5+
6+
func slow() {
7+
let d: [Int: (Int) -> Int] = [
8+
%for i in range(0, N):
9+
${i}: { -$0 },
10+
%end
11+
]
12+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// RUN: %scale-test --begin 1 --end 5 --step 1 --select NumLeafScopes %s -Xfrontend=-typecheck
2+
// REQUIRES: asserts, no_asan
3+
4+
// https://github.com/swiftlang/swift/issues/46253
5+
6+
func slow() {
7+
let d: [Int: (Int) -> Bool] = [
8+
%for i in range(0, N):
9+
${i}: { $0 == $0 },
10+
%end
11+
]
12+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// RUN: %target-typecheck-verify-swift -solver-scope-threshold=200
2+
3+
// https://github.com/swiftlang/swift/issues/46420
4+
5+
func slow() {
6+
let new_M: [Int] = Array<Int>(repeating: 0, count: 200)
7+
let _ = (0 ..< 32).map({ (a) -> Int in
8+
return new_M[a >> 3] >> ((1 ^ a & 7) * 4) & 15
9+
})
10+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) %s -typecheck -solver-scope-threshold=100
2+
// REQUIRES: objc_interop
3+
4+
// https://github.com/swiftlang/swift/issues/46680
5+
6+
import Foundation
7+
8+
// FIXME: This should be a scale-test but it doesn't allow passing `%clang-importer-sdk`
9+
10+
func slow() {
11+
let x = [
12+
NSNumber(value: 0),
13+
NSNumber(value: 0),
14+
NSNumber(value: 0),
15+
NSNumber(value: 0),
16+
NSNumber(value: 0),
17+
NSNumber(value: 0),
18+
NSNumber(value: 0),
19+
NSNumber(value: 0),
20+
NSNumber(value: 0),
21+
NSNumber(value: 0),
22+
NSNumber(value: 0),
23+
NSNumber(value: 0),
24+
NSNumber(value: 0),
25+
NSNumber(value: 0),
26+
NSNumber(value: 0),
27+
NSNumber(value: 0),
28+
NSNumber(value: 0),
29+
NSNumber(value: 0),
30+
NSNumber(value: 0),
31+
NSNumber(value: 0)
32+
]
33+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// RUN: %target-typecheck-verify-swift -solver-scope-threshold=100
2+
3+
// https://github.com/swiftlang/swift/issues/47587
4+
5+
func slow() {
6+
let _ = ["x"].count > 6 + 1 + 4 + 1 + 40 + 1
7+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// RUN: %scale-test --begin 1 --end 5 --step 1 --select NumLeafScopes %s -Xfrontend=-typecheck
2+
// REQUIRES: asserts, no_asan
3+
4+
// https://github.com/swiftlang/swift/issues/47685
5+
6+
func slow() {
7+
let a = 0
8+
9+
let diff = abs(a - a) + abs(a + a)
10+
%for i in range(0, N):
11+
+ abs(a - a) + abs(a + a)
12+
%end
13+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// RUN: %scale-test --begin 1 --end 6 --step 1 --select NumLeafScopes %s -Xfrontend=-typecheck
2+
// REQUIRES: asserts, no_asan
3+
4+
// https://github.com/swiftlang/swift/issues/47896
5+
6+
func slow() {
7+
let _ = MemoryLayout<OpaquePointer>.size
8+
%for n in range(0, N):
9+
+ MemoryLayout<Int32>.size + MemoryLayout<UnsafePointer<UInt8>>.size
10+
%end
11+
}
12+
Lines changed: 232 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,232 @@
1+
// RUN: %target-typecheck-verify-swift -solver-scope-threshold=500
2+
3+
// https://github.com/swiftlang/swift/issues/48155
4+
5+
public struct MatrixNxM<T> {
6+
var m: [T]
7+
private let xdim : Int
8+
private let ydim : Int
9+
10+
subscript(i: Int, j: Int) -> T {
11+
get {
12+
precondition(i*xdim + j < self.m.count, "Index out of matrix bounds \(i) \(j)")
13+
14+
return self.m[i*xdim + j]
15+
}
16+
set {
17+
self.m[i*xdim + j] = newValue
18+
}
19+
}
20+
21+
public init(xdim: Int, ydim: Int) {
22+
self.xdim = xdim
23+
self.ydim = ydim
24+
self.m = [Any](repeating: 0.0, count: xdim*ydim) as! [T]
25+
}
26+
}
27+
28+
public struct Matrix4x4 {
29+
var m: [Double]
30+
31+
subscript(i: Int, j: Int) -> Double {
32+
get {
33+
precondition(i*4 + j < self.m.count, "Index out of matrix bounds \(i) \(j)")
34+
35+
return self.m[i*4 + j]
36+
}
37+
set {
38+
self.m[i*4 + j] = newValue
39+
}
40+
}
41+
42+
public init() {
43+
m = [Double](repeating: 0.0, count: 16)
44+
}
45+
46+
public static func identity() -> Matrix4x4 {
47+
var identity = Matrix4x4()
48+
49+
identity[0,0] = 1.0;
50+
identity[1,1] = 1.0;
51+
identity[2,2] = 1.0;
52+
identity[3,3] = 1.0;
53+
54+
return identity
55+
}
56+
57+
public func determinant() -> Double {
58+
let det = self[0,0] * self[1,1] * self[2,2] * self[3,3] +
59+
self[0,0] * self[1,2] * self[2,3] * self[3,1] +
60+
self[0,0] * self[1,3] * self[2,1] * self[3,2] +
61+
62+
self[0,1] * self[1,0] * self[2,3] * self[3,2] +
63+
self[0,1] * self[1,2] * self[2,1] * self[3,3] +
64+
self[0,1] * self[1,3] * self[2,2] * self[3,0] +
65+
66+
self[0,2] * self[1,0] * self[2,1] * self[3,3] +
67+
self[0,2] * self[1,1] * self[2,3] * self[3,0] +
68+
self[0,2] * self[1,3] * self[2,0] * self[3,0] +
69+
70+
self[0,3] * self[1,0] * self[2,2] * self[3,1] +
71+
self[0,3] * self[1,1] * self[2,0] * self[3,2] +
72+
self[0,3] * self[1,2] * self[2,1] * self[3,0] -
73+
74+
self[0,0] * self[1,1] * self[2,3] * self[3,2] -
75+
self[0,0] * self[1,2] * self[2,1] * self[3,3] -
76+
self[0,0] * self[1,3] * self[2,2] * self[3,1] -
77+
78+
self[0,1] * self[1,0] * self[2,2] * self[3,3] -
79+
self[0,1] * self[1,2] * self[2,3] * self[3,0] -
80+
self[0,1] * self[1,3] * self[2,0] * self[3,2] -
81+
82+
self[0,2] * self[1,0] * self[2,3] * self[3,1] -
83+
self[0,2] * self[1,1] * self[2,0] * self[3,3] -
84+
self[0,2] * self[1,3] * self[2,1] * self[3,0] -
85+
86+
self[0,3] * self[1,0] * self[2,1] * self[3,2] -
87+
self[0,3] * self[1,1] * self[2,2] * self[3,0] -
88+
self[0,3] * self[1,2] * self[2,0] * self[3,1]
89+
90+
return det
91+
}
92+
93+
public func inverse() -> Matrix4x4 {
94+
let det = self.determinant()
95+
precondition(det != 0, "Determinant is zero, unable to calculate inverse Matrix")
96+
97+
let inv_det = 1.0 / det
98+
var inverse = Matrix4x4()
99+
100+
inverse[0, 0] = (self[1,1] * self[2,2] * self[3,3] +
101+
self[1,2] * self[2,3] * self[3,1] +
102+
self[1,3] * self[2,1] * self[3,2] -
103+
self[1,1] * self[2,3] * self[3,2] -
104+
self[1,2] * self[2,1] * self[3,3] -
105+
self[1,3] * self[2,2] * self[3,1]) * inv_det;
106+
107+
inverse[0, 1] = (self[0,1] * self[2,3] * self[3,2] +
108+
self[0,2] * self[2,1] * self[3,3] +
109+
self[1,3] * self[2,2] * self[3,1] -
110+
self[0,1] * self[2,2] * self[3,3] -
111+
self[0,2] * self[2,3] * self[3,1] -
112+
self[0,3] * self[2,1] * self[3,2]) * inv_det;
113+
114+
inverse[0, 2] = (self[0,1] * self[1,2] * self[3,3] +
115+
self[0,2] * self[1,3] * self[3,1] +
116+
self[0,3] * self[1,1] * self[3,2] -
117+
self[0,1] * self[1,3] * self[3,2] -
118+
self[0,2] * self[1,1] * self[3,3] -
119+
self[0,3] * self[1,2] * self[3,1]) * inv_det;
120+
121+
inverse[0, 3] = (self[0,1] * self[1,3] * self[2,2] +
122+
self[0,2] * self[1,1] * self[2,3] +
123+
self[0,3] * self[1,2] * self[2,1] -
124+
self[0,1] * self[1,2] * self[2,3] -
125+
self[0,2] * self[1,3] * self[2,1] -
126+
self[0,3] * self[1,1] * self[2,2]) * inv_det;
127+
128+
inverse[1, 0] = (self[1,0] * self[2,3] * self[3,2] +
129+
self[1,2] * self[2,0] * self[3,3] +
130+
self[1,3] * self[2,2] * self[3,1] -
131+
self[1,0] * self[2,2] * self[3,3] -
132+
self[1,2] * self[2,3] * self[3,1] -
133+
self[1,3] * self[2,0] * self[3,2]) * inv_det;
134+
135+
inverse[1, 1] = (self[0,0] * self[2,2] * self[3,3] +
136+
self[0,2] * self[2,3] * self[3,1] +
137+
self[0,3] * self[2,0] * self[3,2] -
138+
self[0,0] * self[2,3] * self[3,2] -
139+
self[0,2] * self[2,0] * self[3,3] -
140+
self[0,3] * self[2,2] * self[3,0]) * inv_det;
141+
142+
143+
inverse[1, 2] = (self[0,0] * self[1,3] * self[3,2] +
144+
self[0,2] * self[1,0] * self[3,3] +
145+
self[0,3] * self[1,2] * self[3,1] -
146+
self[0,0] * self[1,2] * self[3,3] -
147+
self[0,2] * self[1,3] * self[3,0] -
148+
self[0,3] * self[1,0] * self[3,2]) * inv_det;
149+
150+
inverse[1, 3] = (self[0,0] * self[1,2] * self[2,3] +
151+
self[0,2] * self[1,3] * self[2,2] +
152+
self[0,3] * self[1,0] * self[2,2] -
153+
self[0,0] * self[1,3] * self[2,2] -
154+
self[0,2] * self[1,0] * self[2,3] -
155+
self[0,3] * self[1,2] * self[2,0]) * inv_det;
156+
157+
inverse[2, 0] = (self[1,0] * self[2,1] * self[3,3] +
158+
self[1,1] * self[2,3] * self[3,1] +
159+
self[1,3] * self[2,1] * self[3,2] -
160+
self[1,0] * self[2,3] * self[3,1] -
161+
self[1,1] * self[2,0] * self[3,3] -
162+
self[1,3] * self[2,1] * self[3,0]) * inv_det;
163+
164+
inverse[2, 1] = (self[0,0] * self[2,3] * self[3,1] +
165+
self[0,1] * self[2,0] * self[3,3] +
166+
self[0,3] * self[2,1] * self[3,1] -
167+
self[0,0] * self[2,1] * self[3,3] -
168+
self[0,1] * self[2,3] * self[3,0] -
169+
self[0,3] * self[2,0] * self[3,1]) * inv_det;
170+
171+
inverse[2, 2] = (self[0,0] * self[1,1] * self[3,3] +
172+
self[0,1] * self[1,3] * self[3,0] +
173+
self[0,3] * self[1,0] * self[3,1] -
174+
self[0,0] * self[1,3] * self[3,1] -
175+
self[0,1] * self[1,0] * self[3,3] -
176+
self[0,3] * self[1,1] * self[3,0]) * inv_det;
177+
178+
inverse[2, 3] = (self[0,0] * self[1,3] * self[2,1] +
179+
self[0,1] * self[1,0] * self[2,3] +
180+
self[0,3] * self[1,1] * self[2,0] -
181+
self[0,0] * self[1,1] * self[2,3] -
182+
self[0,1] * self[1,3] * self[2,0] -
183+
self[0,3] * self[1,0] * self[2,1]) * inv_det;
184+
185+
inverse[3, 0] = (self[1,0] * self[2,2] * self[3,1] +
186+
self[1,1] * self[2,0] * self[3,2] +
187+
self[1,2] * self[2,1] * self[3,0] -
188+
self[1,0] * self[2,1] * self[3,2] -
189+
self[1,1] * self[2,2] * self[3,0] -
190+
self[1,2] * self[2,0] * self[3,1]) * inv_det;
191+
192+
inverse[3, 1] = (self[0,0] * self[2,1] * self[3,2] +
193+
self[0,1] * self[2,2] * self[3,0] +
194+
self[0,2] * self[2,0] * self[3,2] -
195+
self[0,0] * self[2,2] * self[3,1] -
196+
self[0,1] * self[2,0] * self[3,2] -
197+
self[0,2] * self[2,1] * self[3,0]) * inv_det;
198+
199+
inverse[3, 2] = (self[0,0] * self[1,2] * self[3,1] +
200+
self[0,1] * self[1,0] * self[3,2] +
201+
self[0,2] * self[1,1] * self[3,0] -
202+
self[0,0] * self[1,1] * self[3,2] -
203+
self[0,1] * self[1,2] * self[3,0] -
204+
self[0,2] * self[1,0] * self[3,1]) * inv_det;
205+
206+
inverse[3, 3] = (self[0,0] * self[1,1] * self[2,2] +
207+
self[0,1] * self[1,2] * self[2,0] +
208+
self[0,2] * self[2,1] * self[2,1] -
209+
self[0,0] * self[1,2] * self[2,1] -
210+
self[0,1] * self[1,0] * self[2,2] -
211+
self[0,2] * self[1,1] * self[2,0]) * inv_det;
212+
213+
return inverse
214+
}
215+
}
216+
217+
public func * (a: Matrix4x4, b: Matrix4x4) -> Matrix4x4 {
218+
var c = Matrix4x4();
219+
220+
for i in 0..<4 {
221+
for j in 0..<4 {
222+
var ab: Double = 0.0;
223+
for k in 0..<4 {
224+
ab += a[i,k] * b[k,j];
225+
}
226+
227+
c[i, j] = ab;
228+
}
229+
}
230+
231+
return c
232+
}

0 commit comments

Comments
 (0)