[llvm] clarify NaN propagation in fptrunc (PR #68554)

Ralf Jung via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 11 22:53:21 PDT 2023


RalfJung wrote:

Without the fix, this Rust function would be allowed to return `false`
```rust
pub fn test() -> bool {
    let snan = f64::from_bits(0x7FF0_0000_0000_0001u64);
    assert!(snan.is_nan());
    let nan = snan as f32;
    nan.is_nan()
}
```
That's roughly the following IR
```
define noundef zeroext i1 @example::test() unnamed_addr #0 !dbg !7 {
start:
  %0 = alloca double, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %0), !dbg !12
  store double 0x7FF0000000000001, ptr %0, align 8, !dbg !12
  %_2 = load double, ptr %0, align 8, !dbg !12
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %0), !dbg !12
  %nan = fptrunc double %_2 to float, !dbg !18
  %_0 = fcmp uno float %nan, 0.000000e+00, !dbg !21
  ret i1 %_0, !dbg !29
}
```

https://github.com/llvm/llvm-project/pull/68554


More information about the llvm-commits mailing list