mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
* Implement Builtin.freeze for integer and integer-vector types. https://llvm.org/docs/LangRef.html#freeze-instruction > If the argument is undef or poison, ‘freeze’ returns an arbitrary, but fixed, value of type ‘ty’. Otherwise, this instruction is a no-op and returns the input argument. All uses of a value returned by the same ‘freeze’ instruction are guaranteed to always observe the same value, while different ‘freeze’ instructions may yield different values. It's most importation for integer and integer-vector types because floating-point results are generally not poison (except in the case of conversion from poison integer values). However, we might want to implement this for other types as well in the future. * Make builtin.freeze TrivialUse Also fix filecheck patterns for its test to work with asserts build.
53 lines
1.5 KiB
Swift
53 lines
1.5 KiB
Swift
// RUN: %target-swift-frontend -O -module-name builtin_freeze -enable-experimental-feature BuiltinModule -primary-file %s -emit-ir -o - | %FileCheck %s --check-prefix=CHECK
|
|
|
|
import Builtin
|
|
|
|
func fptosi(_ x: Float) -> Int32 {
|
|
Int32(Builtin.fptosi_FPIEEE32_Int32(x._value))
|
|
// CHECK: fptosi float %{{.+}} to i32
|
|
}
|
|
|
|
func fptosiWithFreeze(_ x: Float) -> Int32 {
|
|
Int32(Builtin.freeze_Int32(Builtin.fptosi_FPIEEE32_Int32(x._value)))
|
|
// CHECK: fptosi float %{{.+}} to i32
|
|
// CHECK-NEXT: freeze i32 %{{.+}}
|
|
}
|
|
|
|
func yuck() -> Int32 {
|
|
fptosi(0x1.0p32)
|
|
// CHECK: poison
|
|
}
|
|
|
|
func yum() -> Int32 {
|
|
fptosiWithFreeze(0x1.0p32)
|
|
// CHECK-NOT: poison
|
|
}
|
|
|
|
func fptosi(_ x: SIMD2<Float>) -> SIMD2<Int32> {
|
|
let maybePoison = Builtin.fptosi_Vec2xFPIEEE32_Vec2xInt32(x._storage._value)
|
|
var result = SIMD2<Int32>()
|
|
result._storage._value = maybePoison
|
|
return result
|
|
// CHECK: fptosi <2 x float> %{{.+}} to <2 x i32>
|
|
}
|
|
|
|
func fptosiWithFreeze(_ x: SIMD2<Float>) -> SIMD2<Int32> {
|
|
let maybePoison = Builtin.fptosi_Vec2xFPIEEE32_Vec2xInt32(x._storage._value)
|
|
let frozen = Builtin.freeze_Vec2xInt32(maybePoison)
|
|
var result = SIMD2<Int32>()
|
|
result._storage._value = frozen
|
|
return result
|
|
// CHECK: fptosi <2 x float> %{{.+}} to <2 x i32>
|
|
// CHECK-NEXT: freeze <2 x i32> %{{.+}}
|
|
}
|
|
|
|
func doubleYuck(_ x: SIMD2<Float>) -> SIMD2<Int32> {
|
|
fptosi(SIMD2<Float>(repeating: 0x1.0p32))
|
|
// CHECK: poison
|
|
}
|
|
|
|
func DoubleYum(_ x: SIMD2<Float>) -> SIMD2<Int32> {
|
|
fptosiWithFreeze(SIMD2<Float>(repeating: 0x1.0p32))
|
|
// CHECK-NOT: poison
|
|
}
|