mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
53 lines
748 B
Swift
53 lines
748 B
Swift
protocol Proto {
|
|
func at() -> Int
|
|
}
|
|
|
|
@inline(never)
|
|
func testStackAllocation(p: Proto) -> Int {
|
|
var a = [p, p, p]
|
|
var b = 0
|
|
a.withUnsafeMutableBufferPointer {
|
|
let array = $0
|
|
for i in 0..<array.count {
|
|
b += array[i].at()
|
|
}
|
|
}
|
|
return b
|
|
}
|
|
|
|
class Foo : Proto {
|
|
init() {}
|
|
func at() -> Int{
|
|
return 1
|
|
}
|
|
}
|
|
|
|
@inline(never)
|
|
func work(f: Foo) -> Int {
|
|
var r = 0
|
|
for _ in 0..<100_000 {
|
|
r += testStackAllocation(f)
|
|
}
|
|
return r
|
|
}
|
|
|
|
@inline(never)
|
|
func hole(use: Int, _ N: Int) {
|
|
if (N == 0) {
|
|
print("use: \(use)")
|
|
}
|
|
}
|
|
|
|
public func run_StackPromo(N: Int) {
|
|
let foo = Foo()
|
|
var r = 0
|
|
for i in 0..<N {
|
|
if i % 2 == 0 {
|
|
r += work(foo)
|
|
} else {
|
|
r -= work(foo)
|
|
}
|
|
}
|
|
hole(r, N)
|
|
}
|