about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGuillaume Gomez <guillaume1.gomez@gmail.com>2021-03-05 21:44:40 +0100
committerGitHub <noreply@github.com>2021-03-05 21:44:40 +0100
commit15c148b4f2b86f22c053bf08d3a2b76f76359a35 (patch)
tree45c22b8d755fc5e607aa9ea8571373b54fb4de48
parent34b2caa79f4451ff7eede9a578295e1a48db4bf2 (diff)
parent11d9390c93020330de935fc95d91fb557b1f782c (diff)
downloadrust-15c148b4f2b86f22c053bf08d3a2b76f76359a35.tar.gz
rust-15c148b4f2b86f22c053bf08d3a2b76f76359a35.zip
Rollup merge of #82736 - spastorino:mir-opt-level-perf-changes, r=oli-obk
Bump optimization from mir_opt_level 2 to 3 and 3 to 4 and make "release" be level 2 by default

r? `@oli-obk`
-rw-r--r--compiler/rustc_interface/src/tests.rs2
-rw-r--r--compiler/rustc_mir/src/transform/const_goto.rs2
-rw-r--r--compiler/rustc_mir/src/transform/const_prop.rs12
-rw-r--r--compiler/rustc_mir/src/transform/deduplicate_blocks.rs2
-rw-r--r--compiler/rustc_mir/src/transform/dest_prop.rs4
-rw-r--r--compiler/rustc_mir/src/transform/early_otherwise_branch.rs2
-rw-r--r--compiler/rustc_mir/src/transform/inline.rs2
-rw-r--r--compiler/rustc_mir/src/transform/match_branches.rs2
-rw-r--r--compiler/rustc_mir/src/transform/mod.rs2
-rw-r--r--compiler/rustc_mir/src/transform/multiple_return_terminators.rs2
-rw-r--r--compiler/rustc_mir/src/transform/nrvo.rs2
-rw-r--r--compiler/rustc_mir/src/transform/unreachable_prop.rs4
-rw-r--r--compiler/rustc_session/src/config.rs30
-rw-r--r--compiler/rustc_session/src/options.rs4
-rw-r--r--compiler/rustc_session/src/session.rs6
-rw-r--r--src/test/codegen/issue-59352.rs4
-rw-r--r--src/test/codegen/naked-noinline.rs2
-rw-r--r--src/test/codegen/sanitizer-no-sanitize-inlining.rs4
-rw-r--r--src/test/codegen/try_identity.rs2
-rw-r--r--src/test/mir-opt/const_prop/boolean_identities.rs2
-rw-r--r--src/test/mir-opt/const_prop/issue-66971.rs2
-rw-r--r--src/test/mir-opt/const_prop/issue-67019.rs2
-rw-r--r--src/test/mir-opt/const_prop/mult_by_zero.rs2
-rw-r--r--src/test/mir-opt/early_otherwise_branch.rs2
-rw-r--r--src/test/mir-opt/early_otherwise_branch_3_element_tuple.rs2
-rw-r--r--src/test/mir-opt/early_otherwise_branch_68867.rs2
-rw-r--r--src/test/mir-opt/early_otherwise_branch_noopt.rs2
-rw-r--r--src/test/mir-opt/inline/inline-into-box-place.rs2
-rw-r--r--src/test/mir-opt/inline/inline-trait-method_2.rs2
-rw-r--r--src/test/mir-opt/issues/issue-59352.rs2
-rw-r--r--src/test/mir-opt/multiple_return_terminators.rs2
-rw-r--r--src/test/mir-opt/simplify-arm-identity.rs2
-rw-r--r--src/test/mir-opt/simplify-arm.rs2
-rw-r--r--src/test/ui/const-generics/issues/issue-75299.rs2
-rw-r--r--src/test/ui/const_prop/inline_spans.rs2
-rw-r--r--src/test/ui/const_prop/inline_spans_lint_attribute.rs2
-rw-r--r--src/test/ui/consts/issue-66345.rs4
-rw-r--r--src/test/ui/consts/issue-67529.rs2
-rw-r--r--src/test/ui/consts/issue-67640.rs2
-rw-r--r--src/test/ui/consts/issue-67641.rs2
-rw-r--r--src/test/ui/consts/issue-67862.rs2
-rw-r--r--src/test/ui/consts/trait_specialization.rs2
-rw-r--r--src/test/ui/dest-prop/skeptic-miscompile.rs2
-rw-r--r--src/test/ui/issues/issue-50411.rs2
-rw-r--r--src/test/ui/issues/issue-50865-private-impl-trait/auxiliary/lib.rs2
-rw-r--r--src/test/ui/issues/issue-77002.rs2
-rw-r--r--src/test/ui/mir/auxiliary/issue_76375_aux.rs2
-rw-r--r--src/test/ui/mir/issue-66851.rs2
-rw-r--r--src/test/ui/mir/issue-67639-normalization-ice.rs2
-rw-r--r--src/test/ui/mir/issue-67710-inline-projection.rs2
-rw-r--r--src/test/ui/mir/issue-68841.rs2
-rw-r--r--src/test/ui/mir/issue-71793-inline-args-storage.rs2
-rw-r--r--src/test/ui/mir/issue-75053.rs2
-rw-r--r--src/test/ui/mir/issue-76248.rs2
-rw-r--r--src/test/ui/mir/issue-76375.rs2
-rw-r--r--src/test/ui/mir/issue-76740-copy-propagation.rs2
-rw-r--r--src/test/ui/mir/issue-77911.rs2
-rw-r--r--src/test/ui/mir/issue-78496.rs2
-rw-r--r--src/test/ui/mir/issue66339.rs2
-rw-r--r--src/test/ui/mir/mir-inlining/array-clone-with-generic-size.rs2
-rw-r--r--src/test/ui/mir/mir-inlining/ice-issue-45493.rs2
-rw-r--r--src/test/ui/mir/mir-inlining/ice-issue-45885.rs2
-rw-r--r--src/test/ui/mir/mir-inlining/ice-issue-68347.rs2
-rw-r--r--src/test/ui/mir/mir-inlining/ice-issue-77306-1.rs2
-rw-r--r--src/test/ui/mir/mir-inlining/ice-issue-77306-2.rs2
-rw-r--r--src/test/ui/mir/mir-inlining/ice-issue-77564.rs2
-rw-r--r--src/test/ui/mir/mir-inlining/inline-instrument-coverage-fail.rs4
-rw-r--r--src/test/ui/mir/mir-inlining/inline-instrument-coverage-fail.stderr2
-rw-r--r--src/test/ui/mir/mir-inlining/no-trait-method-issue-40473.rs2
-rw-r--r--src/test/ui/mir/mir-inlining/var-debuginfo-issue-67586.rs2
-rw-r--r--src/test/ui/mir/mir_const_prop_tuple_field_reorder.rs2
-rw-r--r--src/test/ui/mir/ssa-analysis-regression-50041.rs2
-rw-r--r--src/test/ui/polymorphization/promoted-function-3.rs2
-rw-r--r--src/test/ui/rfc-2091-track-caller/caller-location-intrinsic.rs2
-rw-r--r--src/test/ui/rfc-2091-track-caller/const-caller-location.rs2
-rw-r--r--src/test/ui/rfc-2091-track-caller/intrinsic-wrapper.rs2
-rw-r--r--src/test/ui/rfc-2091-track-caller/pass.rs2
-rw-r--r--src/test/ui/rfc-2091-track-caller/std-panic-locations.rs2
-rw-r--r--src/test/ui/rfc-2091-track-caller/track-caller-attribute.rs2
-rw-r--r--src/test/ui/rfc-2091-track-caller/tracked-fn-ptr-with-arg.rs2
-rw-r--r--src/test/ui/rfc-2091-track-caller/tracked-fn-ptr.rs2
-rw-r--r--src/test/ui/simd-intrinsic/simd-intrinsic-inlining-issue67557-ice.rs2
-rw-r--r--src/test/ui/simd-intrinsic/simd-intrinsic-inlining-issue67557.rs2
-rw-r--r--src/tools/clippy/src/driver.rs2
-rw-r--r--src/tools/compiletest/src/runtest.rs2
85 files changed, 117 insertions, 109 deletions
diff --git a/compiler/rustc_interface/src/tests.rs b/compiler/rustc_interface/src/tests.rs
index 9a11b534887..28646973620 100644
--- a/compiler/rustc_interface/src/tests.rs
+++ b/compiler/rustc_interface/src/tests.rs
@@ -566,7 +566,7 @@ fn test_debugging_options_tracking_hash() {
     tracked!(link_only, true);
     tracked!(merge_functions, Some(MergeFunctions::Disabled));
     tracked!(mir_emit_retag, true);
-    tracked!(mir_opt_level, 3);
+    tracked!(mir_opt_level, Some(4));
     tracked!(mutable_noalias, true);
     tracked!(new_llvm_pass_manager, true);
     tracked!(no_codegen, true);
diff --git a/compiler/rustc_mir/src/transform/const_goto.rs b/compiler/rustc_mir/src/transform/const_goto.rs
index 3eb2e757644..b5c8b4bebc3 100644
--- a/compiler/rustc_mir/src/transform/const_goto.rs
+++ b/compiler/rustc_mir/src/transform/const_goto.rs
@@ -28,7 +28,7 @@ pub struct ConstGoto;
 
 impl<'tcx> MirPass<'tcx> for ConstGoto {
     fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
-        if tcx.sess.opts.debugging_opts.mir_opt_level < 3 {
+        if tcx.sess.mir_opt_level() < 4 {
             return;
         }
         trace!("Running ConstGoto on {:?}", body.source);
diff --git a/compiler/rustc_mir/src/transform/const_prop.rs b/compiler/rustc_mir/src/transform/const_prop.rs
index 2a0e5e2c9c5..263df44f4d1 100644
--- a/compiler/rustc_mir/src/transform/const_prop.rs
+++ b/compiler/rustc_mir/src/transform/const_prop.rs
@@ -725,7 +725,7 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {
             return None;
         }
 
-        if self.tcx.sess.opts.debugging_opts.mir_opt_level >= 3 {
+        if self.tcx.sess.mir_opt_level() >= 4 {
             self.eval_rvalue_with_identities(rvalue, place)
         } else {
             self.use_ecx(|this| this.ecx.eval_rvalue_into_place(rvalue, place))
@@ -903,7 +903,7 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {
 
     /// Returns `true` if and only if this `op` should be const-propagated into.
     fn should_const_prop(&mut self, op: &OpTy<'tcx>) -> bool {
-        let mir_opt_level = self.tcx.sess.opts.debugging_opts.mir_opt_level;
+        let mir_opt_level = self.tcx.sess.mir_opt_level();
 
         if mir_opt_level == 0 {
             return false;
@@ -1071,9 +1071,9 @@ impl<'mir, 'tcx> MutVisitor<'tcx> for ConstPropagator<'mir, 'tcx> {
     fn visit_operand(&mut self, operand: &mut Operand<'tcx>, location: Location) {
         self.super_operand(operand, location);
 
-        // Only const prop copies and moves on `mir_opt_level=2` as doing so
+        // Only const prop copies and moves on `mir_opt_level=3` as doing so
         // currently slightly increases compile time in some cases.
-        if self.tcx.sess.opts.debugging_opts.mir_opt_level >= 2 {
+        if self.tcx.sess.mir_opt_level() >= 3 {
             self.propagate_operand(operand)
         }
     }
@@ -1253,7 +1253,7 @@ impl<'mir, 'tcx> MutVisitor<'tcx> for ConstPropagator<'mir, 'tcx> {
             TerminatorKind::SwitchInt { ref mut discr, .. } => {
                 // FIXME: This is currently redundant with `visit_operand`, but sadly
                 // always visiting operands currently causes a perf regression in LLVM codegen, so
-                // `visit_operand` currently only runs for propagates places for `mir_opt_level=3`.
+                // `visit_operand` currently only runs for propagates places for `mir_opt_level=4`.
                 self.propagate_operand(discr)
             }
             // None of these have Operands to const-propagate.
@@ -1272,7 +1272,7 @@ impl<'mir, 'tcx> MutVisitor<'tcx> for ConstPropagator<'mir, 'tcx> {
             // Every argument in our function calls have already been propagated in `visit_operand`.
             //
             // NOTE: because LLVM codegen gives slight performance regressions with it, so this is
-            // gated on `mir_opt_level=2`.
+            // gated on `mir_opt_level=3`.
             TerminatorKind::Call { .. } => {}
         }
 
diff --git a/compiler/rustc_mir/src/transform/deduplicate_blocks.rs b/compiler/rustc_mir/src/transform/deduplicate_blocks.rs
index 5f09159e91b..c4b51099f53 100644
--- a/compiler/rustc_mir/src/transform/deduplicate_blocks.rs
+++ b/compiler/rustc_mir/src/transform/deduplicate_blocks.rs
@@ -16,7 +16,7 @@ pub struct DeduplicateBlocks;
 
 impl<'tcx> MirPass<'tcx> for DeduplicateBlocks {
     fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
-        if tcx.sess.opts.debugging_opts.mir_opt_level < 3 {
+        if tcx.sess.mir_opt_level() < 4 {
             return;
         }
         debug!("Running DeduplicateBlocks on `{:?}`", body.source);
diff --git a/compiler/rustc_mir/src/transform/dest_prop.rs b/compiler/rustc_mir/src/transform/dest_prop.rs
index 46de5dba6e0..0822ab73c4c 100644
--- a/compiler/rustc_mir/src/transform/dest_prop.rs
+++ b/compiler/rustc_mir/src/transform/dest_prop.rs
@@ -127,9 +127,9 @@ pub struct DestinationPropagation;
 
 impl<'tcx> MirPass<'tcx> for DestinationPropagation {
     fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
-        // Only run at mir-opt-level=2 or higher for now (we don't fix up debuginfo and remove
+        // Only run at mir-opt-level=3 or higher for now (we don't fix up debuginfo and remove
         // storage statements at the moment).
-        if tcx.sess.opts.debugging_opts.mir_opt_level <= 1 {
+        if tcx.sess.mir_opt_level() < 3 {
             return;
         }
 
diff --git a/compiler/rustc_mir/src/transform/early_otherwise_branch.rs b/compiler/rustc_mir/src/transform/early_otherwise_branch.rs
index b16a99d7f0d..821167fd9f0 100644
--- a/compiler/rustc_mir/src/transform/early_otherwise_branch.rs
+++ b/compiler/rustc_mir/src/transform/early_otherwise_branch.rs
@@ -26,7 +26,7 @@ pub struct EarlyOtherwiseBranch;
 
 impl<'tcx> MirPass<'tcx> for EarlyOtherwiseBranch {
     fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
-        if tcx.sess.opts.debugging_opts.mir_opt_level < 2 {
+        if tcx.sess.mir_opt_level() < 3 {
             return;
         }
         trace!("running EarlyOtherwiseBranch on {:?}", body.source);
diff --git a/compiler/rustc_mir/src/transform/inline.rs b/compiler/rustc_mir/src/transform/inline.rs
index 0a899273efe..cf85503b3d5 100644
--- a/compiler/rustc_mir/src/transform/inline.rs
+++ b/compiler/rustc_mir/src/transform/inline.rs
@@ -52,7 +52,7 @@ crate fn is_enabled(tcx: TyCtxt<'_>) -> bool {
         return enabled;
     }
 
-    tcx.sess.opts.debugging_opts.mir_opt_level >= 2
+    tcx.sess.mir_opt_level() >= 3
 }
 
 impl<'tcx> MirPass<'tcx> for Inline {
diff --git a/compiler/rustc_mir/src/transform/match_branches.rs b/compiler/rustc_mir/src/transform/match_branches.rs
index 92b4ae397ae..e254f0553aa 100644
--- a/compiler/rustc_mir/src/transform/match_branches.rs
+++ b/compiler/rustc_mir/src/transform/match_branches.rs
@@ -40,7 +40,7 @@ pub struct MatchBranchSimplification;
 
 impl<'tcx> MirPass<'tcx> for MatchBranchSimplification {
     fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
-        if tcx.sess.opts.debugging_opts.mir_opt_level <= 1 {
+        if tcx.sess.mir_opt_level() < 3 {
             return;
         }
 
diff --git a/compiler/rustc_mir/src/transform/mod.rs b/compiler/rustc_mir/src/transform/mod.rs
index 9cb8abf75c4..13546442f66 100644
--- a/compiler/rustc_mir/src/transform/mod.rs
+++ b/compiler/rustc_mir/src/transform/mod.rs
@@ -475,7 +475,7 @@ fn run_post_borrowck_cleanup_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tc
 }
 
 fn run_optimization_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
-    let mir_opt_level = tcx.sess.opts.debugging_opts.mir_opt_level;
+    let mir_opt_level = tcx.sess.mir_opt_level();
 
     // Lowering generator control-flow and variables has to happen before we do anything else
     // to them. We run some optimizations before that, because they may be harder to do on the state
diff --git a/compiler/rustc_mir/src/transform/multiple_return_terminators.rs b/compiler/rustc_mir/src/transform/multiple_return_terminators.rs
index 617086622cc..4aaa0baa9f4 100644
--- a/compiler/rustc_mir/src/transform/multiple_return_terminators.rs
+++ b/compiler/rustc_mir/src/transform/multiple_return_terminators.rs
@@ -10,7 +10,7 @@ pub struct MultipleReturnTerminators;
 
 impl<'tcx> MirPass<'tcx> for MultipleReturnTerminators {
     fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
-        if tcx.sess.opts.debugging_opts.mir_opt_level < 3 {
+        if tcx.sess.mir_opt_level() < 4 {
             return;
         }
 
diff --git a/compiler/rustc_mir/src/transform/nrvo.rs b/compiler/rustc_mir/src/transform/nrvo.rs
index ce02fb261df..445dc12909c 100644
--- a/compiler/rustc_mir/src/transform/nrvo.rs
+++ b/compiler/rustc_mir/src/transform/nrvo.rs
@@ -34,7 +34,7 @@ pub struct RenameReturnPlace;
 
 impl<'tcx> MirPass<'tcx> for RenameReturnPlace {
     fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut mir::Body<'tcx>) {
-        if tcx.sess.opts.debugging_opts.mir_opt_level == 0 {
+        if tcx.sess.mir_opt_level() == 0 {
             return;
         }
 
diff --git a/compiler/rustc_mir/src/transform/unreachable_prop.rs b/compiler/rustc_mir/src/transform/unreachable_prop.rs
index e39c8656021..658c6b6e9db 100644
--- a/compiler/rustc_mir/src/transform/unreachable_prop.rs
+++ b/compiler/rustc_mir/src/transform/unreachable_prop.rs
@@ -12,8 +12,8 @@ pub struct UnreachablePropagation;
 
 impl MirPass<'_> for UnreachablePropagation {
     fn run_pass<'tcx>(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
-        if tcx.sess.opts.debugging_opts.mir_opt_level < 3 {
-            // Enable only under -Zmir-opt-level=3 as in some cases (check the deeply-nested-opt
+        if tcx.sess.mir_opt_level() < 4 {
+            // Enable only under -Zmir-opt-level=4 as in some cases (check the deeply-nested-opt
             // perf benchmark) LLVM may spend quite a lot of time optimizing the generated code.
             return;
         }
diff --git a/compiler/rustc_session/src/config.rs b/compiler/rustc_session/src/config.rs
index 77a9a2b227c..f25828e2161 100644
--- a/compiler/rustc_session/src/config.rs
+++ b/compiler/rustc_session/src/config.rs
@@ -1938,21 +1938,23 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options {
             Some(SymbolManglingVersion::V0) => {}
         }
 
-        if debugging_opts.mir_opt_level > 1 {
-            // Functions inlined during MIR transform can, at best, make it impossible to
-            // effectively cover inlined functions, and, at worst, break coverage map generation
-            // during LLVM codegen. For example, function counter IDs are only unique within a
-            // function. Inlining after these counters are injected can produce duplicate counters,
-            // resulting in an invalid coverage map (and ICE); so this option combination is not
-            // allowed.
-            early_warn(
-                error_format,
-                &format!(
-                    "`-Z mir-opt-level={}` (or any level > 1) enables function inlining, which \
+        if let Some(mir_opt_level) = debugging_opts.mir_opt_level {
+            if mir_opt_level > 1 {
+                // Functions inlined during MIR transform can, at best, make it impossible to
+                // effectively cover inlined functions, and, at worst, break coverage map generation
+                // during LLVM codegen. For example, function counter IDs are only unique within a
+                // function. Inlining after these counters are injected can produce duplicate counters,
+                // resulting in an invalid coverage map (and ICE); so this option combination is not
+                // allowed.
+                early_warn(
+                    error_format,
+                    &format!(
+                        "`-Z mir-opt-level={}` (or any level > 1) enables function inlining, which \
                     is incompatible with `-Z instrument-coverage`. Inlining will be disabled.",
-                    debugging_opts.mir_opt_level,
-                ),
-            );
+                        mir_opt_level,
+                    ),
+                );
+            }
         }
     }
 
diff --git a/compiler/rustc_session/src/options.rs b/compiler/rustc_session/src/options.rs
index 6e7d39547a1..79bbad8307b 100644
--- a/compiler/rustc_session/src/options.rs
+++ b/compiler/rustc_session/src/options.rs
@@ -999,8 +999,8 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
     mir_emit_retag: bool = (false, parse_bool, [TRACKED],
         "emit Retagging MIR statements, interpreted e.g., by miri; implies -Zmir-opt-level=0 \
         (default: no)"),
-    mir_opt_level: usize = (1, parse_uint, [TRACKED],
-        "MIR optimization level (0-3; default: 1)"),
+    mir_opt_level: Option<usize> = (None, parse_opt_uint, [TRACKED],
+        "MIR optimization level (0-4; default: 1 in non optimized builds and 2 in optimized builds)"),
     mutable_noalias: bool = (false, parse_bool, [TRACKED],
         "emit noalias metadata for mutable references (default: no)"),
     new_llvm_pass_manager: bool = (false, parse_bool, [TRACKED],
diff --git a/compiler/rustc_session/src/session.rs b/compiler/rustc_session/src/session.rs
index 493bbb3a762..963df0fb4d7 100644
--- a/compiler/rustc_session/src/session.rs
+++ b/compiler/rustc_session/src/session.rs
@@ -640,6 +640,12 @@ impl Session {
     pub fn binary_dep_depinfo(&self) -> bool {
         self.opts.debugging_opts.binary_dep_depinfo
     }
+    pub fn mir_opt_level(&self) -> usize {
+        self.opts
+            .debugging_opts
+            .mir_opt_level
+            .unwrap_or_else(|| if self.opts.optimize != config::OptLevel::No { 2 } else { 1 })
+    }
 
     /// Gets the features enabled for the current compilation session.
     /// DO NOT USE THIS METHOD if there is a TyCtxt available, as it circumvents
diff --git a/src/test/codegen/issue-59352.rs b/src/test/codegen/issue-59352.rs
index 28bb8591232..d271fe027e3 100644
--- a/src/test/codegen/issue-59352.rs
+++ b/src/test/codegen/issue-59352.rs
@@ -5,8 +5,8 @@
 // Once the optimizer can do that, mir-opt/issues/issue-59352.rs will need to be updated and this
 // test case should be removed as it will become redundant.
 
-// mir-opt-level=2 enables inlining and enables LLVM to optimize away the unreachable panic call.
-// compile-flags: -O -Z mir-opt-level=2
+// mir-opt-level=3 enables inlining and enables LLVM to optimize away the unreachable panic call.
+// compile-flags: -O -Z mir-opt-level=3
 
 #![crate_type = "rlib"]
 
diff --git a/src/test/codegen/naked-noinline.rs b/src/test/codegen/naked-noinline.rs
index 2a2208d4fce..d9e6f6c34ec 100644
--- a/src/test/codegen/naked-noinline.rs
+++ b/src/test/codegen/naked-noinline.rs
@@ -1,5 +1,5 @@
 // Checks that naked functions are never inlined.
-// compile-flags: -O -Zmir-opt-level=2
+// compile-flags: -O -Zmir-opt-level=3
 // ignore-wasm32
 #![crate_type = "lib"]
 #![feature(asm)]
diff --git a/src/test/codegen/sanitizer-no-sanitize-inlining.rs b/src/test/codegen/sanitizer-no-sanitize-inlining.rs
index be0547afa4c..f4af60baefe 100644
--- a/src/test/codegen/sanitizer-no-sanitize-inlining.rs
+++ b/src/test/codegen/sanitizer-no-sanitize-inlining.rs
@@ -4,8 +4,8 @@
 // needs-sanitizer-address
 // needs-sanitizer-leak
 // revisions: ASAN LSAN
-//[ASAN] compile-flags: -Zsanitizer=address -C opt-level=3 -Z mir-opt-level=3
-//[LSAN] compile-flags: -Zsanitizer=leak    -C opt-level=3 -Z mir-opt-level=3
+//[ASAN] compile-flags: -Zsanitizer=address -C opt-level=3 -Z mir-opt-level=4
+//[LSAN] compile-flags: -Zsanitizer=leak    -C opt-level=3 -Z mir-opt-level=4
 
 #![crate_type="lib"]
 #![feature(no_sanitize)]
diff --git a/src/test/codegen/try_identity.rs b/src/test/codegen/try_identity.rs
index d51bd575719..81e2435e5b8 100644
--- a/src/test/codegen/try_identity.rs
+++ b/src/test/codegen/try_identity.rs
@@ -1,4 +1,4 @@
-// compile-flags: -C no-prepopulate-passes -O -Z mir-opt-level=2 -Zunsound-mir-opts
+// compile-flags: -C no-prepopulate-passes -O -Z mir-opt-level=3 -Zunsound-mir-opts
 
 // Ensure that `x?` has no overhead on `Result<T, E>` due to identity `match`es in lowering.
 // This requires inlining to trigger the MIR optimizations in `SimplifyArmIdentity`.
diff --git a/src/test/mir-opt/const_prop/boolean_identities.rs b/src/test/mir-opt/const_prop/boolean_identities.rs
index 6dae07dfbd1..57164e3e794 100644
--- a/src/test/mir-opt/const_prop/boolean_identities.rs
+++ b/src/test/mir-opt/const_prop/boolean_identities.rs
@@ -1,4 +1,4 @@
-// compile-flags: -O -Zmir-opt-level=3
+// compile-flags: -O -Zmir-opt-level=4
 
 // EMIT_MIR boolean_identities.test.ConstProp.diff
 pub fn test(x: bool, y: bool) -> bool {
diff --git a/src/test/mir-opt/const_prop/issue-66971.rs b/src/test/mir-opt/const_prop/issue-66971.rs
index 986177b5c0a..81eccae46b9 100644
--- a/src/test/mir-opt/const_prop/issue-66971.rs
+++ b/src/test/mir-opt/const_prop/issue-66971.rs
@@ -1,4 +1,4 @@
-// compile-flags: -Z mir-opt-level=2
+// compile-flags: -Z mir-opt-level=3
 
 // Due to a bug in propagating scalar pairs the assertion below used to fail. In the expected
 // outputs below, after ConstProp this is how _2 would look like with the bug:
diff --git a/src/test/mir-opt/const_prop/issue-67019.rs b/src/test/mir-opt/const_prop/issue-67019.rs
index d277bd5869c..c78b8b97178 100644
--- a/src/test/mir-opt/const_prop/issue-67019.rs
+++ b/src/test/mir-opt/const_prop/issue-67019.rs
@@ -1,4 +1,4 @@
-// compile-flags: -Z mir-opt-level=2
+// compile-flags: -Z mir-opt-level=3
 
 // This used to ICE in const-prop
 
diff --git a/src/test/mir-opt/const_prop/mult_by_zero.rs b/src/test/mir-opt/const_prop/mult_by_zero.rs
index 1cb50155b5e..b0ecdf1818e 100644
--- a/src/test/mir-opt/const_prop/mult_by_zero.rs
+++ b/src/test/mir-opt/const_prop/mult_by_zero.rs
@@ -1,4 +1,4 @@
-// compile-flags: -O -Zmir-opt-level=3
+// compile-flags: -O -Zmir-opt-level=4
 
 // EMIT_MIR mult_by_zero.test.ConstProp.diff
 fn test(x : i32) -> i32 {
diff --git a/src/test/mir-opt/early_otherwise_branch.rs b/src/test/mir-opt/early_otherwise_branch.rs
index 77003442080..548213ab83c 100644
--- a/src/test/mir-opt/early_otherwise_branch.rs
+++ b/src/test/mir-opt/early_otherwise_branch.rs
@@ -1,4 +1,4 @@
-// compile-flags: -Z mir-opt-level=3
+// compile-flags: -Z mir-opt-level=4
 // EMIT_MIR early_otherwise_branch.opt1.EarlyOtherwiseBranch.diff
 fn opt1(x: Option<u32>, y: Option<u32>) -> u32 {
     match (x, y) {
diff --git a/src/test/mir-opt/early_otherwise_branch_3_element_tuple.rs b/src/test/mir-opt/early_otherwise_branch_3_element_tuple.rs
index 1d6877d67df..aa304f747f7 100644
--- a/src/test/mir-opt/early_otherwise_branch_3_element_tuple.rs
+++ b/src/test/mir-opt/early_otherwise_branch_3_element_tuple.rs
@@ -1,4 +1,4 @@
-// compile-flags: -Z mir-opt-level=3
+// compile-flags: -Z mir-opt-level=4
 
 // EMIT_MIR early_otherwise_branch_3_element_tuple.opt1.EarlyOtherwiseBranch.diff
 fn opt1(x: Option<u32>, y: Option<u32>, z: Option<u32>) -> u32 {
diff --git a/src/test/mir-opt/early_otherwise_branch_68867.rs b/src/test/mir-opt/early_otherwise_branch_68867.rs
index b822c58f550..e11337643da 100644
--- a/src/test/mir-opt/early_otherwise_branch_68867.rs
+++ b/src/test/mir-opt/early_otherwise_branch_68867.rs
@@ -1,5 +1,5 @@
 // ignore-tidy-linelength
-// compile-flags: -Z mir-opt-level=3 -Zunsound-mir-opts
+// compile-flags: -Z mir-opt-level=4 -Zunsound-mir-opts
 
 // example from #68867
 type CSSFloat = f32;
diff --git a/src/test/mir-opt/early_otherwise_branch_noopt.rs b/src/test/mir-opt/early_otherwise_branch_noopt.rs
index bd15f520dfc..aa9ddf485b5 100644
--- a/src/test/mir-opt/early_otherwise_branch_noopt.rs
+++ b/src/test/mir-opt/early_otherwise_branch_noopt.rs
@@ -1,4 +1,4 @@
-// compile-flags: -Z mir-opt-level=3
+// compile-flags: -Z mir-opt-level=4
 
 // must not optimize as it does not follow the pattern of
 // left and right hand side being the same variant
diff --git a/src/test/mir-opt/inline/inline-into-box-place.rs b/src/test/mir-opt/inline/inline-into-box-place.rs
index 57298605b18..049a97816f6 100644
--- a/src/test/mir-opt/inline/inline-into-box-place.rs
+++ b/src/test/mir-opt/inline/inline-into-box-place.rs
@@ -1,6 +1,6 @@
 // ignore-endian-big
 // ignore-wasm32-bare compiled with panic=abort by default
-// compile-flags: -Z mir-opt-level=3
+// compile-flags: -Z mir-opt-level=4
 // EMIT_MIR_FOR_EACH_BIT_WIDTH
 #![feature(box_syntax)]
 // EMIT_MIR inline_into_box_place.main.Inline.diff
diff --git a/src/test/mir-opt/inline/inline-trait-method_2.rs b/src/test/mir-opt/inline/inline-trait-method_2.rs
index 6e5de8315a1..378e71a2567 100644
--- a/src/test/mir-opt/inline/inline-trait-method_2.rs
+++ b/src/test/mir-opt/inline/inline-trait-method_2.rs
@@ -1,4 +1,4 @@
-// compile-flags: -Z span_free_formats -Z mir-opt-level=3
+// compile-flags: -Z span_free_formats -Z mir-opt-level=4
 
 // EMIT_MIR inline_trait_method_2.test2.Inline.after.mir
 fn test2(x: &dyn X) -> bool {
diff --git a/src/test/mir-opt/issues/issue-59352.rs b/src/test/mir-opt/issues/issue-59352.rs
index 9e59337a01d..1e0045555ab 100644
--- a/src/test/mir-opt/issues/issue-59352.rs
+++ b/src/test/mir-opt/issues/issue-59352.rs
@@ -7,7 +7,7 @@
 // removed.
 
 // EMIT_MIR issue_59352.num_to_digit.PreCodegen.after.mir
-// compile-flags: -Z mir-opt-level=2 -Z span_free_formats
+// compile-flags: -Z mir-opt-level=3 -Z span_free_formats
 
 pub fn num_to_digit(num: char) -> u32 {
     // CHECK-NOT: panic
diff --git a/src/test/mir-opt/multiple_return_terminators.rs b/src/test/mir-opt/multiple_return_terminators.rs
index b73a51d4835..a2b902d1483 100644
--- a/src/test/mir-opt/multiple_return_terminators.rs
+++ b/src/test/mir-opt/multiple_return_terminators.rs
@@ -1,4 +1,4 @@
-// compile-flags: -Z mir-opt-level=3
+// compile-flags: -Z mir-opt-level=4
 // EMIT_MIR multiple_return_terminators.test.MultipleReturnTerminators.diff
 
 fn test(x: bool) {
diff --git a/src/test/mir-opt/simplify-arm-identity.rs b/src/test/mir-opt/simplify-arm-identity.rs
index 0a59032e87b..bedc86bbacb 100644
--- a/src/test/mir-opt/simplify-arm-identity.rs
+++ b/src/test/mir-opt/simplify-arm-identity.rs
@@ -1,7 +1,7 @@
 // Checks that `SimplifyArmIdentity` is not applied if enums have incompatible layouts.
 // Regression test for issue #66856.
 //
-// compile-flags: -Zmir-opt-level=2
+// compile-flags: -Zmir-opt-level=3
 // EMIT_MIR_FOR_EACH_BIT_WIDTH
 
 enum Src {
diff --git a/src/test/mir-opt/simplify-arm.rs b/src/test/mir-opt/simplify-arm.rs
index a7df786357b..50b5147e0cf 100644
--- a/src/test/mir-opt/simplify-arm.rs
+++ b/src/test/mir-opt/simplify-arm.rs
@@ -1,4 +1,4 @@
-// compile-flags: -Z mir-opt-level=2 -Zunsound-mir-opts
+// compile-flags: -Z mir-opt-level=3 -Zunsound-mir-opts
 // EMIT_MIR simplify_arm.id.SimplifyArmIdentity.diff
 // EMIT_MIR simplify_arm.id.SimplifyBranchSame.diff
 // EMIT_MIR simplify_arm.id_result.SimplifyArmIdentity.diff
diff --git a/src/test/ui/const-generics/issues/issue-75299.rs b/src/test/ui/const-generics/issues/issue-75299.rs
index 23f30a1eea0..9d3f25b3b47 100644
--- a/src/test/ui/const-generics/issues/issue-75299.rs
+++ b/src/test/ui/const-generics/issues/issue-75299.rs
@@ -1,4 +1,4 @@
-// compile-flags: -Zmir-opt-level=3
+// compile-flags: -Zmir-opt-level=4
 // run-pass
 
 #![feature(const_generics)]
diff --git a/src/test/ui/const_prop/inline_spans.rs b/src/test/ui/const_prop/inline_spans.rs
index 32902b49d02..adc7874104a 100644
--- a/src/test/ui/const_prop/inline_spans.rs
+++ b/src/test/ui/const_prop/inline_spans.rs
@@ -1,5 +1,5 @@
 // build-fail
-// compile-flags: -Zmir-opt-level=2
+// compile-flags: -Zmir-opt-level=3
 
 #![deny(warnings)]
 
diff --git a/src/test/ui/const_prop/inline_spans_lint_attribute.rs b/src/test/ui/const_prop/inline_spans_lint_attribute.rs
index 656ff02dc67..1db53d77193 100644
--- a/src/test/ui/const_prop/inline_spans_lint_attribute.rs
+++ b/src/test/ui/const_prop/inline_spans_lint_attribute.rs
@@ -1,6 +1,6 @@
 // Must be build-pass, because check-pass will not run const prop and thus not emit the lint anyway.
 // build-pass
-// compile-flags: -Zmir-opt-level=2
+// compile-flags: -Zmir-opt-level=3
 
 #![deny(warnings)]
 
diff --git a/src/test/ui/consts/issue-66345.rs b/src/test/ui/consts/issue-66345.rs
index 7d0de73007c..4971d96476f 100644
--- a/src/test/ui/consts/issue-66345.rs
+++ b/src/test/ui/consts/issue-66345.rs
@@ -1,8 +1,8 @@
 // run-pass
-// compile-flags: -Z mir-opt-level=3
+// compile-flags: -Z mir-opt-level=4
 
 // Checks that the compiler does not ICE when passing references to field of by-value struct
-// with -Z mir-opt-level=3
+// with -Z mir-opt-level=4
 
 fn do_nothing(_: &()) {}
 
diff --git a/src/test/ui/consts/issue-67529.rs b/src/test/ui/consts/issue-67529.rs
index df4bc668bee..dd24c2d27e2 100644
--- a/src/test/ui/consts/issue-67529.rs
+++ b/src/test/ui/consts/issue-67529.rs
@@ -1,4 +1,4 @@
-// compile-flags: -Z mir-opt-level=2
+// compile-flags: -Z mir-opt-level=3
 // run-pass
 
 struct Baz<T: ?Sized> {
diff --git a/src/test/ui/consts/issue-67640.rs b/src/test/ui/consts/issue-67640.rs
index bc0ee8d386f..4c71a2e0224 100644
--- a/src/test/ui/consts/issue-67640.rs
+++ b/src/test/ui/consts/issue-67640.rs
@@ -1,4 +1,4 @@
-// compile-flags: -Z mir-opt-level=3
+// compile-flags: -Z mir-opt-level=4
 // run-pass
 
 struct X {
diff --git a/src/test/ui/consts/issue-67641.rs b/src/test/ui/consts/issue-67641.rs
index f50fba287a2..e5a74f15654 100644
--- a/src/test/ui/consts/issue-67641.rs
+++ b/src/test/ui/consts/issue-67641.rs
@@ -1,4 +1,4 @@
-// compile-flags: -Z mir-opt-level=2
+// compile-flags: -Z mir-opt-level=3
 // run-pass
 
 use std::cell::Cell;
diff --git a/src/test/ui/consts/issue-67862.rs b/src/test/ui/consts/issue-67862.rs
index 84f72154d26..b9e96a87f14 100644
--- a/src/test/ui/consts/issue-67862.rs
+++ b/src/test/ui/consts/issue-67862.rs
@@ -1,4 +1,4 @@
-// compile-flags: -Z mir-opt-level=2
+// compile-flags: -Z mir-opt-level=3
 // run-pass
 
 fn e220() -> (i64, i64) {
diff --git a/src/test/ui/consts/trait_specialization.rs b/src/test/ui/consts/trait_specialization.rs
index 3adbbb53046..c581ef6b0f7 100644
--- a/src/test/ui/consts/trait_specialization.rs
+++ b/src/test/ui/consts/trait_specialization.rs
@@ -1,5 +1,5 @@
 // ignore-wasm32-bare which doesn't support `std::process:exit()`
-// compile-flags: -Zmir-opt-level=2
+// compile-flags: -Zmir-opt-level=3
 // run-pass
 
 // Tests that specialization does not cause optimizations running on polymorphic MIR to resolve
diff --git a/src/test/ui/dest-prop/skeptic-miscompile.rs b/src/test/ui/dest-prop/skeptic-miscompile.rs
index c27a1f04532..4bb61dbc7f4 100644
--- a/src/test/ui/dest-prop/skeptic-miscompile.rs
+++ b/src/test/ui/dest-prop/skeptic-miscompile.rs
@@ -1,6 +1,6 @@
 // run-pass
 
-// compile-flags: -Zmir-opt-level=2
+// compile-flags: -Zmir-opt-level=3
 
 trait IterExt: Iterator {
     fn fold_ex<B, F>(mut self, init: B, mut f: F) -> B
diff --git a/src/test/ui/issues/issue-50411.rs b/src/test/ui/issues/issue-50411.rs
index 1bf12707817..cd728b15256 100644
--- a/src/test/ui/issues/issue-50411.rs
+++ b/src/test/ui/issues/issue-50411.rs
@@ -3,7 +3,7 @@
 // elaborate-drops invoked on it) and then try to elaboate drops a
 // second time. Uncool.
 
-// compile-flags:-Zmir-opt-level=3
+// compile-flags:-Zmir-opt-level=4
 // build-pass
 
 fn main() {
diff --git a/src/test/ui/issues/issue-50865-private-impl-trait/auxiliary/lib.rs b/src/test/ui/issues/issue-50865-private-impl-trait/auxiliary/lib.rs
index fb4bf2b8b44..1e20a546069 100644
--- a/src/test/ui/issues/issue-50865-private-impl-trait/auxiliary/lib.rs
+++ b/src/test/ui/issues/issue-50865-private-impl-trait/auxiliary/lib.rs
@@ -1,5 +1,5 @@
 // revisions: default miropt
-//[miropt]compile-flags: -Z mir-opt-level=2
+//[miropt]compile-flags: -Z mir-opt-level=3
 // ~^ This flag is for #77668, it used to be ICE.
 
 #![crate_type = "lib"]
diff --git a/src/test/ui/issues/issue-77002.rs b/src/test/ui/issues/issue-77002.rs
index c7dd3cf8109..0c37346eaf8 100644
--- a/src/test/ui/issues/issue-77002.rs
+++ b/src/test/ui/issues/issue-77002.rs
@@ -1,4 +1,4 @@
-// compile-flags: -Zmir-opt-level=2 -Copt-level=0
+// compile-flags: -Zmir-opt-level=3 -Copt-level=0
 // run-pass
 
 type M = [i64; 2];
diff --git a/src/test/ui/mir/auxiliary/issue_76375_aux.rs b/src/test/ui/mir/auxiliary/issue_76375_aux.rs
index 72f32ecf7ea..90f4df739f1 100644
--- a/src/test/ui/mir/auxiliary/issue_76375_aux.rs
+++ b/src/test/ui/mir/auxiliary/issue_76375_aux.rs
@@ -1,5 +1,5 @@
 // edition:2018
-// compile-flags: -Z mir-opt-level=2
+// compile-flags: -Z mir-opt-level=3
 
 #[inline(always)]
 pub fn copy_prop(s: bool) -> String {
diff --git a/src/test/ui/mir/issue-66851.rs b/src/test/ui/mir/issue-66851.rs
index 72d62a30a33..878ad4e475a 100644
--- a/src/test/ui/mir/issue-66851.rs
+++ b/src/test/ui/mir/issue-66851.rs
@@ -2,7 +2,7 @@
 // did not check that the types matched up in the `Ok(r)` branch.
 //
 // run-pass
-// compile-flags: -Zmir-opt-level=2
+// compile-flags: -Zmir-opt-level=3
 
 #[derive(Debug, PartialEq, Eq)]
 enum SpecialsRes { Res(u64) }
diff --git a/src/test/ui/mir/issue-67639-normalization-ice.rs b/src/test/ui/mir/issue-67639-normalization-ice.rs
index 21851a72525..71150a80bc0 100644
--- a/src/test/ui/mir/issue-67639-normalization-ice.rs
+++ b/src/test/ui/mir/issue-67639-normalization-ice.rs
@@ -1,4 +1,4 @@
-// compile-flags: -Z mir-opt-level=3
+// compile-flags: -Z mir-opt-level=4
 // build-pass
 
 // This used to ICE in const-prop due
diff --git a/src/test/ui/mir/issue-67710-inline-projection.rs b/src/test/ui/mir/issue-67710-inline-projection.rs
index 37d8f2eac9b..1ff6b4d628c 100644
--- a/src/test/ui/mir/issue-67710-inline-projection.rs
+++ b/src/test/ui/mir/issue-67710-inline-projection.rs
@@ -1,4 +1,4 @@
-// compile-flags: -Z mir-opt-level=2
+// compile-flags: -Z mir-opt-level=3
 // build-pass
 
 // This used to ICE due to the inling pass not examining projections
diff --git a/src/test/ui/mir/issue-68841.rs b/src/test/ui/mir/issue-68841.rs
index 14884a97fab..550bd452a80 100644
--- a/src/test/ui/mir/issue-68841.rs
+++ b/src/test/ui/mir/issue-68841.rs
@@ -1,4 +1,4 @@
-// compile-flags: -Z mir-opt-level=2
+// compile-flags: -Z mir-opt-level=3
 // edition:2018
 // build-pass
 
diff --git a/src/test/ui/mir/issue-71793-inline-args-storage.rs b/src/test/ui/mir/issue-71793-inline-args-storage.rs
index 87b2806d4e2..18f2e38d14c 100644
--- a/src/test/ui/mir/issue-71793-inline-args-storage.rs
+++ b/src/test/ui/mir/issue-71793-inline-args-storage.rs
@@ -4,7 +4,7 @@
 //
 // check-pass
 // edition:2018
-// compile-args: -Zmir-opt-level=2
+// compile-args: -Zmir-opt-level=3
 
 #![crate_type = "lib"]
 
diff --git a/src/test/ui/mir/issue-75053.rs b/src/test/ui/mir/issue-75053.rs
index 6e7211c2ee6..d54e23169c4 100644
--- a/src/test/ui/mir/issue-75053.rs
+++ b/src/test/ui/mir/issue-75053.rs
@@ -1,4 +1,4 @@
-// compile-flags: -Z mir-opt-level=2
+// compile-flags: -Z mir-opt-level=3
 // build-pass
 
 #![feature(type_alias_impl_trait)]
diff --git a/src/test/ui/mir/issue-76248.rs b/src/test/ui/mir/issue-76248.rs
index b01a9727852..18473e79e86 100644
--- a/src/test/ui/mir/issue-76248.rs
+++ b/src/test/ui/mir/issue-76248.rs
@@ -3,7 +3,7 @@
 // Regression test for #76248.
 //
 // build-pass
-// compile-flags: -Zmir-opt-level=2
+// compile-flags: -Zmir-opt-level=3
 
 const N: usize = 1;
 
diff --git a/src/test/ui/mir/issue-76375.rs b/src/test/ui/mir/issue-76375.rs
index a7772cb1fe6..e635caca9fd 100644
--- a/src/test/ui/mir/issue-76375.rs
+++ b/src/test/ui/mir/issue-76375.rs
@@ -2,7 +2,7 @@
 //
 // edition:2018
 // build-pass
-// compile-flags: -Z mir-opt-level=2
+// compile-flags: -Z mir-opt-level=3
 // aux-build:issue_76375_aux.rs
 
 #![crate_type = "lib"]
diff --git a/src/test/ui/mir/issue-76740-copy-propagation.rs b/src/test/ui/mir/issue-76740-copy-propagation.rs
index 90999a3e556..1d4ec11762a 100644
--- a/src/test/ui/mir/issue-76740-copy-propagation.rs
+++ b/src/test/ui/mir/issue-76740-copy-propagation.rs
@@ -1,6 +1,6 @@
 // Regression test for issue #76740.
 // run-pass
-// compile-flags: -Zmir-opt-level=3
+// compile-flags: -Zmir-opt-level=4
 
 #[derive(Copy, Clone)]
 pub struct V([usize; 4]);
diff --git a/src/test/ui/mir/issue-77911.rs b/src/test/ui/mir/issue-77911.rs
index fff303495e7..acf4c20542d 100644
--- a/src/test/ui/mir/issue-77911.rs
+++ b/src/test/ui/mir/issue-77911.rs
@@ -1,4 +1,4 @@
-// compile-flags: -Z mir-opt-level=2
+// compile-flags: -Z mir-opt-level=3
 // build-pass
 
 use std::fs::File;
diff --git a/src/test/ui/mir/issue-78496.rs b/src/test/ui/mir/issue-78496.rs
index 1b0687cfac3..a0d1f5a780e 100644
--- a/src/test/ui/mir/issue-78496.rs
+++ b/src/test/ui/mir/issue-78496.rs
@@ -1,5 +1,5 @@
 // run-pass
-// compile-flags: -Z mir-opt-level=2 -C opt-level=0
+// compile-flags: -Z mir-opt-level=3 -C opt-level=0
 
 // example from #78496
 pub enum E<'a> {
diff --git a/src/test/ui/mir/issue66339.rs b/src/test/ui/mir/issue66339.rs
index 98e178c0551..2507af38cdf 100644
--- a/src/test/ui/mir/issue66339.rs
+++ b/src/test/ui/mir/issue66339.rs
@@ -1,4 +1,4 @@
-// compile-flags: -Z mir-opt-level=2
+// compile-flags: -Z mir-opt-level=3
 // build-pass
 
 // This used to ICE in const-prop
diff --git a/src/test/ui/mir/mir-inlining/array-clone-with-generic-size.rs b/src/test/ui/mir/mir-inlining/array-clone-with-generic-size.rs
index eec0a4599c3..e36e8bd746d 100644
--- a/src/test/ui/mir/mir-inlining/array-clone-with-generic-size.rs
+++ b/src/test/ui/mir/mir-inlining/array-clone-with-generic-size.rs
@@ -2,7 +2,7 @@
 // Regression test for issue #79269.
 //
 // build-pass
-// compile-flags: -Zmir-opt-level=2 -Zvalidate-mir
+// compile-flags: -Zmir-opt-level=3 -Zvalidate-mir
 #[derive(Clone)]
 struct Array<T, const N: usize>([T; N]);
 
diff --git a/src/test/ui/mir/mir-inlining/ice-issue-45493.rs b/src/test/ui/mir/mir-inlining/ice-issue-45493.rs
index 1bd16dc43e1..04a23212e7b 100644
--- a/src/test/ui/mir/mir-inlining/ice-issue-45493.rs
+++ b/src/test/ui/mir/mir-inlining/ice-issue-45493.rs
@@ -1,5 +1,5 @@
 // run-pass
-// compile-flags:-Zmir-opt-level=2
+// compile-flags:-Zmir-opt-level=3
 
 trait Array {
     type Item;
diff --git a/src/test/ui/mir/mir-inlining/ice-issue-45885.rs b/src/test/ui/mir/mir-inlining/ice-issue-45885.rs
index e930a4d1ccd..09b1279ef34 100644
--- a/src/test/ui/mir/mir-inlining/ice-issue-45885.rs
+++ b/src/test/ui/mir/mir-inlining/ice-issue-45885.rs
@@ -1,5 +1,5 @@
 // run-pass
-// compile-flags:-Zmir-opt-level=2
+// compile-flags:-Zmir-opt-level=3
 
 pub enum Enum {
     A,
diff --git a/src/test/ui/mir/mir-inlining/ice-issue-68347.rs b/src/test/ui/mir/mir-inlining/ice-issue-68347.rs
index 88b80bc3333..7c135250940 100644
--- a/src/test/ui/mir/mir-inlining/ice-issue-68347.rs
+++ b/src/test/ui/mir/mir-inlining/ice-issue-68347.rs
@@ -1,5 +1,5 @@
 // run-pass
-// compile-flags:-Zmir-opt-level=2
+// compile-flags:-Zmir-opt-level=3
 pub fn main() {
     let _x: fn() = handle_debug_column;
 }
diff --git a/src/test/ui/mir/mir-inlining/ice-issue-77306-1.rs b/src/test/ui/mir/mir-inlining/ice-issue-77306-1.rs
index 4d083bf2321..ef05ff9ce03 100644
--- a/src/test/ui/mir/mir-inlining/ice-issue-77306-1.rs
+++ b/src/test/ui/mir/mir-inlining/ice-issue-77306-1.rs
@@ -1,5 +1,5 @@
 // run-pass
-// compile-flags:-Zmir-opt-level=2
+// compile-flags:-Zmir-opt-level=3
 
 // Previously ICEd because we did not normalize during inlining,
 // see https://github.com/rust-lang/rust/pull/77306 for more discussion.
diff --git a/src/test/ui/mir/mir-inlining/ice-issue-77306-2.rs b/src/test/ui/mir/mir-inlining/ice-issue-77306-2.rs
index a346d450586..cb208401313 100644
--- a/src/test/ui/mir/mir-inlining/ice-issue-77306-2.rs
+++ b/src/test/ui/mir/mir-inlining/ice-issue-77306-2.rs
@@ -1,5 +1,5 @@
 // run-pass
-// compile-flags:-Zmir-opt-level=2
+// compile-flags:-Zmir-opt-level=3
 
 struct Cursor {}
 struct TokenTree {}
diff --git a/src/test/ui/mir/mir-inlining/ice-issue-77564.rs b/src/test/ui/mir/mir-inlining/ice-issue-77564.rs
index 262402df2cc..0d3fbfe5d1a 100644
--- a/src/test/ui/mir/mir-inlining/ice-issue-77564.rs
+++ b/src/test/ui/mir/mir-inlining/ice-issue-77564.rs
@@ -1,5 +1,5 @@
 // run-pass
-// compile-flags:-Zmir-opt-level=2
+// compile-flags:-Zmir-opt-level=3
 
 use std::mem::MaybeUninit;
 const N: usize = 2;
diff --git a/src/test/ui/mir/mir-inlining/inline-instrument-coverage-fail.rs b/src/test/ui/mir/mir-inlining/inline-instrument-coverage-fail.rs
index 2437155d981..8ed7f25d2bb 100644
--- a/src/test/ui/mir/mir-inlining/inline-instrument-coverage-fail.rs
+++ b/src/test/ui/mir/mir-inlining/inline-instrument-coverage-fail.rs
@@ -1,9 +1,9 @@
-// Ensures -Zmir-opt-level=2 (specifically, inlining) is not allowed with -Zinstrument-coverage.
+// Ensures -Zmir-opt-level=3 (specifically, inlining) is not allowed with -Zinstrument-coverage.
 // Regression test for issue #80060.
 //
 // needs-profiler-support
 // build-pass
-// compile-flags: -Zmir-opt-level=2 -Zinstrument-coverage
+// compile-flags: -Zmir-opt-level=3 -Zinstrument-coverage
 #[inline(never)]
 fn foo() {}
 
diff --git a/src/test/ui/mir/mir-inlining/inline-instrument-coverage-fail.stderr b/src/test/ui/mir/mir-inlining/inline-instrument-coverage-fail.stderr
index eb50e5075ca..d482afc395d 100644
--- a/src/test/ui/mir/mir-inlining/inline-instrument-coverage-fail.stderr
+++ b/src/test/ui/mir/mir-inlining/inline-instrument-coverage-fail.stderr
@@ -1,2 +1,2 @@
-warning: `-Z mir-opt-level=2` (or any level > 1) enables function inlining, which is incompatible with `-Z instrument-coverage`. Inlining will be disabled.
+warning: `-Z mir-opt-level=3` (or any level > 1) enables function inlining, which is incompatible with `-Z instrument-coverage`. Inlining will be disabled.
 
diff --git a/src/test/ui/mir/mir-inlining/no-trait-method-issue-40473.rs b/src/test/ui/mir/mir-inlining/no-trait-method-issue-40473.rs
index 8f570dbd4ad..8b3cb703dc0 100644
--- a/src/test/ui/mir/mir-inlining/no-trait-method-issue-40473.rs
+++ b/src/test/ui/mir/mir-inlining/no-trait-method-issue-40473.rs
@@ -1,5 +1,5 @@
 // run-pass
-// compile-flags:-Zmir-opt-level=2
+// compile-flags:-Zmir-opt-level=3
 pub trait Foo {
     fn bar(&self) -> usize { 2 }
 }
diff --git a/src/test/ui/mir/mir-inlining/var-debuginfo-issue-67586.rs b/src/test/ui/mir/mir-inlining/var-debuginfo-issue-67586.rs
index 23cc114880c..e2620682679 100644
--- a/src/test/ui/mir/mir-inlining/var-debuginfo-issue-67586.rs
+++ b/src/test/ui/mir/mir-inlining/var-debuginfo-issue-67586.rs
@@ -1,5 +1,5 @@
 // run-pass
-// compile-flags: -Z mir-opt-level=2 -C opt-level=0 -C debuginfo=2
+// compile-flags: -Z mir-opt-level=3 -C opt-level=0 -C debuginfo=2
 
 #[inline(never)]
 pub fn foo(bar: usize) -> usize {
diff --git a/src/test/ui/mir/mir_const_prop_tuple_field_reorder.rs b/src/test/ui/mir/mir_const_prop_tuple_field_reorder.rs
index 629b50dec65..b66a85d07d3 100644
--- a/src/test/ui/mir/mir_const_prop_tuple_field_reorder.rs
+++ b/src/test/ui/mir/mir_const_prop_tuple_field_reorder.rs
@@ -1,4 +1,4 @@
-// compile-flags: -Z mir-opt-level=2
+// compile-flags: -Z mir-opt-level=3
 // build-pass
 #![crate_type="lib"]
 
diff --git a/src/test/ui/mir/ssa-analysis-regression-50041.rs b/src/test/ui/mir/ssa-analysis-regression-50041.rs
index c818f2976e1..1892807253a 100644
--- a/src/test/ui/mir/ssa-analysis-regression-50041.rs
+++ b/src/test/ui/mir/ssa-analysis-regression-50041.rs
@@ -1,5 +1,5 @@
 // build-pass
-// compile-flags: -Z mir-opt-level=3
+// compile-flags: -Z mir-opt-level=4
 
 #![crate_type="lib"]
 #![feature(lang_items)]
diff --git a/src/test/ui/polymorphization/promoted-function-3.rs b/src/test/ui/polymorphization/promoted-function-3.rs
index 1c84df13e10..bbd991e36cc 100644
--- a/src/test/ui/polymorphization/promoted-function-3.rs
+++ b/src/test/ui/polymorphization/promoted-function-3.rs
@@ -1,5 +1,5 @@
 // run-pass
-// compile-flags: -Zpolymorphize=on -Zmir-opt-level=3
+// compile-flags: -Zpolymorphize=on -Zmir-opt-level=4
 
 fn caller<T, U>() -> &'static usize {
     callee::<U>()
diff --git a/src/test/ui/rfc-2091-track-caller/caller-location-intrinsic.rs b/src/test/ui/rfc-2091-track-caller/caller-location-intrinsic.rs
index b2ed8a0d7da..e5754d355d9 100644
--- a/src/test/ui/rfc-2091-track-caller/caller-location-intrinsic.rs
+++ b/src/test/ui/rfc-2091-track-caller/caller-location-intrinsic.rs
@@ -1,6 +1,6 @@
 // run-pass
 // revisions: default mir-opt
-//[mir-opt] compile-flags: -Zmir-opt-level=3
+//[mir-opt] compile-flags: -Zmir-opt-level=4
 
 #[inline(never)]
 #[track_caller]
diff --git a/src/test/ui/rfc-2091-track-caller/const-caller-location.rs b/src/test/ui/rfc-2091-track-caller/const-caller-location.rs
index 89a42acafba..89b0b69f38d 100644
--- a/src/test/ui/rfc-2091-track-caller/const-caller-location.rs
+++ b/src/test/ui/rfc-2091-track-caller/const-caller-location.rs
@@ -1,6 +1,6 @@
 // run-pass
 // revisions: default mir-opt
-//[mir-opt] compile-flags: -Zmir-opt-level=3
+//[mir-opt] compile-flags: -Zmir-opt-level=4
 
 #![feature(const_caller_location, const_fn)]
 
diff --git a/src/test/ui/rfc-2091-track-caller/intrinsic-wrapper.rs b/src/test/ui/rfc-2091-track-caller/intrinsic-wrapper.rs
index d072fb76f10..87e52881c15 100644
--- a/src/test/ui/rfc-2091-track-caller/intrinsic-wrapper.rs
+++ b/src/test/ui/rfc-2091-track-caller/intrinsic-wrapper.rs
@@ -1,6 +1,6 @@
 // run-pass
 // revisions: default mir-opt
-//[mir-opt] compile-flags: -Zmir-opt-level=3
+//[mir-opt] compile-flags: -Zmir-opt-level=4
 
 macro_rules! caller_location_from_macro {
     () => (core::panic::Location::caller());
diff --git a/src/test/ui/rfc-2091-track-caller/pass.rs b/src/test/ui/rfc-2091-track-caller/pass.rs
index 4d548d4f0aa..1b13ea3e93c 100644
--- a/src/test/ui/rfc-2091-track-caller/pass.rs
+++ b/src/test/ui/rfc-2091-track-caller/pass.rs
@@ -1,6 +1,6 @@
 // run-pass
 // revisions: default mir-opt
-//[mir-opt] compile-flags: -Zmir-opt-level=3
+//[mir-opt] compile-flags: -Zmir-opt-level=4
 
 #[track_caller]
 fn f() {}
diff --git a/src/test/ui/rfc-2091-track-caller/std-panic-locations.rs b/src/test/ui/rfc-2091-track-caller/std-panic-locations.rs
index 0d7a5c42532..84b7c6701e5 100644
--- a/src/test/ui/rfc-2091-track-caller/std-panic-locations.rs
+++ b/src/test/ui/rfc-2091-track-caller/std-panic-locations.rs
@@ -1,7 +1,7 @@
 // run-pass
 // ignore-wasm32-bare compiled with panic=abort by default
 // revisions: default mir-opt
-//[mir-opt] compile-flags: -Zmir-opt-level=3
+//[mir-opt] compile-flags: -Zmir-opt-level=4
 
 #![feature(option_expect_none, option_unwrap_none)]
 #![allow(unconditional_panic)]
diff --git a/src/test/ui/rfc-2091-track-caller/track-caller-attribute.rs b/src/test/ui/rfc-2091-track-caller/track-caller-attribute.rs
index 43135ebbf65..9d28eb9de09 100644
--- a/src/test/ui/rfc-2091-track-caller/track-caller-attribute.rs
+++ b/src/test/ui/rfc-2091-track-caller/track-caller-attribute.rs
@@ -1,6 +1,6 @@
 // run-pass
 // revisions: default mir-opt
-//[mir-opt] compile-flags: -Zmir-opt-level=3
+//[mir-opt] compile-flags: -Zmir-opt-level=4
 
 use std::panic::Location;
 
diff --git a/src/test/ui/rfc-2091-track-caller/tracked-fn-ptr-with-arg.rs b/src/test/ui/rfc-2091-track-caller/tracked-fn-ptr-with-arg.rs
index 2122a4ca219..65881257815 100644
--- a/src/test/ui/rfc-2091-track-caller/tracked-fn-ptr-with-arg.rs
+++ b/src/test/ui/rfc-2091-track-caller/tracked-fn-ptr-with-arg.rs
@@ -1,6 +1,6 @@
 // run-pass
 // revisions: default mir-opt
-//[mir-opt] compile-flags: -Zmir-opt-level=3
+//[mir-opt] compile-flags: -Zmir-opt-level=4
 
 fn pass_to_ptr_call<T>(f: fn(T), x: T) {
     f(x);
diff --git a/src/test/ui/rfc-2091-track-caller/tracked-fn-ptr.rs b/src/test/ui/rfc-2091-track-caller/tracked-fn-ptr.rs
index 922d2d7b702..8bb4dd288f0 100644
--- a/src/test/ui/rfc-2091-track-caller/tracked-fn-ptr.rs
+++ b/src/test/ui/rfc-2091-track-caller/tracked-fn-ptr.rs
@@ -1,6 +1,6 @@
 // run-pass
 // revisions: default mir-opt
-//[mir-opt] compile-flags: -Zmir-opt-level=3
+//[mir-opt] compile-flags: -Zmir-opt-level=4
 
 fn ptr_call(f: fn()) {
     f();
diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-inlining-issue67557-ice.rs b/src/test/ui/simd-intrinsic/simd-intrinsic-inlining-issue67557-ice.rs
index 4c09ae25c5f..4be68183050 100644
--- a/src/test/ui/simd-intrinsic/simd-intrinsic-inlining-issue67557-ice.rs
+++ b/src/test/ui/simd-intrinsic/simd-intrinsic-inlining-issue67557-ice.rs
@@ -2,7 +2,7 @@
 // passed the wrong Instance, causing issues with inlining. See #67557.
 //
 // run-pass
-// compile-flags: -Zmir-opt-level=3
+// compile-flags: -Zmir-opt-level=4
 #![feature(platform_intrinsics, repr_simd)]
 
 extern "platform-intrinsic" {
diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-inlining-issue67557.rs b/src/test/ui/simd-intrinsic/simd-intrinsic-inlining-issue67557.rs
index 7a0d955686b..67556829815 100644
--- a/src/test/ui/simd-intrinsic/simd-intrinsic-inlining-issue67557.rs
+++ b/src/test/ui/simd-intrinsic/simd-intrinsic-inlining-issue67557.rs
@@ -2,7 +2,7 @@
 // the wrong Instance, causing issues with inlining. See #67557.
 //
 // run-pass
-// compile-flags: -Zmir-opt-level=3
+// compile-flags: -Zmir-opt-level=4
 #![feature(platform_intrinsics, repr_simd)]
 
 extern "platform-intrinsic" {
diff --git a/src/tools/clippy/src/driver.rs b/src/tools/clippy/src/driver.rs
index d5143e1438e..94af21568ee 100644
--- a/src/tools/clippy/src/driver.rs
+++ b/src/tools/clippy/src/driver.rs
@@ -83,7 +83,7 @@ impl rustc_driver::Callbacks for ClippyCallbacks {
         // run on the unoptimized MIR. On the other hand this results in some false negatives. If
         // MIR passes can be enabled / disabled separately, we should figure out, what passes to
         // use for Clippy.
-        config.opts.debugging_opts.mir_opt_level = 0;
+        config.opts.debugging_opts.mir_opt_level = Some(0);
     }
 }
 
diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs
index 2e7b42b6c7c..9a82591e5a7 100644
--- a/src/tools/compiletest/src/runtest.rs
+++ b/src/tools/compiletest/src/runtest.rs
@@ -1960,7 +1960,7 @@ impl<'test> TestCx<'test> {
                 rustc.args(&[
                     "-Copt-level=1",
                     "-Zdump-mir=all",
-                    "-Zmir-opt-level=3",
+                    "-Zmir-opt-level=4",
                     "-Zvalidate-mir",
                     "-Zdump-mir-exclude-pass-number",
                 ]);