Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ICE: left: MutatingUse(Call), right: NonUse(VarDebugInfo) #110902

Open
cbeuw opened this issue Apr 27, 2023 · 9 comments
Open

ICE: left: MutatingUse(Call), right: NonUse(VarDebugInfo) #110902

cbeuw opened this issue Apr 27, 2023 · 9 comments
Labels
C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@cbeuw
Copy link
Contributor

cbeuw commented Apr 27, 2023

Code

The crash probably has something to do with an MIR back edge to a basic block terminated by a Call with RET as destination.

This can only be triggered with -Zmir-opt-level=2. For some reason it doesn't happen with -Zmir-opt-level=3

#![feature(custom_mir, core_intrinsics)]
extern crate core;
use core::intrinsics::mir::*;

pub fn a() -> char {
    'a'
}

#[custom_mir(dialect = "runtime", phase = "initial")]
pub fn ice(arg: char) -> char {
    mir! (
    let c: char;
    let discr: i32;
    {
        Goto(bb1)
    }
    bb1 = {
        RET = 'a';
        c = RET;
        Call(RET, bb2, a())
    }
    bb2 = {
        c = arg;
        RET = c;
        discr = 42;
        match discr {
            0 => bb1,
            _ => bb3
        }
    }
    bb3 = {
        Return()
    })
}

pub fn main() {
    ice('a');
}

Meta

rustc --version --verbose:

rustc 1.71.0-nightly (1c42cb4ef 2023-04-26)
binary: rustc
commit-hash: 1c42cb4ef0544fbfaa500216e53382d6b079c001
commit-date: 2023-04-26
host: aarch64-apple-darwin
release: 1.71.0-nightly
LLVM version: 16.0.2

Error output

thread 'rustc' panicked at 'assertion failed: `(left == right)`
  left: `MutatingUse(Call)`,
 right: `NonUse(VarDebugInfo)`', compiler/rustc_mir_transform/src/nrvo.rs:204:13
stack backtrace:
   0:        0x104e2d680 - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h2e4b316da8d1b868
   1:        0x104e7d624 - core::fmt::write::hee60b630fddd701c
   2:        0x104e23590 - std::io::Write::write_fmt::h7829782ffee0a74a
   3:        0x104e2d4e0 - std::sys_common::backtrace::print::h69a078fe21ab83fc
   4:        0x104e2fea0 - std::panicking::default_hook::{{closure}}::h5166913d03826b1e
   5:        0x104e2fca4 - std::panicking::default_hook::h4211b85bce80d367
   6:        0x10d2b7f80 - rustc_driver_impl[d2744e2f64f48052]::DEFAULT_HOOK::{closure#0}::{closure#0}
   7:        0x104e30494 - std::panicking::rust_panic_with_hook::h4c1dd5e7fe26462e
   8:        0x104e302a8 - std::panicking::begin_panic_handler::{{closure}}::h0964cad812c6bc09
   9:        0x104e2da7c - std::sys_common::backtrace::__rust_end_short_backtrace::h18678632515b788f
  10:        0x104e3003c - _rust_begin_unwind
  11:        0x104ea8e98 - core::panicking::panic_fmt::hd45ba9707abd3d04
  12:        0x104ea9200 - core::panicking::assert_failed_inner::h6f72dad26ebd5426
  13:        0x11156b27c - core[13006027e59f563b]::panicking::assert_failed::<rustc_middle[4bd1076e66066330]::mir::visit::PlaceContext, rustc_middle[4bd1076e66066330]::mir::visit::PlaceContext>
  14:        0x10fa2cdf4 - <rustc_mir_transform[ac6be147cdb829a7]::nrvo::RenameToReturnPlace as rustc_middle[4bd1076e66066330]::mir::visit::MutVisitor>::visit_place
  15:        0x10fa342ec - <rustc_mir_transform[ac6be147cdb829a7]::nrvo::RenameReturnPlace as rustc_middle[4bd1076e66066330]::mir::MirPass>::run_pass
  16:        0x10fb0057c - rustc_mir_transform[ac6be147cdb829a7]::pass_manager::run_passes_inner
  17:        0x10f9f9e08 - rustc_mir_transform[ac6be147cdb829a7]::optimized_mir
  18:        0x110406b40 - rustc_query_system[dfd69d1f88b4517]::query::plumbing::try_execute_query::<rustc_query_impl[4fb062e88122548a]::queries::optimized_mir, rustc_query_impl[4fb062e88122548a]::plumbing::QueryCtxt>
  19:        0x11065bed8 - <rustc_query_impl[4fb062e88122548a]::Queries as rustc_middle[4bd1076e66066330]::ty::query::QueryEngine>::optimized_mir
  20:        0x1111c9c34 - <rustc_middle[4bd1076e66066330]::ty::context::TyCtxt>::instance_mir
  21:        0x10f995a58 - rustc_monomorphize[6f51a5b3b0e2afbf]::collector::collect_neighbours
  22:        0x10f994368 - rustc_monomorphize[6f51a5b3b0e2afbf]::collector::collect_items_rec
  23:        0x10f9b5ab0 - <core[13006027e59f563b]::panic::unwind_safe::AssertUnwindSafe<rustc_data_structures[a04248f14933d50e]::sync::par_for_each_in<alloc[4d30c02dd49f99e9]::vec::Vec<rustc_middle[4bd1076e66066330]::mir::mono::MonoItem>, rustc_monomorphize[6f51a5b3b0e2afbf]::collector::collect_crate_mono_items::{closure#1}::{closure#0}>::{closure#0}::{closure#0}> as core[13006027e59f563b]::ops::function::FnOnce<()>>::call_once
  24:        0x10f9a8fa8 - rustc_data_structures[a04248f14933d50e]::sync::par_for_each_in::<alloc[4d30c02dd49f99e9]::vec::Vec<rustc_middle[4bd1076e66066330]::mir::mono::MonoItem>, rustc_monomorphize[6f51a5b3b0e2afbf]::collector::collect_crate_mono_items::{closure#1}::{closure#0}>
  25:        0x10f9b4258 - <rustc_session[a15cea41fa418eb5]::session::Session>::time::<(), rustc_monomorphize[6f51a5b3b0e2afbf]::collector::collect_crate_mono_items::{closure#1}>
  26:        0x10f992828 - rustc_monomorphize[6f51a5b3b0e2afbf]::collector::collect_crate_mono_items
  27:        0x10f9a63a8 - rustc_monomorphize[6f51a5b3b0e2afbf]::partitioning::collect_and_partition_mono_items
  28:        0x1104cf96c - rustc_query_system[dfd69d1f88b4517]::query::plumbing::try_execute_query::<rustc_query_impl[4fb062e88122548a]::queries::collect_and_partition_mono_items, rustc_query_impl[4fb062e88122548a]::plumbing::QueryCtxt>
  29:        0x1106710c8 - <rustc_query_impl[4fb062e88122548a]::Queries as rustc_middle[4bd1076e66066330]::ty::query::QueryEngine>::collect_and_partition_mono_items
  30:        0x1107563ec - rustc_codegen_ssa[fd6d44b2de446342]::back::symbol_export::exported_symbols_provider_local
  31:        0x110430a8c - rustc_query_system[dfd69d1f88b4517]::query::plumbing::try_execute_query::<rustc_query_impl[4fb062e88122548a]::queries::exported_symbols, rustc_query_impl[4fb062e88122548a]::plumbing::QueryCtxt>
  32:        0x110670f04 - <rustc_query_impl[4fb062e88122548a]::Queries as rustc_middle[4bd1076e66066330]::ty::query::QueryEngine>::exported_symbols
  33:        0x110a1e08c - <rustc_metadata[6e54bd569d7c9f96]::rmeta::encoder::EncodeContext>::encode_crate_root
  34:        0x110a29000 - rustc_metadata[6e54bd569d7c9f96]::rmeta::encoder::encode_metadata_impl
  35:        0x1109fc580 - rustc_data_structures[a04248f14933d50e]::sync::join::<rustc_metadata[6e54bd569d7c9f96]::rmeta::encoder::encode_metadata::{closure#0}, rustc_metadata[6e54bd569d7c9f96]::rmeta::encoder::encode_metadata::{closure#1}, (), ()>
  36:        0x110a28824 - rustc_metadata[6e54bd569d7c9f96]::rmeta::encoder::encode_metadata
  37:        0x110a0dcf8 - rustc_metadata[6e54bd569d7c9f96]::fs::encode_and_write_metadata
  38:        0x10d3638cc - rustc_interface[87946e0f114a4094]::passes::start_codegen
  39:        0x10d36ad94 - <rustc_middle[4bd1076e66066330]::ty::context::GlobalCtxt>::enter::<<rustc_interface[87946e0f114a4094]::queries::Queries>::ongoing_codegen::{closure#0}::{closure#0}, core[13006027e59f563b]::result::Result<alloc[4d30c02dd49f99e9]::boxed::Box<dyn core[13006027e59f563b]::any::Any>, rustc_span[a7e895295122ec2d]::ErrorGuaranteed>>
  40:        0x10d31addc - <rustc_interface[87946e0f114a4094]::queries::Queries>::ongoing_codegen
  41:        0x10d29497c - <rustc_interface[87946e0f114a4094]::interface::Compiler>::enter::<rustc_driver_impl[d2744e2f64f48052]::run_compiler::{closure#1}::{closure#2}, core[13006027e59f563b]::result::Result<core[13006027e59f563b]::option::Option<rustc_interface[87946e0f114a4094]::queries::Linker>, rustc_span[a7e895295122ec2d]::ErrorGuaranteed>>
  42:        0x10d259430 - <scoped_tls[c0382597cdb10fcc]::ScopedKey<rustc_span[a7e895295122ec2d]::SessionGlobals>>::set::<rustc_interface[87946e0f114a4094]::interface::run_compiler<core[13006027e59f563b]::result::Result<(), rustc_span[a7e895295122ec2d]::ErrorGuaranteed>, rustc_driver_impl[d2744e2f64f48052]::run_compiler::{closure#1}>::{closure#0}, core[13006027e59f563b]::result::Result<(), rustc_span[a7e895295122ec2d]::ErrorGuaranteed>>
  43:        0x10d2649e4 - std[c618651f4d1565b5]::sys_common::backtrace::__rust_begin_short_backtrace::<rustc_interface[87946e0f114a4094]::util::run_in_thread_pool_with_globals<rustc_interface[87946e0f114a4094]::interface::run_compiler<core[13006027e59f563b]::result::Result<(), rustc_span[a7e895295122ec2d]::ErrorGuaranteed>, rustc_driver_impl[d2744e2f64f48052]::run_compiler::{closure#1}>::{closure#0}, core[13006027e59f563b]::result::Result<(), rustc_span[a7e895295122ec2d]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[13006027e59f563b]::result::Result<(), rustc_span[a7e895295122ec2d]::ErrorGuaranteed>>
  44:        0x10d254c20 - <<std[c618651f4d1565b5]::thread::Builder>::spawn_unchecked_<rustc_interface[87946e0f114a4094]::util::run_in_thread_pool_with_globals<rustc_interface[87946e0f114a4094]::interface::run_compiler<core[13006027e59f563b]::result::Result<(), rustc_span[a7e895295122ec2d]::ErrorGuaranteed>, rustc_driver_impl[d2744e2f64f48052]::run_compiler::{closure#1}>::{closure#0}, core[13006027e59f563b]::result::Result<(), rustc_span[a7e895295122ec2d]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[13006027e59f563b]::result::Result<(), rustc_span[a7e895295122ec2d]::ErrorGuaranteed>>::{closure#1} as core[13006027e59f563b]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
  45:        0x104e38be4 - std::sys::unix::thread::Thread::new::thread_start::hd4c5932775b29ea0
  46:        0x187e6bfa8 - __pthread_joiner_wake

error: the compiler unexpectedly panicked. this is a bug.

note: we would appreciate a bug report: https://github.com/rust-lang/rust/issues/new?labels=C-bug%2C+I-ICE%2C+T-compiler&template=ice.md

note: rustc 1.71.0-nightly (1c42cb4ef 2023-04-26) running on aarch64-apple-darwin

note: compiler flags: --crate-type lib -Z mir-opt-level=2

query stack during panic:
#0 [optimized_mir] optimizing MIR for `ice`
#1 [collect_and_partition_mono_items] collect_and_partition_mono_items
#2 [exported_symbols] collecting exported symbols for crate `0`
end of query stack
warning: 1 warning emitted
@cbeuw cbeuw added C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 27, 2023
@matthiaskrgr
Copy link
Member

Regression in rust-lang-ci@03c4280
#105814 🤷

@cbeuw
Copy link
Contributor Author

cbeuw commented Apr 28, 2023

@matthiaskrgr If you're saying my custom MIR is invalid and may never be generated by the normal pipeline, then it should be documented and ideally picked up by the validation pass.

In any case, the problematic MIR can be generated from normal Rust and trigger the same ICE with -Zmir-opt-level=3, so the bug is not in my custom MIR, and one has to look at MIR anyway to debug it 🤷

pub fn a() -> i32 {
    1
}
pub fn b(_: i32) {}

pub fn ice(arg: i32, discr: bool) -> i32 {
    loop {
        let mut c = 1;
        let mut ret = a();

        c = !arg;
        ret = c;
        if discr {
            b(c);
            return ret;
        }
    }
}

pub fn main() {
    ice(1, false);
}

@cbeuw
Copy link
Contributor Author

cbeuw commented Apr 28, 2023

cc @cjgillot and @JakobDegen who seem to know quite a bit about MIR optimisations? (I don't really know who's worked on these 😅)

@JakobDegen
Copy link
Contributor

I see fuzzing is working :) . I'll take a look tonight

@JakobDegen
Copy link
Contributor

Oh, and to confirm, yes - validation missing Mir that is not well-formed is a bug too, at least to the extent that that limitation of the validator is not known and clearly documented.

@matthiaskrgr
Copy link
Member

Sorry, what I ment is this has always been crashing at least since custom mir supported it.
From what I remember custom mir was kind of an internal feature so crashes are expected.
@JakobDegen do we expect rustc to not crash on custon mir / core _intrinsics?
I have seen probably already 15-20 custom mir ices but as far as I remember there were not really worth reporting, is that wrong?

@JakobDegen
Copy link
Contributor

@matthiaskrgr custom_mir is definitely expected to cause ICEs in some cases - it depends on the type of ICE and it requires a little bit of domain knowledge to figure out which ones are ok and which ones aren't. In this case, the important point is that this there's no ICE up to and through the point where Mir validation initially runs at the Runtime::Initial phase. That's supposed to (approximately) mean that the Mir is fine, and so the fact that the ICE appears later is a good sign that this is an actual bug

@JakobDegen
Copy link
Contributor

JakobDegen commented Apr 30, 2023

Found #111005 while looking at this - not the exact same issue though

@JakobDegen
Copy link
Contributor

The linked PR disables the opt, which will mitigate the ICE. As I said there, the pass makes some sketchy assumptions, so this is not a super straight-forward fix. I'm not going to be looking at this though, someone else is free to pick it up.

bors added a commit to rust-lang-ci/rust that referenced this issue May 8, 2023
Disable nrvo mir opt

See rust-lang#111005 and rust-lang#110902 . The ICE can definitely be hit on stable, the miscompilation I'm not sure about. The pass makes some pretty sketchy assumptions though, and we should not have it on while that's the case.

I'm not going to work on actually fixing this, it's probably not excessively difficult though.

r? rust-lang/mir-opt
cbeuw added a commit to cbeuw/rustlantis that referenced this issue Jun 18, 2023
bors added a commit to rust-lang-ci/rust that referenced this issue Oct 8, 2023
Fortify and re-enable RNVO MIR opt

Fixes rust-lang#111005
Fixes rust-lang#110902

This PR re-enables NRVO opt that had been disabled in rust-lang#111007

To look for RVO opportunities, we walk the MIR backwards from `return` terminators. In addition to the former implementation, we look at all the traversed statements and terminators for writes. If a local is written-to or moved-from, we discard it from the RVO candidates (`assigned_locals` bitset). If we see an indirect write or move, we discard all borrowed locals from candidates.

cc `@JakobDegen`
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants