diff options
| author | Camille GILLOT <gillot.camille@gmail.com> | 2023-05-19 17:41:04 +0000 |
|---|---|---|
| committer | Camille GILLOT <gillot.camille@gmail.com> | 2023-08-16 18:12:18 +0000 |
| commit | 6cf15d4cb5bf00bb17b3b8c23a76cc755d082026 (patch) | |
| tree | 652b5557fa95420353f62f14c7c18870b267e0c3 /compiler/rustc_mir_dataflow/src/framework/lattice.rs | |
| parent | f19cd3f2e1fee3679f6596423a0f0c04f793f1b7 (diff) | |
| download | rust-6cf15d4cb5bf00bb17b3b8c23a76cc755d082026.tar.gz rust-6cf15d4cb5bf00bb17b3b8c23a76cc755d082026.zip | |
Rename MaybeUnreachable.
Diffstat (limited to 'compiler/rustc_mir_dataflow/src/framework/lattice.rs')
| -rw-r--r-- | compiler/rustc_mir_dataflow/src/framework/lattice.rs | 55 |
1 files changed, 30 insertions, 25 deletions
diff --git a/compiler/rustc_mir_dataflow/src/framework/lattice.rs b/compiler/rustc_mir_dataflow/src/framework/lattice.rs index 72ebf5754be..3b89598d289 100644 --- a/compiler/rustc_mir_dataflow/src/framework/lattice.rs +++ b/compiler/rustc_mir_dataflow/src/framework/lattice.rs @@ -273,69 +273,75 @@ impl<T> HasTop for FlatSet<T> { const TOP: Self = Self::Top; } +/// Extend a lattice with a bottom value to represent an unreachable execution. +/// +/// The only useful action on an unreachable state is joining it with a reachable one to make it +/// reachable. All other actions, gen/kill for instance, are no-ops. #[derive(PartialEq, Eq, Debug)] -pub enum MaybeUnreachable<T> { +pub enum MaybeReachable<T> { Unreachable, Reachable(T), } -impl<T> MaybeUnreachable<T> { +impl<T> MaybeReachable<T> { pub fn is_reachable(&self) -> bool { - matches!(self, MaybeUnreachable::Reachable(_)) + matches!(self, MaybeReachable::Reachable(_)) } } -impl<T> HasBottom for MaybeUnreachable<T> { - const BOTTOM: Self = MaybeUnreachable::Unreachable; +impl<T> HasBottom for MaybeReachable<T> { + const BOTTOM: Self = MaybeReachable::Unreachable; } -impl<T: HasTop> HasTop for MaybeUnreachable<T> { - const TOP: Self = MaybeUnreachable::Reachable(T::TOP); +impl<T: HasTop> HasTop for MaybeReachable<T> { + const TOP: Self = MaybeReachable::Reachable(T::TOP); } -impl<S> MaybeUnreachable<S> { +impl<S> MaybeReachable<S> { + /// Return whether the current state contains the given element. If the state is unreachable, + /// it does no contain anything. pub fn contains<T>(&self, elem: T) -> bool where S: BitSetExt<T>, { match self { - MaybeUnreachable::Unreachable => false, - MaybeUnreachable::Reachable(set) => set.contains(elem), + MaybeReachable::Unreachable => false, + MaybeReachable::Reachable(set) => set.contains(elem), } } } -impl<T, S: BitSetExt<T>> BitSetExt<T> for MaybeUnreachable<S> { +impl<T, S: BitSetExt<T>> BitSetExt<T> for MaybeReachable<S> { fn contains(&self, elem: T) -> bool { self.contains(elem) } fn union(&mut self, other: &HybridBitSet<T>) { match self { - MaybeUnreachable::Unreachable => {} - MaybeUnreachable::Reachable(set) => set.union(other), + MaybeReachable::Unreachable => {} + MaybeReachable::Reachable(set) => set.union(other), } } fn subtract(&mut self, other: &HybridBitSet<T>) { match self { - MaybeUnreachable::Unreachable => {} - MaybeUnreachable::Reachable(set) => set.subtract(other), + MaybeReachable::Unreachable => {} + MaybeReachable::Reachable(set) => set.subtract(other), } } } -impl<V: Clone> Clone for MaybeUnreachable<V> { +impl<V: Clone> Clone for MaybeReachable<V> { fn clone(&self) -> Self { match self { - MaybeUnreachable::Reachable(x) => MaybeUnreachable::Reachable(x.clone()), - MaybeUnreachable::Unreachable => MaybeUnreachable::Unreachable, + MaybeReachable::Reachable(x) => MaybeReachable::Reachable(x.clone()), + MaybeReachable::Unreachable => MaybeReachable::Unreachable, } } fn clone_from(&mut self, source: &Self) { match (&mut *self, source) { - (MaybeUnreachable::Reachable(x), MaybeUnreachable::Reachable(y)) => { + (MaybeReachable::Reachable(x), MaybeReachable::Reachable(y)) => { x.clone_from(&y); } _ => *self = source.clone(), @@ -343,17 +349,16 @@ impl<V: Clone> Clone for MaybeUnreachable<V> { } } -impl<T: JoinSemiLattice + Clone> JoinSemiLattice for MaybeUnreachable<T> { +impl<T: JoinSemiLattice + Clone> JoinSemiLattice for MaybeReachable<T> { fn join(&mut self, other: &Self) -> bool { + // Unreachable acts as a bottom. match (&mut *self, &other) { - (_, MaybeUnreachable::Unreachable) => false, - (MaybeUnreachable::Unreachable, _) => { + (_, MaybeReachable::Unreachable) => false, + (MaybeReachable::Unreachable, _) => { *self = other.clone(); true } - (MaybeUnreachable::Reachable(this), MaybeUnreachable::Reachable(other)) => { - this.join(other) - } + (MaybeReachable::Reachable(this), MaybeReachable::Reachable(other)) => this.join(other), } } } |
