Skip to content

Difference MIR output emitted from rustc 1.67 and rustc 1.70 #112878

Closed
@yanliu18

Description

@yanliu18

Code

I tried this code:

// add.rs
pub fn main() {
    let x = add();
    println!("1 + 2 = {x}")
}

fn add() -> i32 {
    let x = 1;
    let y = 2;
    x + y
}

Running rustc add.rs --emit mir produces different results.
I expected to see this happen (version info: rustc 1.68.0-nightly (afaf3e0 2023-01-14)) :

    bb0: {
        _1 = const 1_i32;                // scope 0 at assignments.rs:7:13: 7:14
        _2 = const 2_i32;                // scope 1 at assignments.rs:8:13: 8:14
        _0 = const 3_i32;                // scope 2 at assignments.rs:9:5: 9:10
        return;                          // scope 0 at assignments.rs:10:2: 10:2
    }

Instead, this happened (version info: rustc 1.72.0-nightly (fe7454b 2023-06-19))

    bb0: {
        _1 = const 1_i32;
        _2 = const 2_i32;
        _3 = CheckedAdd(_1, _2);
        assert(!move (_3.1: bool), "attempt to compute `{} + {}`, which would overflow", _1, _2) -> bb1;
    }

    bb1: {
        _0 = move (_3.0: i32);
        return;
    }

It seems ConstProp is removed from the newer rustc versions, by looking into dumped mir in the nightly build (version 1.68 and 1.72).

Is this change permanent? or if anyone could explain the reasons of removing? Thank you.

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-bugCategory: This is a bug.regression-untriagedUntriaged performance or correctness regression.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions