mirror of
https://github.com/apple/swift.git
synced 2025-12-25 12:15:36 +01:00
The integer conversion operations were inlinable, but aren't getting inlined in debug builds, which results in unreasonably poor performance. Mark them as transparent so we don't end up with unspecialized generic code in the hot path. Fixes https://github.com/swiftlang/swift/issues/78501
27 lines
1012 B
Swift
27 lines
1012 B
Swift
// RUN: %target-swift-frontend -primary-file %s -emit-ir | %FileCheck %s
|
|
// RUN: %target-swift-frontend -primary-file %s -O -emit-ir | %FileCheck %s
|
|
// REQUIRES: CPU=x86_64 || CPU=arm64
|
|
|
|
// https://github.com/swiftlang/swift/issues/78501
|
|
public struct PcgRandom {
|
|
private var state: UInt64 = 0;
|
|
|
|
// CHECK-LABEL: define{{.*}}swiftcc i32 @"$s18integer_conversion9PcgRandomV6next32s6UInt32VyF"
|
|
public mutating func next32() -> UInt32 {
|
|
// CHECK-NOT: sSUss17FixedWidthIntegerRzrlEyxqd__cSzRd__lufC
|
|
// CHECK-NOT: sSZss17FixedWidthIntegerRzrlEyxqd__cSzRd__lufC
|
|
// CHECK: ret i32
|
|
let oldstate : UInt64 = state
|
|
state = oldstate &* 6364136223846793005 &+ 1;
|
|
let shifted = oldstate >> 18
|
|
let xor = shifted ^ oldstate
|
|
let xorshifted64 = xor >> 27
|
|
let xorshifted = UInt32((xorshifted64 << 32) >> 32)
|
|
let rot : UInt32 = UInt32(oldstate >> 59)
|
|
let nrot : UInt32 = UInt32(bitPattern: -Int32(rot))
|
|
return (xorshifted >> rot) | (xorshifted << (nrot & 31))
|
|
}
|
|
|
|
init() {}
|
|
}
|