Skip to content

[ICE]: ssa_range_prop.rs:168:25: assertion left != right failed on opt-level 2 #155836

@lmaltsis

Description

@lmaltsis

Code

fn a(b : usize) -> usize {
  while
    0 != 2 { b % b; }
  b
}
fn c(d : usize, b : usize) -> usize{a(d)} fn e(d : usize)->usize {
  loop {
    let f = d % 1;
    if d
      == f || 5 == 1 {
        if c (d, d)
          == d {}
      }
  }
}
fn main() { println !("{}", e(2)) }

Meta

Triggers with -C opt-level=2 and above

rustc --version --verbose:

rustc 1.97.0-nightly (c7fe5e9d1 2026-04-26)
binary: rustc
commit-hash: c7fe5e9d1eb0ef8cc033961956d60f8e2e91e741
commit-date: 2026-04-26
host: x86_64-unknown-linux-gnu
release: 1.97.0-nightly
LLVM version: 22.1.2

Also triggers on stable: https://godbolt.org/z/vroWrhjoz

Error output

$ rustc -C opt-level=2 /tmp/bug.rs
warning: unused variable: `b`
 --> /tmp/bug.rs:6:17
  |
6 | fn c(d : usize, b : usize) -> usize{a(d)} fn e(d : usize)->usize {
  |                 ^ help: if this is intentional, prefix it with an underscore: `_b`
  |
  = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default

warning: unused arithmetic operation that must be used
 --> /tmp/bug.rs:3:14
  |
3 |     0 != 2 { b % b; }
  |              ^^^^^ the arithmetic operation produces a value
  |
  = note: `#[warn(unused_must_use)]` (part of `#[warn(unused)]`) on by default
help: use `let _ = ...` to ignore the resulting value
  |
3 |     0 != 2 { let _ = b % b; }
  |              +++++++


thread 'rustc' (3580136) panicked at compiler/rustc_mir_transform/src/ssa_range_prop.rs:168:25:
assertion `left != right` failed
  left: bb7
 right: bb7
[... stacktrace]
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: please make sure that you have updated to the latest nightly

note: please attach the file at `/home/lmaltsis/research/templfuzz-internal/rustc-ice-2026-04-26T16_40_23-3644669.txt` to your bug report

note: rustc 1.97.0-nightly (c7fe5e9d1 2026-04-26) running on x86_64-unknown-linux-gnu

note: compiler flags: -C opt-level=2

query stack during panic:
#0 [optimized_mir] optimizing MIR for `e`
#1 [cross_crate_inlinable] whether the item should be made inlinable across crates
#2 [optimized_mir] optimizing MIR for `main`
#3 [items_of_instance] collecting items used by `main`
#4 [collect_and_partition_mono_items] collect_and_partition_mono_items
end of query stack
warning: 2 warnings emitted
Backtrace

stack backtrace:
   0: __rustc::rust_begin_unwind
   1: core::panicking::panic_fmt
   2: core::panicking::assert_failed_inner
   3: core::panicking::assert_failed::<rustc_middle::mir::BasicBlock, rustc_middle::mir::BasicBlock>
   4: <rustc_mir_transform::ssa_range_prop::RangeSet as rustc_middle::mir::visit::MutVisitor>::visit_terminator
   5: <rustc_mir_transform::ssa_range_prop::SsaRangePropagation as rustc_mir_transform::pass_manager::MirPass>::run_pass
   6: rustc_mir_transform::pass_manager::run_passes_inner
   7: rustc_mir_transform::run_optimization_passes
   8: rustc_mir_transform::optimized_mir
      [... omitted 2 frames ...]
   9: rustc_mir_transform::cross_crate_inline::cross_crate_inlinable
      [... omitted 2 frames ...]
  10: rustc_mir_transform::inline::process_blocks::<rustc_mir_transform::inline::NormalInliner>
  11: <rustc_mir_transform::inline::Inline as rustc_mir_transform::pass_manager::MirPass>::run_pass
  12: rustc_mir_transform::pass_manager::run_passes_inner
  13: rustc_mir_transform::run_optimization_passes
  14: rustc_mir_transform::optimized_mir
      [... omitted 2 frames ...]
  15: <rustc_middle::ty::context::TyCtxt>::instance_mir
  16: rustc_monomorphize::collector::items_of_instance
      [... omitted 2 frames ...]
  17: rustc_monomorphize::collector::collect_items_rec
  18: rustc_monomorphize::collector::collect_items_root
  19: <rustc_data_structures::sync::parallel::ParallelGuard>::run::<(), rustc_data_structures::sync::parallel::par_for_each_in<rustc_middle::mono::MonoItem, alloc::vec::Vec<rustc_middle::mono::MonoItem>, rustc_monomorphize::collector::collect_crate_mono_items::{closure#1}::{closure#0}>::{closure#0}::{closure#1}::{closure#0}>
  20: <alloc::vec::into_iter::IntoIter<rustc_middle::mono::MonoItem> as core::iter::traits::iterator::Iterator>::fold::<(), core::iter::traits::iterator::Iterator::for_each::call<rustc_middle::mono::MonoItem, rustc_data_structures::sync::parallel::par_for_each_in<rustc_middle::mono::MonoItem, alloc::vec::Vec<rustc_middle::mono::MonoItem>, rustc_monomorphize::collector::collect_crate_mono_items::{closure#1}::{closure#0}>::{closure#0}::{closure#1}>::{closure#0}>
  21: rustc_data_structures::sync::parallel::par_for_each_in::<rustc_middle::mono::MonoItem, alloc::vec::Vec<rustc_middle::mono::MonoItem>, rustc_monomorphize::collector::collect_crate_mono_items::{closure#1}::{closure#0}>
  22: <rustc_session::session::Session>::time::<(), rustc_monomorphize::collector::collect_crate_mono_items::{closure#1}>
  23: rustc_monomorphize::collector::collect_crate_mono_items
  24: rustc_monomorphize::partitioning::collect_and_partition_mono_items
      [... omitted 2 frames ...]
  25: rustc_codegen_ssa::base::codegen_crate::<rustc_codegen_llvm::LlvmCodegenBackend>
  26: <rustc_codegen_llvm::LlvmCodegenBackend as rustc_codegen_ssa::traits::backend::CodegenBackend>::codegen_crate
  27: <rustc_session::session::Session>::time::<alloc::boxed::Box<dyn core::any::Any>, rustc_interface::passes::start_codegen::{closure#0}>
  28: rustc_interface::passes::start_codegen
  29: <rustc_interface::queries::Linker>::codegen_and_build_linker
  30: <std::thread::local::LocalKey<core::cell::Cell<*const ()>>>::with::<rustc_middle::ty::context::tls::enter_context<<rustc_middle::ty::context::GlobalCtxt>::enter<rustc_interface::passes::create_and_enter_global_ctxt<core::option::Option<rustc_interface::queries::Linker>, rustc_driver_impl::run_compiler::{closure#0}::{closure#2}>::{closure#2}, core::option::Option<rustc_interface::queries::Linker>>::{closure#1}, core::option::Option<rustc_interface::queries::Linker>>::{closure#0}, core::option::Option<rustc_interface::queries::Linker>>
  31: <rustc_middle::ty::context::TyCtxt>::create_global_ctxt::<core::option::Option<rustc_interface::queries::Linker>, rustc_interface::passes::create_and_enter_global_ctxt<core::option::Option<rustc_interface::queries::Linker>, rustc_driver_impl::run_compiler::{closure#0}::{closure#2}>::{closure#2}>
  32: rustc_interface::passes::create_and_enter_global_ctxt::<core::option::Option<rustc_interface::queries::Linker>, rustc_driver_impl::run_compiler::{closure#0}::{closure#2}>
  33: <scoped_tls::ScopedKey<rustc_span::SessionGlobals>>::set::<rustc_interface::util::run_in_thread_with_globals<rustc_interface::util::run_in_thread_pool_with_globals<rustc_interface::interface::run_compiler<(), rustc_driver_impl::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}::{closure#0}, ()>
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

Metadata

Metadata

Assignees

Labels

A-mir-optArea: MIR optimizationsC-bugCategory: This is a bug.I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️P-mediumMedium priorityS-has-bisectionStatus: A bisection has been found for this issueS-has-mcveStatus: A Minimal Complete and Verifiable Example has been found for this issueT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.regression-from-stable-to-stablePerformance or correctness regression from one stable version to another.

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions