Skip to content

Commit 23b10ee

Browse files
Disable non-required MIR opts with optimize(none)
Co-authored-by: Waffle Lapkin <[email protected]>
1 parent cd848c9 commit 23b10ee

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+319
-10
lines changed

compiler/rustc_attr_data_structures/src/attributes.rs

+6
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@ pub enum OptimizeAttr {
4646
Size,
4747
}
4848

49+
impl OptimizeAttr {
50+
pub fn do_not_optimize(&self) -> bool {
51+
matches!(self, Self::DoNotOptimize)
52+
}
53+
}
54+
4955
#[derive(Clone, Debug, Encodable, Decodable)]
5056
pub enum DiagnosticAttribute {
5157
// tidy-alphabetical-start

compiler/rustc_mir_transform/src/abort_unwinding_calls.rs

+4
Original file line numberDiff line numberDiff line change
@@ -116,4 +116,8 @@ impl<'tcx> crate::MirPass<'tcx> for AbortUnwindingCalls {
116116
// We may have invalidated some `cleanup` blocks so clean those up now.
117117
super::simplify::remove_dead_blocks(body);
118118
}
119+
120+
fn is_required(&self) -> bool {
121+
true
122+
}
119123
}

compiler/rustc_mir_transform/src/add_call_guards.rs

+4
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,8 @@ impl<'tcx> crate::MirPass<'tcx> for AddCallGuards {
7575

7676
body.basic_blocks_mut().extend(new_blocks);
7777
}
78+
79+
fn is_required(&self) -> bool {
80+
true
81+
}
7882
}

compiler/rustc_mir_transform/src/add_moves_for_packed_drops.rs

+4
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ impl<'tcx> crate::MirPass<'tcx> for AddMovesForPackedDrops {
6868

6969
patch.apply(body);
7070
}
71+
72+
fn is_required(&self) -> bool {
73+
true
74+
}
7175
}
7276

7377
fn add_move_for_packed_drop<'tcx>(

compiler/rustc_mir_transform/src/add_retag.rs

+4
Original file line numberDiff line numberDiff line change
@@ -176,4 +176,8 @@ impl<'tcx> crate::MirPass<'tcx> for AddRetag {
176176
}
177177
}
178178
}
179+
180+
fn is_required(&self) -> bool {
181+
true
182+
}
179183
}

compiler/rustc_mir_transform/src/add_subtyping_projections.rs

+4
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,8 @@ impl<'tcx> crate::MirPass<'tcx> for Subtyper {
6161
}
6262
checker.patcher.apply(body);
6363
}
64+
65+
fn is_required(&self) -> bool {
66+
true
67+
}
6468
}

compiler/rustc_mir_transform/src/check_alignment.rs

+4
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ impl<'tcx> crate::MirPass<'tcx> for CheckAlignment {
6060
}
6161
}
6262
}
63+
64+
fn is_required(&self) -> bool {
65+
true
66+
}
6367
}
6468

6569
struct PointerFinder<'a, 'tcx> {

compiler/rustc_mir_transform/src/cleanup_post_borrowck.rs

+4
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,8 @@ impl<'tcx> crate::MirPass<'tcx> for CleanupPostBorrowck {
7272
decl.user_ty = None;
7373
}
7474
}
75+
76+
fn is_required(&self) -> bool {
77+
true
78+
}
7579
}

compiler/rustc_mir_transform/src/copy_prop.rs

+4
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ impl<'tcx> crate::MirPass<'tcx> for CopyProp {
5656
crate::simplify::remove_unused_definitions(body);
5757
}
5858
}
59+
60+
fn is_required(&self) -> bool {
61+
false
62+
}
5963
}
6064

6165
/// `SsaLocals` computed equivalence classes between locals considering copy/move assignments.

compiler/rustc_mir_transform/src/coroutine.rs

+4
Original file line numberDiff line numberDiff line change
@@ -1688,6 +1688,10 @@ impl<'tcx> crate::MirPass<'tcx> for StateTransform {
16881688
// Run derefer to fix Derefs that are not in the first place
16891689
deref_finder(tcx, body);
16901690
}
1691+
1692+
fn is_required(&self) -> bool {
1693+
true
1694+
}
16911695
}
16921696

16931697
/// Looks for any assignments between locals (e.g., `_4 = _5`) that will both be converted to fields

compiler/rustc_mir_transform/src/coverage/mod.rs

+4
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ impl<'tcx> crate::MirPass<'tcx> for InstrumentCoverage {
6161

6262
instrument_function_for_coverage(tcx, mir_body);
6363
}
64+
65+
fn is_required(&self) -> bool {
66+
false
67+
}
6468
}
6569

6670
fn instrument_function_for_coverage<'tcx>(tcx: TyCtxt<'tcx>, mir_body: &mut mir::Body<'tcx>) {

compiler/rustc_mir_transform/src/cross_crate_inline.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ fn cross_crate_inlinable(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool {
6969
// Don't do any inference if codegen optimizations are disabled and also MIR inlining is not
7070
// enabled. This ensures that we do inference even if someone only passes -Zinline-mir,
7171
// which is less confusing than having to also enable -Copt-level=1.
72-
let inliner_will_run = pm::should_run_pass(tcx, &inline::Inline)
72+
let inliner_will_run = pm::should_run_pass(tcx, &inline::Inline, pm::Optimizations::Enable)
7373
|| inline::ForceInline::should_run_pass_for_callee(tcx, def_id.to_def_id());
7474
if matches!(tcx.sess.opts.optimize, OptLevel::No) && !inliner_will_run {
7575
return false;

compiler/rustc_mir_transform/src/ctfe_limit.rs

+4
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ impl<'tcx> crate::MirPass<'tcx> for CtfeLimit {
3636
);
3737
}
3838
}
39+
40+
fn is_required(&self) -> bool {
41+
true
42+
}
3943
}
4044

4145
fn has_back_edge(

compiler/rustc_mir_transform/src/dataflow_const_prop.rs

+4
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ impl<'tcx> crate::MirPass<'tcx> for DataflowConstProp {
7171
let mut patch = visitor.patch;
7272
debug_span!("patch").in_scope(|| patch.visit_body_preserves_cfg(body));
7373
}
74+
75+
fn is_required(&self) -> bool {
76+
false
77+
}
7478
}
7579

7680
// Note: Currently, places that have their reference taken cannot be tracked. Although this would

compiler/rustc_mir_transform/src/dead_store_elimination.rs

+4
Original file line numberDiff line numberDiff line change
@@ -147,4 +147,8 @@ impl<'tcx> crate::MirPass<'tcx> for DeadStoreElimination {
147147
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
148148
eliminate(tcx, body);
149149
}
150+
151+
fn is_required(&self) -> bool {
152+
false
153+
}
150154
}

compiler/rustc_mir_transform/src/deduplicate_blocks.rs

+4
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ impl<'tcx> crate::MirPass<'tcx> for DeduplicateBlocks {
3131
simplify_cfg(body);
3232
}
3333
}
34+
35+
fn is_required(&self) -> bool {
36+
false
37+
}
3438
}
3539

3640
struct OptApplier<'tcx> {

compiler/rustc_mir_transform/src/deref_separator.rs

+4
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,8 @@ impl<'tcx> crate::MirPass<'tcx> for Derefer {
8181
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
8282
deref_finder(tcx, body);
8383
}
84+
85+
fn is_required(&self) -> bool {
86+
true
87+
}
8488
}

compiler/rustc_mir_transform/src/dest_prop.rs

+4
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,10 @@ impl<'tcx> crate::MirPass<'tcx> for DestinationPropagation {
240240

241241
trace!(round_count);
242242
}
243+
244+
fn is_required(&self) -> bool {
245+
false
246+
}
243247
}
244248

245249
#[derive(Debug, Default)]

compiler/rustc_mir_transform/src/dump_mir.rs

+4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ impl<'tcx> crate::MirPass<'tcx> for Marker {
1515
}
1616

1717
fn run_pass(&self, _tcx: TyCtxt<'tcx>, _body: &mut Body<'tcx>) {}
18+
19+
fn is_required(&self) -> bool {
20+
false
21+
}
1822
}
1923

2024
pub fn emit_mir(tcx: TyCtxt<'_>) -> io::Result<()> {

compiler/rustc_mir_transform/src/early_otherwise_branch.rs

+4
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,10 @@ impl<'tcx> crate::MirPass<'tcx> for EarlyOtherwiseBranch {
227227
simplify_cfg(body);
228228
}
229229
}
230+
231+
fn is_required(&self) -> bool {
232+
false
233+
}
230234
}
231235

232236
#[derive(Debug)]

compiler/rustc_mir_transform/src/elaborate_box_derefs.rs

+4
Original file line numberDiff line numberDiff line change
@@ -150,4 +150,8 @@ impl<'tcx> crate::MirPass<'tcx> for ElaborateBoxDerefs {
150150
}
151151
}
152152
}
153+
154+
fn is_required(&self) -> bool {
155+
true
156+
}
153157
}

compiler/rustc_mir_transform/src/elaborate_drops.rs

+4
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ impl<'tcx> crate::MirPass<'tcx> for ElaborateDrops {
8888
elaborate_patch.apply(body);
8989
deref_finder(tcx, body);
9090
}
91+
92+
fn is_required(&self) -> bool {
93+
true
94+
}
9195
}
9296

9397
/// Records unwind edges which are known to be unreachable, because they are in `drop` terminators

compiler/rustc_mir_transform/src/gvn.rs

+4
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,10 @@ impl<'tcx> crate::MirPass<'tcx> for GVN {
163163
// statements.
164164
StorageRemover { tcx, reused_locals: state.reused_locals }.visit_body_preserves_cfg(body);
165165
}
166+
167+
fn is_required(&self) -> bool {
168+
false
169+
}
166170
}
167171

168172
newtype_index! {

compiler/rustc_mir_transform/src/impossible_predicates.rs

+4
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,8 @@ impl<'tcx> MirPass<'tcx> for ImpossiblePredicates {
5353
body.local_decls.raw.truncate(body.arg_count + 1);
5454
}
5555
}
56+
57+
fn is_required(&self) -> bool {
58+
true
59+
}
5660
}

compiler/rustc_mir_transform/src/inline.rs

+8
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ impl<'tcx> crate::MirPass<'tcx> for Inline {
6666
deref_finder(tcx, body);
6767
}
6868
}
69+
70+
fn is_required(&self) -> bool {
71+
false
72+
}
6973
}
7074

7175
pub struct ForceInline;
@@ -85,6 +89,10 @@ impl<'tcx> crate::MirPass<'tcx> for ForceInline {
8589
false
8690
}
8791

92+
fn is_required(&self) -> bool {
93+
true
94+
}
95+
8896
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
8997
let span = trace_span!("force_inline", body = %tcx.def_path_str(body.source.def_id()));
9098
let _guard = span.enter();

compiler/rustc_mir_transform/src/instsimplify.rs

+4
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ impl<'tcx> crate::MirPass<'tcx> for InstSimplify {
6262
simplify_duplicate_switch_targets(block.terminator.as_mut().unwrap());
6363
}
6464
}
65+
66+
fn is_required(&self) -> bool {
67+
false
68+
}
6569
}
6670

6771
struct InstSimplifyContext<'a, 'tcx> {

compiler/rustc_mir_transform/src/jump_threading.rs

+4
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@ impl<'tcx> crate::MirPass<'tcx> for JumpThreading {
105105
}
106106
OpportunitySet::new(body, opportunities).apply(body);
107107
}
108+
109+
fn is_required(&self) -> bool {
110+
false
111+
}
108112
}
109113

110114
#[derive(Debug)]

compiler/rustc_mir_transform/src/large_enums.rs

+4
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,10 @@ impl<'tcx> crate::MirPass<'tcx> for EnumSizeOpt {
200200
});
201201
}
202202
}
203+
204+
fn is_required(&self) -> bool {
205+
false
206+
}
203207
}
204208

205209
impl EnumSizeOpt {

compiler/rustc_mir_transform/src/lib.rs

+29-4
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,7 @@ fn mir_built(tcx: TyCtxt<'_>, def: LocalDefId) -> &Steal<Body<'_>> {
388388
&Lint(sanity_check::SanityCheck),
389389
],
390390
None,
391+
pm::Optimizations::Enable,
391392
);
392393
tcx.alloc_steal_mir(body)
393394
}
@@ -440,6 +441,7 @@ fn mir_promoted(
440441
&mut body,
441442
&[&promote_pass, &simplify::SimplifyCfg::PromoteConsts, &coverage::InstrumentCoverage],
442443
Some(MirPhase::Analysis(AnalysisPhase::Initial)),
444+
pm::Optimizations::Enable,
443445
);
444446

445447
lint_tail_expr_drop_order::run_lint(tcx, def, &body);
@@ -473,7 +475,7 @@ fn inner_mir_for_ctfe(tcx: TyCtxt<'_>, def: LocalDefId) -> Body<'_> {
473475
};
474476

475477
let mut body = remap_mir_for_const_eval_select(tcx, body, hir::Constness::Const);
476-
pm::run_passes(tcx, &mut body, &[&ctfe_limit::CtfeLimit], None);
478+
pm::run_passes(tcx, &mut body, &[&ctfe_limit::CtfeLimit], None, pm::Optimizations::Enable);
477479

478480
body
479481
}
@@ -493,7 +495,7 @@ fn mir_drops_elaborated_and_const_checked(tcx: TyCtxt<'_>, def: LocalDefId) -> &
493495
let is_fn_like = tcx.def_kind(def).is_fn_like();
494496
if is_fn_like {
495497
// Do not compute the mir call graph without said call graph actually being used.
496-
if pm::should_run_pass(tcx, &inline::Inline)
498+
if pm::should_run_pass(tcx, &inline::Inline, pm::Optimizations::Enable)
497499
|| inline::ForceInline::should_run_pass_for_callee(tcx, def.to_def_id())
498500
{
499501
tcx.ensure_with_value().mir_inliner_callees(ty::InstanceKind::Item(def.to_def_id()));
@@ -533,6 +535,7 @@ pub fn run_analysis_to_runtime_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'
533535
&Lint(post_drop_elaboration::CheckLiveDrops),
534536
],
535537
None,
538+
pm::Optimizations::Enable,
536539
);
537540
}
538541

@@ -557,7 +560,13 @@ fn run_analysis_cleanup_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
557560
&deref_separator::Derefer,
558561
];
559562

560-
pm::run_passes(tcx, body, passes, Some(MirPhase::Analysis(AnalysisPhase::PostCleanup)));
563+
pm::run_passes(
564+
tcx,
565+
body,
566+
passes,
567+
Some(MirPhase::Analysis(AnalysisPhase::PostCleanup)),
568+
pm::Optimizations::Enable,
569+
);
561570
}
562571

563572
/// Returns the sequence of passes that lowers analysis to runtime MIR.
@@ -597,7 +606,13 @@ fn run_runtime_cleanup_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
597606
&simplify::SimplifyCfg::PreOptimizations,
598607
];
599608

600-
pm::run_passes(tcx, body, passes, Some(MirPhase::Runtime(RuntimePhase::PostCleanup)));
609+
pm::run_passes(
610+
tcx,
611+
body,
612+
passes,
613+
Some(MirPhase::Runtime(RuntimePhase::PostCleanup)),
614+
pm::Optimizations::Enable,
615+
);
601616

602617
// Clear this by anticipation. Optimizations and runtime MIR have no reason to look
603618
// into this information, which is meant for borrowck diagnostics.
@@ -611,6 +626,15 @@ fn run_optimization_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
611626
WithMinOptLevel(1, x)
612627
}
613628

629+
let def_id = body.source.def_id();
630+
let optimizations = if tcx.def_kind(def_id).has_codegen_attrs()
631+
&& tcx.codegen_fn_attrs(def_id).optimize.do_not_optimize()
632+
{
633+
pm::Optimizations::Disable
634+
} else {
635+
pm::Optimizations::Enable
636+
};
637+
614638
// The main optimizations that we do on MIR.
615639
pm::run_passes(
616640
tcx,
@@ -683,6 +707,7 @@ fn run_optimization_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
683707
&dump_mir::Marker("PreCodegen"),
684708
],
685709
Some(MirPhase::Runtime(RuntimePhase::Optimized)),
710+
optimizations,
686711
);
687712
}
688713

0 commit comments

Comments
 (0)