From d3d6c126d36a7f772b595311368d7fcf51447cad Mon Sep 17 00:00:00 2001 From: human9000 Date: Thu, 30 Apr 2026 18:49:32 +0500 Subject: [PATCH] fix ice in ssa-range-prop It used to ICE when hitting an `assert_ne!(location.block, successor.block` due to hitting a self-dominating bb Fixed by checking *strict* domination instead of normal one --- .../rustc_mir_transform/src/ssa_range_prop.rs | 3 +-- .../mir/ssa-range-prop-bb-self-domination.rs | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 tests/ui/mir/ssa-range-prop-bb-self-domination.rs diff --git a/compiler/rustc_mir_transform/src/ssa_range_prop.rs b/compiler/rustc_mir_transform/src/ssa_range_prop.rs index 97ba07d90096..cd73471f20eb 100644 --- a/compiler/rustc_mir_transform/src/ssa_range_prop.rs +++ b/compiler/rustc_mir_transform/src/ssa_range_prop.rs @@ -163,8 +163,7 @@ fn visit_terminator(&mut self, terminator: &mut Terminator<'tcx>, location: Loca && self.is_ssa(place) => { let successor = Location { block: *target, statement_index: 0 }; - if location.dominates(successor, &self.dominators) { - assert_ne!(location.block, successor.block); + if location.strictly_dominates(successor, &self.dominators) { let val = *expected as u128; let range = WrappingRange { start: val, end: val }; self.insert_range(place, successor, range); diff --git a/tests/ui/mir/ssa-range-prop-bb-self-domination.rs b/tests/ui/mir/ssa-range-prop-bb-self-domination.rs new file mode 100644 index 000000000000..3f6249adc37e --- /dev/null +++ b/tests/ui/mir/ssa-range-prop-bb-self-domination.rs @@ -0,0 +1,22 @@ +/// Regression test for . +/// +/// SsaRangeProp pass used to fail the assert when encountering self-dominating block +/// e.g. small loops like in `a` + +//@ compile-flags: -Copt-level=2 +//@ build-pass + +use std::hint::black_box; +fn a(d: u8) { + loop { + 1 % d; + } +} +pub fn e(d: u8) { + if d == 0 || black_box(false) { + a(d); + } +} +fn main() { + e(1); +}