Jump threading MIR opt unsoundly uses bitpattern equality for floats
I tried this code (sorry, I cannot reproduce it without inari ATM):
use inari::{Interval as I, const_interval}; fn f(u: I) -> f64 { let t = u.inf() == 0.; // let t = u.inf() == -0.; // println!("{}", t); if t { 1. } else { println!("{} {}", u.inf(), u.inf() == 0.); u.inf() } } fn main() { println!("{}", f(const_interval!(0., 0.))); }
I expected to see this happen: 1
Instead, in --release mode, I got:
If I uncomment one of the above commented lines, the code executes correctly.
Meta
This happens with both
rustc --version --verbose:
rustc 1.82.0-nightly (7120fdac7 2024-07-25)
binary: rustc
commit-hash: 7120fdac7a6e55a5e4b606256042890b36067052
commit-date: 2024-07-25
host: x86_64-unknown-linux-gnu
release: 1.82.0-nightly
LLVM version: 18.1.7
and
rustc 1.80.0 (051478957 2024-07-21)
binary: rustc
commit-hash: 051478957371ee0084a7c0913941d2a8c4757bb9
commit-date: 2024-07-21
host: x86_64-unknown-linux-gnu
release: 1.80.0
LLVM version: 18.1.7