From b8fed2f21c505ed73e238c4c47fdad6d47283475 Mon Sep 17 00:00:00 2001 From: Camille GILLOT Date: Mon, 29 May 2023 10:29:54 +0000 Subject: [PATCH] Make dataflow const-prop handle_switch_int monotonic. --- .../src/dataflow_const_prop.rs | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/compiler/rustc_mir_transform/src/dataflow_const_prop.rs b/compiler/rustc_mir_transform/src/dataflow_const_prop.rs index 60501165176..8f4dc9f69e9 100644 --- a/compiler/rustc_mir_transform/src/dataflow_const_prop.rs +++ b/compiler/rustc_mir_transform/src/dataflow_const_prop.rs @@ -257,14 +257,17 @@ impl<'tcx> ValueAnalysis<'tcx> for ConstAnalysis<'_, 'tcx> { ValueOrPlace::Value(value) => value, ValueOrPlace::Place(place) => state.get_idx(place, self.map()), }; - let FlatSet::Elem(ScalarTy(scalar, _)) = value else { - // Do nothing if we don't know which branch will be taken. - return TerminatorEdges::SwitchInt { discr, targets }; - }; - - let int = scalar.assert_int(); - let choice = int.assert_bits(int.size()); - TerminatorEdges::Single(targets.target_for_value(choice)) + match value { + // We are branching on uninitialized data, this is UB, treat it as unreachable. + // This allows the set of visited edges to grow monotonically with the lattice. + FlatSet::Bottom => TerminatorEdges::None, + FlatSet::Elem(ScalarTy(scalar, _)) => { + let int = scalar.assert_int(); + let choice = int.assert_bits(int.size()); + TerminatorEdges::Single(targets.target_for_value(choice)) + } + FlatSet::Top => TerminatorEdges::SwitchInt { discr, targets }, + } } }