summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_mir_transform/src/simplify.rs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_mir_transform/src/simplify.rs')
-rw-r--r--compiler/rustc_mir_transform/src/simplify.rs66
1 files changed, 48 insertions, 18 deletions
diff --git a/compiler/rustc_mir_transform/src/simplify.rs b/compiler/rustc_mir_transform/src/simplify.rs
index c79e1cf08..e59219321 100644
--- a/compiler/rustc_mir_transform/src/simplify.rs
+++ b/compiler/rustc_mir_transform/src/simplify.rs
@@ -29,20 +29,38 @@
use crate::MirPass;
use rustc_data_structures::fx::{FxHashSet, FxIndexSet};
-use rustc_index::vec::{Idx, IndexSlice, IndexVec};
+use rustc_index::{Idx, IndexSlice, IndexVec};
use rustc_middle::mir::coverage::*;
use rustc_middle::mir::visit::{MutVisitor, MutatingUseContext, PlaceContext, Visitor};
use rustc_middle::mir::*;
use rustc_middle::ty::TyCtxt;
use smallvec::SmallVec;
-pub struct SimplifyCfg {
- label: String,
+pub enum SimplifyCfg {
+ Initial,
+ PromoteConsts,
+ RemoveFalseEdges,
+ EarlyOpt,
+ ElaborateDrops,
+ Final,
+ MakeShim,
+ AfterUninhabitedEnumBranching,
}
impl SimplifyCfg {
- pub fn new(label: &str) -> Self {
- SimplifyCfg { label: format!("SimplifyCfg-{}", label) }
+ pub fn name(&self) -> &'static str {
+ match self {
+ SimplifyCfg::Initial => "SimplifyCfg-initial",
+ SimplifyCfg::PromoteConsts => "SimplifyCfg-promote-consts",
+ SimplifyCfg::RemoveFalseEdges => "SimplifyCfg-remove-false-edges",
+ SimplifyCfg::EarlyOpt => "SimplifyCfg-early-opt",
+ SimplifyCfg::ElaborateDrops => "SimplifyCfg-elaborate-drops",
+ SimplifyCfg::Final => "SimplifyCfg-final",
+ SimplifyCfg::MakeShim => "SimplifyCfg-make_shim",
+ SimplifyCfg::AfterUninhabitedEnumBranching => {
+ "SimplifyCfg-after-uninhabited-enum-branching"
+ }
+ }
}
}
@@ -56,12 +74,12 @@ pub fn simplify_cfg<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
}
impl<'tcx> MirPass<'tcx> for SimplifyCfg {
- fn name(&self) -> &str {
- &self.label
+ fn name(&self) -> &'static str {
+ &self.name()
}
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
- debug!("SimplifyCfg({:?}) - simplifying {:?}", self.label, body.source);
+ debug!("SimplifyCfg({:?}) - simplifying {:?}", self.name(), body.source);
simplify_cfg(tcx, body);
}
}
@@ -260,6 +278,18 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> {
}
}
+pub fn simplify_duplicate_switch_targets(terminator: &mut Terminator<'_>) {
+ if let TerminatorKind::SwitchInt { targets, .. } = &mut terminator.kind {
+ let otherwise = targets.otherwise();
+ if targets.iter().any(|t| t.1 == otherwise) {
+ *targets = SwitchTargets::new(
+ targets.iter().filter(|t| t.1 != otherwise),
+ targets.otherwise(),
+ );
+ }
+ }
+}
+
pub fn remove_duplicate_unreachable_blocks<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
struct OptApplier<'tcx> {
tcx: TyCtxt<'tcx>,
@@ -280,6 +310,8 @@ pub fn remove_duplicate_unreachable_blocks<'tcx>(tcx: TyCtxt<'tcx>, body: &mut B
}
}
+ simplify_duplicate_switch_targets(terminator);
+
self.super_terminator(terminator, location);
}
}
@@ -423,19 +455,17 @@ fn save_unreachable_coverage(
));
}
-pub struct SimplifyLocals {
- label: String,
-}
-
-impl SimplifyLocals {
- pub fn new(label: &str) -> SimplifyLocals {
- SimplifyLocals { label: format!("SimplifyLocals-{}", label) }
- }
+pub enum SimplifyLocals {
+ BeforeConstProp,
+ Final,
}
impl<'tcx> MirPass<'tcx> for SimplifyLocals {
- fn name(&self) -> &str {
- &self.label
+ fn name(&self) -> &'static str {
+ match &self {
+ SimplifyLocals::BeforeConstProp => "SimplifyLocals-before-const-prop",
+ SimplifyLocals::Final => "SimplifyLocals-final",
+ }
}
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {