Jump threading MIR opt unsoundly uses bitpattern equality for floats #128243
Closed
Description
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:
-0 true
-0
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