Skip to content

Commit 5f98540

Browse files
Declare opt-level for each MIR transformation
1 parent da4cb6c commit 5f98540

31 files changed

+120
-76
lines changed

compiler/rustc_mir/src/transform/add_call_guards.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::transform::MirPass;
1+
use crate::transform::{MirPass, OptLevel};
22
use rustc_index::vec::{Idx, IndexVec};
33
use rustc_middle::mir::*;
44
use rustc_middle::ty::TyCtxt;
@@ -31,6 +31,8 @@ pub use self::AddCallGuards::*;
3131
*/
3232

3333
impl<'tcx> MirPass<'tcx> for AddCallGuards {
34+
const LEVEL: OptLevel = OptLevel::ALWAYS;
35+
3436
fn run_pass(&self, _tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
3537
self.add_call_guards(body);
3638
}

compiler/rustc_mir/src/transform/add_moves_for_packed_drops.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use rustc_middle::mir::*;
22
use rustc_middle::ty::TyCtxt;
33

4-
use crate::transform::MirPass;
4+
use crate::transform::{MirPass, OptLevel};
55
use crate::util;
66
use crate::util::patch::MirPatch;
77

@@ -39,6 +39,8 @@ use crate::util::patch::MirPatch;
3939
pub struct AddMovesForPackedDrops;
4040

4141
impl<'tcx> MirPass<'tcx> for AddMovesForPackedDrops {
42+
const LEVEL: OptLevel = OptLevel::ALWAYS;
43+
4244
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
4345
debug!("add_moves_for_packed_drops({:?} @ {:?})", body.source, body.span);
4446
add_moves_for_packed_drops(tcx, body);

compiler/rustc_mir/src/transform/add_retag.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
//! of MIR building, and only after this pass we think of the program has having the
55
//! normal MIR semantics.
66
7-
use crate::transform::MirPass;
7+
use crate::transform::{MirPass, OptLevel};
88
use rustc_middle::mir::*;
99
use rustc_middle::ty::{self, Ty, TyCtxt};
1010

@@ -58,6 +58,8 @@ fn may_be_reference(ty: Ty<'tcx>) -> bool {
5858
}
5959

6060
impl<'tcx> MirPass<'tcx> for AddRetag {
61+
const LEVEL: OptLevel = OptLevel::ALWAYS;
62+
6163
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
6264
if !tcx.sess.opts.debugging_opts.mir_emit_retag {
6365
return;

compiler/rustc_mir/src/transform/check_const_item_mutation.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@ use rustc_middle::ty::TyCtxt;
66
use rustc_session::lint::builtin::CONST_ITEM_MUTATION;
77
use rustc_span::def_id::DefId;
88

9-
use crate::transform::MirPass;
9+
use crate::transform::{MirPass, OptLevel};
1010

11+
// FIXME: This does not mutate the MIR, and should not be MIR pass.
1112
pub struct CheckConstItemMutation;
1213

1314
impl<'tcx> MirPass<'tcx> for CheckConstItemMutation {
15+
const LEVEL: OptLevel = OptLevel::ALWAYS;
16+
1417
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
1518
let mut checker = ConstMutationChecker { body, tcx, target_local: None };
1619
checker.visit_body(&body);

compiler/rustc_mir/src/transform/check_packed_ref.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@ use rustc_middle::mir::*;
33
use rustc_middle::ty::{self, TyCtxt};
44
use rustc_session::lint::builtin::UNALIGNED_REFERENCES;
55

6-
use crate::transform::MirPass;
6+
use crate::transform::{MirPass, OptLevel};
77
use crate::util;
88

9+
// FIXME: This does not mutate the MIR, and should not be `MirPass`.
910
pub struct CheckPackedRef;
1011

1112
impl<'tcx> MirPass<'tcx> for CheckPackedRef {
13+
const LEVEL: OptLevel = OptLevel::ALWAYS;
14+
1215
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
1316
let param_env = tcx.param_env(body.source.def_id());
1417
let source_info = SourceInfo::outermost(body.span);

compiler/rustc_mir/src/transform/cleanup_post_borrowck.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
//! [`ForMatchGuard`]: rustc_middle::mir::FakeReadCause::ForMatchGuard
1919
//! [`Nop`]: rustc_middle::mir::StatementKind::Nop
2020
21-
use crate::transform::MirPass;
21+
use crate::transform::{MirPass, OptLevel};
2222
use rustc_middle::mir::visit::MutVisitor;
2323
use rustc_middle::mir::{Body, BorrowKind, Location, Rvalue};
2424
use rustc_middle::mir::{Statement, StatementKind};
@@ -31,6 +31,8 @@ pub struct DeleteNonCodegenStatements<'tcx> {
3131
}
3232

3333
impl<'tcx> MirPass<'tcx> for CleanupNonCodegenStatements {
34+
const LEVEL: OptLevel = OptLevel::ALWAYS;
35+
3436
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
3537
let mut delete = DeleteNonCodegenStatements { tcx };
3638
delete.visit_body(body);

compiler/rustc_mir/src/transform/const_prop.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use crate::interpret::{
3232
InterpCx, LocalState, LocalValue, MemPlace, Memory, MemoryKind, OpTy, Operand as InterpOperand,
3333
PlaceTy, Pointer, ScalarMaybeUninit, StackPopCleanup,
3434
};
35-
use crate::transform::MirPass;
35+
use crate::transform::{MirPass, OptLevel};
3636

3737
/// The maximum number of bytes that we'll allocate space for a local or the return value.
3838
/// Needed for #66397, because otherwise we eval into large places and that can cause OOM or just
@@ -60,6 +60,9 @@ macro_rules! throw_machine_stop_str {
6060
pub struct ConstProp;
6161

6262
impl<'tcx> MirPass<'tcx> for ConstProp {
63+
// FIXME(#70073): This pass is responsible for both optimization as well as some lints.
64+
const LEVEL: OptLevel = OptLevel::ALWAYS;
65+
6366
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
6467
// will be evaluated by miri and produce its errors there
6568
if body.source.promoted.is_some() {

compiler/rustc_mir/src/transform/copy_prop.rs

+5-9
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
//! (non-mutating) use of `SRC`. These restrictions are conservative and may be relaxed in the
2020
//! future.
2121
22-
use crate::transform::MirPass;
22+
use crate::transform::{MirPass, OptLevel};
2323
use crate::util::def_use::DefUseAnalysis;
2424
use rustc_middle::mir::visit::MutVisitor;
2525
use rustc_middle::mir::{
@@ -30,15 +30,11 @@ use rustc_middle::ty::TyCtxt;
3030
pub struct CopyPropagation;
3131

3232
impl<'tcx> MirPass<'tcx> for CopyPropagation {
33-
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
34-
let opts = &tcx.sess.opts.debugging_opts;
35-
// We only run when the MIR optimization level is > 1.
36-
// This avoids a slow pass, and messing up debug info.
37-
// FIXME(76740): This optimization is buggy and can cause unsoundness.
38-
if opts.mir_opt_level <= 1 || !opts.unsound_mir_opts {
39-
return;
40-
}
33+
// This pass is slow and doesn't handle debug info. It shouldn't run by default.
34+
// FIXME(76740): This optimization is buggy and can cause unsoundness.
35+
const LEVEL: OptLevel = OptLevel::Unsound;
4136

37+
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
4238
let mut def_use_analysis = DefUseAnalysis::new(body);
4339
loop {
4440
def_use_analysis.analyze(body);

compiler/rustc_mir/src/transform/deaggregator.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
use crate::transform::MirPass;
1+
use crate::transform::{MirPass, OptLevel};
22
use crate::util::expand_aggregate;
33
use rustc_middle::mir::*;
44
use rustc_middle::ty::TyCtxt;
55

66
pub struct Deaggregator;
77

88
impl<'tcx> MirPass<'tcx> for Deaggregator {
9+
const LEVEL: OptLevel = OptLevel::ALWAYS;
10+
911
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
1012
let (basic_blocks, local_decls) = body.basic_blocks_and_local_decls_mut();
1113
let local_decls = &*local_decls;

compiler/rustc_mir/src/transform/dest_prop.rs

+5-7
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@
9999
use crate::dataflow::impls::{MaybeInitializedLocals, MaybeLiveLocals};
100100
use crate::dataflow::Analysis;
101101
use crate::{
102-
transform::MirPass,
102+
transform::{MirPass, OptLevel},
103103
util::{dump_mir, PassWhere},
104104
};
105105
use itertools::Itertools;
@@ -126,13 +126,11 @@ const MAX_BLOCKS: usize = 250;
126126
pub struct DestinationPropagation;
127127

128128
impl<'tcx> MirPass<'tcx> for DestinationPropagation {
129-
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
130-
// Only run at mir-opt-level=2 or higher for now (we don't fix up debuginfo and remove
131-
// storage statements at the moment).
132-
if tcx.sess.opts.debugging_opts.mir_opt_level <= 1 {
133-
return;
134-
}
129+
// Only run at mir-opt-level=2 or higher for now (we don't fix up debuginfo and remove
130+
// storage statements at the moment).
131+
const LEVEL: OptLevel = OptLevel::N(2);
135132

133+
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
136134
let def_id = body.source.def_id();
137135

138136
let candidates = find_candidates(tcx, body);

compiler/rustc_mir/src/transform/dump_mir.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::fmt;
55
use std::fs::File;
66
use std::io;
77

8-
use crate::transform::MirPass;
8+
use crate::transform::{MirPass, OptLevel};
99
use crate::util as mir_util;
1010
use rustc_middle::mir::Body;
1111
use rustc_middle::ty::TyCtxt;
@@ -14,6 +14,8 @@ use rustc_session::config::{OutputFilenames, OutputType};
1414
pub struct Marker(pub &'static str);
1515

1616
impl<'tcx> MirPass<'tcx> for Marker {
17+
const LEVEL: OptLevel = OptLevel::ALWAYS;
18+
1719
fn name(&self) -> Cow<'_, str> {
1820
Cow::Borrowed(self.0)
1921
}

compiler/rustc_mir/src/transform/early_otherwise_branch.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
use crate::{transform::MirPass, util::patch::MirPatch};
1+
use crate::transform::{MirPass, OptLevel};
2+
use crate::util::patch::MirPatch;
23
use rustc_middle::mir::*;
34
use rustc_middle::ty::{Ty, TyCtxt};
45
use std::{borrow::Cow, fmt::Debug};
@@ -25,10 +26,9 @@ use super::simplify::simplify_cfg;
2526
pub struct EarlyOtherwiseBranch;
2627

2728
impl<'tcx> MirPass<'tcx> for EarlyOtherwiseBranch {
29+
const LEVEL: OptLevel = OptLevel::N(2);
30+
2831
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
29-
if tcx.sess.opts.debugging_opts.mir_opt_level < 2 {
30-
return;
31-
}
3232
trace!("running EarlyOtherwiseBranch on {:?}", body.source);
3333
// we are only interested in this bb if the terminator is a switchInt
3434
let bbs_with_switch =

compiler/rustc_mir/src/transform/elaborate_drops.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::dataflow::on_lookup_result_bits;
55
use crate::dataflow::MoveDataParamEnv;
66
use crate::dataflow::{on_all_children_bits, on_all_drop_children_bits};
77
use crate::dataflow::{Analysis, ResultsCursor};
8-
use crate::transform::MirPass;
8+
use crate::transform::{MirPass, OptLevel};
99
use crate::util::elaborate_drops::{elaborate_drop, DropFlagState, Unwind};
1010
use crate::util::elaborate_drops::{DropElaborator, DropFlagMode, DropStyle};
1111
use crate::util::patch::MirPatch;
@@ -20,6 +20,8 @@ use std::fmt;
2020
pub struct ElaborateDrops;
2121

2222
impl<'tcx> MirPass<'tcx> for ElaborateDrops {
23+
const LEVEL: OptLevel = OptLevel::ALWAYS;
24+
2325
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
2426
debug!("elaborate_drops({:?} @ {:?})", body.source, body.span);
2527

compiler/rustc_mir/src/transform/generator.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ use crate::dataflow::impls::{
5555
use crate::dataflow::{self, Analysis};
5656
use crate::transform::no_landing_pads::no_landing_pads;
5757
use crate::transform::simplify;
58-
use crate::transform::MirPass;
58+
use crate::transform::{MirPass, OptLevel};
5959
use crate::util::dump_mir;
6060
use crate::util::expand_aggregate;
6161
use crate::util::storage;
@@ -1235,6 +1235,9 @@ fn create_cases<'tcx>(
12351235
}
12361236

12371237
impl<'tcx> MirPass<'tcx> for StateTransform {
1238+
// Even if we don't do optimizations, we still have to lower generators for codegen.
1239+
const LEVEL: OptLevel = OptLevel::ALWAYS;
1240+
12381241
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
12391242
let yield_ty = if let Some(yield_ty) = body.yield_ty {
12401243
yield_ty

compiler/rustc_mir/src/transform/inline.rs

+14-14
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use rustc_middle::ty::{self, ConstKind, Instance, InstanceDef, ParamEnv, Ty, TyC
1212
use rustc_target::spec::abi::Abi;
1313

1414
use super::simplify::{remove_dead_blocks, CfgSimplifier};
15-
use crate::transform::MirPass;
15+
use crate::transform::{MirPass, OptLevel};
1616
use std::collections::VecDeque;
1717
use std::iter;
1818

@@ -37,21 +37,21 @@ struct CallSite<'tcx> {
3737
}
3838

3939
impl<'tcx> MirPass<'tcx> for Inline {
40+
const LEVEL: OptLevel = OptLevel::N(2);
41+
4042
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
41-
if tcx.sess.opts.debugging_opts.mir_opt_level >= 2 {
42-
if tcx.sess.opts.debugging_opts.instrument_coverage {
43-
// The current implementation of source code coverage injects code region counters
44-
// into the MIR, and assumes a 1-to-1 correspondence between MIR and source-code-
45-
// based function.
46-
debug!("function inlining is disabled when compiling with `instrument_coverage`");
47-
} else {
48-
Inliner {
49-
tcx,
50-
param_env: tcx.param_env_reveal_all_normalized(body.source.def_id()),
51-
codegen_fn_attrs: tcx.codegen_fn_attrs(body.source.def_id()),
52-
}
53-
.run_pass(body);
43+
if tcx.sess.opts.debugging_opts.instrument_coverage {
44+
// The current implementation of source code coverage injects code region counters
45+
// into the MIR, and assumes a 1-to-1 correspondence between MIR and source-code-
46+
// based function.
47+
debug!("function inlining is disabled when compiling with `instrument_coverage`");
48+
} else {
49+
Inliner {
50+
tcx,
51+
param_env: tcx.param_env_reveal_all_normalized(body.source.def_id()),
52+
codegen_fn_attrs: tcx.codegen_fn_attrs(body.source.def_id()),
5453
}
54+
.run_pass(body);
5555
}
5656
}
5757
}

compiler/rustc_mir/src/transform/instcombine.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! Performs various peephole optimizations.
22
3-
use crate::transform::MirPass;
3+
use crate::transform::{MirPass, OptLevel};
44
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
55
use rustc_hir::Mutability;
66
use rustc_index::vec::Idx;
@@ -19,6 +19,8 @@ use std::mem;
1919
pub struct InstCombine;
2020

2121
impl<'tcx> MirPass<'tcx> for InstCombine {
22+
const LEVEL: OptLevel = OptLevel::DEFAULT;
23+
2224
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
2325
// First, find optimization opportunities. This is done in a pre-pass to keep the MIR
2426
// read-only so that we can do global analyses on the MIR in the process (e.g.

compiler/rustc_mir/src/transform/instrument_coverage.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::transform::MirPass;
1+
use crate::transform::{MirPass, OptLevel};
22
use crate::util::pretty;
33
use crate::util::spanview::{self, SpanViewable};
44

@@ -88,6 +88,8 @@ fn coverageinfo_from_mir<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> CoverageInfo
8888
}
8989

9090
impl<'tcx> MirPass<'tcx> for InstrumentCoverage {
91+
const LEVEL: OptLevel = OptLevel::ALWAYS;
92+
9193
fn run_pass(&self, tcx: TyCtxt<'tcx>, mir_body: &mut mir::Body<'tcx>) {
9294
// If the InstrumentCoverage pass is called on promoted MIRs, skip them.
9395
// See: https://github.com/rust-lang/rust/pull/73011#discussion_r438317601

compiler/rustc_mir/src/transform/match_branches.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::transform::MirPass;
1+
use crate::transform::{MirPass, OptLevel};
22
use rustc_middle::mir::*;
33
use rustc_middle::ty::TyCtxt;
44

@@ -37,6 +37,8 @@ pub struct MatchBranchSimplification;
3737
/// ```
3838
3939
impl<'tcx> MirPass<'tcx> for MatchBranchSimplification {
40+
const LEVEL: OptLevel = OptLevel::DEFAULT;
41+
4042
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
4143
let param_env = tcx.param_env(body.source.def_id());
4244
let bbs = body.basic_blocks_mut();

compiler/rustc_mir/src/transform/multiple_return_terminators.rs

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
//! This pass removes jumps to basic blocks containing only a return, and replaces them with a
22
//! return instead.
33
4-
use crate::transform::{simplify, MirPass};
4+
use crate::transform::{simplify, MirPass, OptLevel};
55
use rustc_index::bit_set::BitSet;
66
use rustc_middle::mir::*;
77
use rustc_middle::ty::TyCtxt;
88

99
pub struct MultipleReturnTerminators;
1010

1111
impl<'tcx> MirPass<'tcx> for MultipleReturnTerminators {
12-
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
13-
if tcx.sess.opts.debugging_opts.mir_opt_level < 3 {
14-
return;
15-
}
12+
const LEVEL: OptLevel = OptLevel::N(3);
1613

14+
fn run_pass(&self, _tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
1715
// find basic blocks with no statement and a return terminator
1816
let mut bbs_simple_returns = BitSet::new_empty(body.basic_blocks().len());
1917
let bbs = body.basic_blocks_mut();

compiler/rustc_mir/src/transform/no_landing_pads.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! This pass removes the unwind branch of all the terminators when the no-landing-pads option is
22
//! specified.
33
4-
use crate::transform::MirPass;
4+
use crate::transform::{MirPass, OptLevel};
55
use rustc_middle::mir::visit::MutVisitor;
66
use rustc_middle::mir::*;
77
use rustc_middle::ty::TyCtxt;
@@ -18,6 +18,8 @@ impl<'tcx> NoLandingPads<'tcx> {
1818
}
1919

2020
impl<'tcx> MirPass<'tcx> for NoLandingPads<'tcx> {
21+
const LEVEL: OptLevel = OptLevel::ALWAYS;
22+
2123
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
2224
no_landing_pads(tcx, body)
2325
}

0 commit comments

Comments
 (0)