Rollup merge of #122656 - RalfJung:simplify-cfg, r=compiler-errors

simplify_cfg: rename some passes so that they make more sense

I was extremely confused by `SimplifyCfg::ElaborateDrops`, since it runs way later than drop elaboration. It is used e.g. in `mir-opt/retag.rs` even though that pass doesn't care about drop elaboration at all.

"Early opt" is also very confusing since that makes it sounds like it runs early during optimizations, i.e. on runtime MIR, but actually it runs way before that.

So I decided to rename
- early-opt -> post-analysis
- elaborate-drops -> pre-optimizations

I am open to other suggestions.
This commit is contained in:
Matthias Krüger 2024-03-18 06:58:50 +01:00 committed by GitHub
commit 3fc3142df1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
29 changed files with 43 additions and 40 deletions

View File

@ -507,7 +507,7 @@ fn run_analysis_cleanup_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
let passes: &[&dyn MirPass<'tcx>] = &[ let passes: &[&dyn MirPass<'tcx>] = &[
&cleanup_post_borrowck::CleanupPostBorrowck, &cleanup_post_borrowck::CleanupPostBorrowck,
&remove_noop_landing_pads::RemoveNoopLandingPads, &remove_noop_landing_pads::RemoveNoopLandingPads,
&simplify::SimplifyCfg::EarlyOpt, &simplify::SimplifyCfg::PostAnalysis,
&deref_separator::Derefer, &deref_separator::Derefer,
]; ];
@ -544,7 +544,7 @@ fn run_runtime_cleanup_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
let passes: &[&dyn MirPass<'tcx>] = &[ let passes: &[&dyn MirPass<'tcx>] = &[
&lower_intrinsics::LowerIntrinsics, &lower_intrinsics::LowerIntrinsics,
&remove_place_mention::RemovePlaceMention, &remove_place_mention::RemovePlaceMention,
&simplify::SimplifyCfg::ElaborateDrops, &simplify::SimplifyCfg::PreOptimizations,
]; ];
pm::run_passes(tcx, body, passes, Some(MirPhase::Runtime(RuntimePhase::PostCleanup))); pm::run_passes(tcx, body, passes, Some(MirPhase::Runtime(RuntimePhase::PostCleanup)));

View File

@ -37,8 +37,11 @@ pub enum SimplifyCfg {
Initial, Initial,
PromoteConsts, PromoteConsts,
RemoveFalseEdges, RemoveFalseEdges,
EarlyOpt, /// Runs at the beginning of "analysis to runtime" lowering, *before* drop elaboration.
ElaborateDrops, PostAnalysis,
/// Runs at the end of "analysis to runtime" lowering, *after* drop elaboration.
/// This is before the main optimization passes on runtime MIR kick in.
PreOptimizations,
Final, Final,
MakeShim, MakeShim,
AfterUninhabitedEnumBranching, AfterUninhabitedEnumBranching,
@ -50,8 +53,8 @@ pub fn name(&self) -> &'static str {
SimplifyCfg::Initial => "SimplifyCfg-initial", SimplifyCfg::Initial => "SimplifyCfg-initial",
SimplifyCfg::PromoteConsts => "SimplifyCfg-promote-consts", SimplifyCfg::PromoteConsts => "SimplifyCfg-promote-consts",
SimplifyCfg::RemoveFalseEdges => "SimplifyCfg-remove-false-edges", SimplifyCfg::RemoveFalseEdges => "SimplifyCfg-remove-false-edges",
SimplifyCfg::EarlyOpt => "SimplifyCfg-early-opt", SimplifyCfg::PostAnalysis => "SimplifyCfg-post-analysis",
SimplifyCfg::ElaborateDrops => "SimplifyCfg-elaborate-drops", SimplifyCfg::PreOptimizations => "SimplifyCfg-pre-optimizations",
SimplifyCfg::Final => "SimplifyCfg-final", SimplifyCfg::Final => "SimplifyCfg-final",
SimplifyCfg::MakeShim => "SimplifyCfg-make_shim", SimplifyCfg::MakeShim => "SimplifyCfg-make_shim",
SimplifyCfg::AfterUninhabitedEnumBranching => { SimplifyCfg::AfterUninhabitedEnumBranching => {

View File

@ -1,4 +1,4 @@
// MIR for `main` after SimplifyCfg-elaborate-drops // MIR for `main` after SimplifyCfg-pre-optimizations
fn main() -> () { fn main() -> () {
let mut _0: (); let mut _0: ();

View File

@ -1,4 +1,4 @@
// MIR for `main` after SimplifyCfg-elaborate-drops // MIR for `main` after SimplifyCfg-pre-optimizations
fn main() -> () { fn main() -> () {
let mut _0: (); let mut _0: ();

View File

@ -1,4 +1,4 @@
//@ unit-test: SimplifyCfg-elaborate-drops //@ unit-test: SimplifyCfg-pre-optimizations
// EMIT_MIR_FOR_EACH_PANIC_STRATEGY // EMIT_MIR_FOR_EACH_PANIC_STRATEGY
// Retagging (from Stacked Borrows) relies on the array index being a fresh // Retagging (from Stacked Borrows) relies on the array index being a fresh
// temporary, so that side-effects cannot change it. // temporary, so that side-effects cannot change it.
@ -10,7 +10,7 @@ unsafe fn foo(z: *mut usize) -> u32 {
} }
// EMIT_MIR array_index_is_temporary.main.SimplifyCfg-elaborate-drops.after.mir // EMIT_MIR array_index_is_temporary.main.SimplifyCfg-pre-optimizations.after.mir
fn main() { fn main() {
// CHECK-LABEL: fn main( // CHECK-LABEL: fn main(
// CHECK: debug x => [[x:_.*]]; // CHECK: debug x => [[x:_.*]];

View File

@ -1,4 +1,4 @@
// MIR for `main` after SimplifyCfg-elaborate-drops // MIR for `main` after SimplifyCfg-pre-optimizations
fn main() -> () { fn main() -> () {
let mut _0: (); let mut _0: ();

View File

@ -1,7 +1,7 @@
// skip-filecheck // skip-filecheck
//@ compile-flags: -Z mir-opt-level=0 //@ compile-flags: -Z mir-opt-level=0
// EMIT_MIR byte_slice.main.SimplifyCfg-elaborate-drops.after.mir // EMIT_MIR byte_slice.main.SimplifyCfg-pre-optimizations.after.mir
fn main() { fn main() {
let x = b"foo"; let x = b"foo";
let y = [5u8, b'x']; let y = [5u8, b'x'];

View File

@ -1,4 +1,4 @@
// MIR for `BAR::promoted[0]` after SimplifyCfg-elaborate-drops // MIR for `BAR::promoted[0]` after SimplifyCfg-pre-optimizations
const BAR::promoted[0]: &[&i32; 1] = { const BAR::promoted[0]: &[&i32; 1] = {
let mut _0: &[&i32; 1]; let mut _0: &[&i32; 1];

View File

@ -1,4 +1,4 @@
// MIR for `FOO::promoted[0]` after SimplifyCfg-elaborate-drops // MIR for `FOO::promoted[0]` after SimplifyCfg-pre-optimizations
const FOO::promoted[0]: &[&i32; 1] = { const FOO::promoted[0]: &[&i32; 1] = {
let mut _0: &[&i32; 1]; let mut _0: &[&i32; 1];

View File

@ -6,11 +6,11 @@
static Y: i32 = 42; static Y: i32 = 42;
// EMIT_MIR const_promotion_extern_static.BAR.PromoteTemps.diff // EMIT_MIR const_promotion_extern_static.BAR.PromoteTemps.diff
// EMIT_MIR const_promotion_extern_static.BAR-promoted[0].SimplifyCfg-elaborate-drops.after.mir // EMIT_MIR const_promotion_extern_static.BAR-promoted[0].SimplifyCfg-pre-optimizations.after.mir
static mut BAR: *const &i32 = [&Y].as_ptr(); static mut BAR: *const &i32 = [&Y].as_ptr();
// EMIT_MIR const_promotion_extern_static.FOO.PromoteTemps.diff // EMIT_MIR const_promotion_extern_static.FOO.PromoteTemps.diff
// EMIT_MIR const_promotion_extern_static.FOO-promoted[0].SimplifyCfg-elaborate-drops.after.mir // EMIT_MIR const_promotion_extern_static.FOO-promoted[0].SimplifyCfg-pre-optimizations.after.mir
static mut FOO: *const &i32 = [unsafe { &X }].as_ptr(); static mut FOO: *const &i32 = [unsafe { &X }].as_ptr();
// EMIT_MIR const_promotion_extern_static.BOP.built.after.mir // EMIT_MIR const_promotion_extern_static.BOP.built.after.mir

View File

@ -4,7 +4,7 @@
// Ensure that there are no drop terminators in `unwrap<T>` (except the one along the cleanup // Ensure that there are no drop terminators in `unwrap<T>` (except the one along the cleanup
// path). // path).
// EMIT_MIR no_drop_for_inactive_variant.unwrap.SimplifyCfg-elaborate-drops.after.mir // EMIT_MIR no_drop_for_inactive_variant.unwrap.SimplifyCfg-pre-optimizations.after.mir
fn unwrap<T>(opt: Option<T>) -> T { fn unwrap<T>(opt: Option<T>) -> T {
match opt { match opt {
Some(x) => x, Some(x) => x,

View File

@ -1,4 +1,4 @@
// MIR for `unwrap` after SimplifyCfg-elaborate-drops // MIR for `unwrap` after SimplifyCfg-pre-optimizations
fn unwrap(_1: Option<T>) -> T { fn unwrap(_1: Option<T>) -> T {
debug opt => _1; debug opt => _1;

View File

@ -1,4 +1,4 @@
// MIR for `unwrap` after SimplifyCfg-elaborate-drops // MIR for `unwrap` after SimplifyCfg-pre-optimizations
fn unwrap(_1: Option<T>) -> T { fn unwrap(_1: Option<T>) -> T {
debug opt => _1; debug opt => _1;

View File

@ -1,4 +1,4 @@
// MIR for `main` after SimplifyCfg-elaborate-drops // MIR for `main` after SimplifyCfg-pre-optimizations
fn main() -> () { fn main() -> () {
let mut _0: (); let mut _0: ();

View File

@ -1,4 +1,4 @@
// MIR for `main` after SimplifyCfg-elaborate-drops // MIR for `main` after SimplifyCfg-pre-optimizations
fn main() -> () { fn main() -> () {
let mut _0: (); let mut _0: ();

View File

@ -2,7 +2,7 @@
// EMIT_MIR_FOR_EACH_PANIC_STRATEGY // EMIT_MIR_FOR_EACH_PANIC_STRATEGY
// EMIT_MIR packed_struct_drop_aligned.main.SimplifyCfg-elaborate-drops.after.mir // EMIT_MIR packed_struct_drop_aligned.main.SimplifyCfg-pre-optimizations.after.mir
fn main() { fn main() {
let mut x = Packed(Aligned(Droppy(0))); let mut x = Packed(Aligned(Droppy(0)));
x.0 = Aligned(Droppy(0)); x.0 = Aligned(Droppy(0));

View File

@ -1,4 +1,4 @@
// MIR for `array_casts` after SimplifyCfg-elaborate-drops // MIR for `array_casts` after SimplifyCfg-pre-optimizations
fn array_casts() -> () { fn array_casts() -> () {
let mut _0: (); let mut _0: ();

View File

@ -1,4 +1,4 @@
// MIR for `array_casts` after SimplifyCfg-elaborate-drops // MIR for `array_casts` after SimplifyCfg-pre-optimizations
fn array_casts() -> () { fn array_casts() -> () {
let mut _0: (); let mut _0: ();

View File

@ -1,4 +1,4 @@
// MIR for `main::{closure#0}` after SimplifyCfg-elaborate-drops // MIR for `main::{closure#0}` after SimplifyCfg-pre-optimizations
fn main::{closure#0}(_1: &{closure@main::{closure#0}}, _2: &i32) -> &i32 { fn main::{closure#0}(_1: &{closure@main::{closure#0}}, _2: &i32) -> &i32 {
debug x => _2; debug x => _2;

View File

@ -1,4 +1,4 @@
// MIR for `main::{closure#0}` after SimplifyCfg-elaborate-drops // MIR for `main::{closure#0}` after SimplifyCfg-pre-optimizations
fn main::{closure#0}(_1: &{closure@main::{closure#0}}, _2: &i32) -> &i32 { fn main::{closure#0}(_1: &{closure@main::{closure#0}}, _2: &i32) -> &i32 {
debug x => _2; debug x => _2;

View File

@ -1,4 +1,4 @@
// MIR for `main` after SimplifyCfg-elaborate-drops // MIR for `main` after SimplifyCfg-pre-optimizations
fn main() -> () { fn main() -> () {
let mut _0: (); let mut _0: ();

View File

@ -1,4 +1,4 @@
// MIR for `main` after SimplifyCfg-elaborate-drops // MIR for `main` after SimplifyCfg-pre-optimizations
fn main() -> () { fn main() -> () {
let mut _0: (); let mut _0: ();

View File

@ -8,8 +8,8 @@
struct Test(i32); struct Test(i32);
// EMIT_MIR retag.{impl#0}-foo.SimplifyCfg-elaborate-drops.after.mir // EMIT_MIR retag.{impl#0}-foo.SimplifyCfg-pre-optimizations.after.mir
// EMIT_MIR retag.{impl#0}-foo_shr.SimplifyCfg-elaborate-drops.after.mir // EMIT_MIR retag.{impl#0}-foo_shr.SimplifyCfg-pre-optimizations.after.mir
impl Test { impl Test {
// Make sure we run the pass on a method, not just on bare functions. // Make sure we run the pass on a method, not just on bare functions.
fn foo<'x>(&self, x: &'x mut i32) -> &'x mut i32 { fn foo<'x>(&self, x: &'x mut i32) -> &'x mut i32 {
@ -26,8 +26,8 @@ impl Drop for Test {
fn drop(&mut self) {} fn drop(&mut self) {}
} }
// EMIT_MIR retag.main.SimplifyCfg-elaborate-drops.after.mir // EMIT_MIR retag.main.SimplifyCfg-pre-optimizations.after.mir
// EMIT_MIR retag.main-{closure#0}.SimplifyCfg-elaborate-drops.after.mir // EMIT_MIR retag.main-{closure#0}.SimplifyCfg-pre-optimizations.after.mir
pub fn main() { pub fn main() {
let mut x = 0; let mut x = 0;
{ {
@ -55,7 +55,7 @@ pub fn main() {
} }
/// Casting directly to an array should also go through `&raw` and thus add appropriate retags. /// Casting directly to an array should also go through `&raw` and thus add appropriate retags.
// EMIT_MIR retag.array_casts.SimplifyCfg-elaborate-drops.after.mir // EMIT_MIR retag.array_casts.SimplifyCfg-pre-optimizations.after.mir
fn array_casts() { fn array_casts() {
let mut x: [usize; 2] = [0, 0]; let mut x: [usize; 2] = [0, 0];
let p = &mut x as *mut usize; let p = &mut x as *mut usize;

View File

@ -1,4 +1,4 @@
// MIR for `<impl at $DIR/retag.rs:13:1: 13:10>::foo` after SimplifyCfg-elaborate-drops // MIR for `<impl at $DIR/retag.rs:13:1: 13:10>::foo` after SimplifyCfg-pre-optimizations
fn <impl at $DIR/retag.rs:13:1: 13:10>::foo(_1: &Test, _2: &mut i32) -> &mut i32 { fn <impl at $DIR/retag.rs:13:1: 13:10>::foo(_1: &Test, _2: &mut i32) -> &mut i32 {
debug self => _1; debug self => _1;

View File

@ -1,4 +1,4 @@
// MIR for `<impl at $DIR/retag.rs:13:1: 13:10>::foo` after SimplifyCfg-elaborate-drops // MIR for `<impl at $DIR/retag.rs:13:1: 13:10>::foo` after SimplifyCfg-pre-optimizations
fn <impl at $DIR/retag.rs:13:1: 13:10>::foo(_1: &Test, _2: &mut i32) -> &mut i32 { fn <impl at $DIR/retag.rs:13:1: 13:10>::foo(_1: &Test, _2: &mut i32) -> &mut i32 {
debug self => _1; debug self => _1;

View File

@ -1,4 +1,4 @@
// MIR for `<impl at $DIR/retag.rs:13:1: 13:10>::foo_shr` after SimplifyCfg-elaborate-drops // MIR for `<impl at $DIR/retag.rs:13:1: 13:10>::foo_shr` after SimplifyCfg-pre-optimizations
fn <impl at $DIR/retag.rs:13:1: 13:10>::foo_shr(_1: &Test, _2: &i32) -> &i32 { fn <impl at $DIR/retag.rs:13:1: 13:10>::foo_shr(_1: &Test, _2: &i32) -> &i32 {
debug self => _1; debug self => _1;

View File

@ -1,4 +1,4 @@
// MIR for `<impl at $DIR/retag.rs:13:1: 13:10>::foo_shr` after SimplifyCfg-elaborate-drops // MIR for `<impl at $DIR/retag.rs:13:1: 13:10>::foo_shr` after SimplifyCfg-pre-optimizations
fn <impl at $DIR/retag.rs:13:1: 13:10>::foo_shr(_1: &Test, _2: &i32) -> &i32 { fn <impl at $DIR/retag.rs:13:1: 13:10>::foo_shr(_1: &Test, _2: &i32) -> &i32 {
debug self => _1; debug self => _1;

View File

@ -1,5 +1,5 @@
- // MIR for `main` before SimplifyCfg-early-opt - // MIR for `main` before SimplifyCfg-post-analysis
+ // MIR for `main` after SimplifyCfg-early-opt + // MIR for `main` after SimplifyCfg-post-analysis
fn main() -> () { fn main() -> () {
let mut _0: (); let mut _0: ();

View File

@ -4,7 +4,7 @@
//@ no-prefer-dynamic //@ no-prefer-dynamic
// EMIT_MIR simplify_cfg.main.SimplifyCfg-initial.diff // EMIT_MIR simplify_cfg.main.SimplifyCfg-initial.diff
// EMIT_MIR simplify_cfg.main.SimplifyCfg-early-opt.diff // EMIT_MIR simplify_cfg.main.SimplifyCfg-post-analysis.diff
fn main() { fn main() {
loop { loop {
if bar() { if bar() {