Skip to content

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

Labels

A-mir-optArea: MIR optimizationsC-bugCategory: This is a bug.I-unsoundIssue: A soundness hole (worst kind of bug), see: https://en.wikipedia.org/wiki/SoundnessP-criticalCritical priorityT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions