Files
swift-mirror/test/IRGen/builtin_freeze.swift
Stephen Canon 396b055369 Implement Builtin.freeze for integer and integer-vector types. (#73519)
* 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.
2024-05-09 06:41:02 -04:00

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
}