Fortify RemoveUnneededDrops test.

This commit is contained in:
Camille GILLOT 2025-06-16 15:25:31 +00:00
parent 498ae9fed2
commit 0e53d8533b
13 changed files with 94 additions and 222 deletions

View file

@ -0,0 +1,15 @@
- // MIR for `cannot_opt_generic` before RemoveUnneededDrops
+ // MIR for `cannot_opt_generic` after RemoveUnneededDrops
fn cannot_opt_generic(_1: T) -> () {
let mut _0: ();
bb0: {
drop(_1) -> [return: bb1, unwind unreachable];
}
bb1: {
return;
}
}

View file

@ -1,26 +0,0 @@
- // MIR for `cannot_opt_generic` before RemoveUnneededDrops
+ // MIR for `cannot_opt_generic` after RemoveUnneededDrops
fn cannot_opt_generic(_1: T) -> () {
debug x => _1;
let mut _0: ();
let _2: ();
let mut _3: T;
scope 1 (inlined std::mem::drop::<T>) {
}
bb0: {
nop;
StorageLive(_3);
_3 = move _1;
drop(_3) -> [return: bb1, unwind unreachable];
}
bb1: {
StorageDead(_3);
nop;
nop;
return;
}
}

View file

@ -1,30 +0,0 @@
- // MIR for `cannot_opt_generic` before RemoveUnneededDrops
+ // MIR for `cannot_opt_generic` after RemoveUnneededDrops
fn cannot_opt_generic(_1: T) -> () {
debug x => _1;
let mut _0: ();
let _2: ();
let mut _3: T;
scope 1 (inlined std::mem::drop::<T>) {
}
bb0: {
nop;
StorageLive(_3);
_3 = move _1;
drop(_3) -> [return: bb2, unwind: bb1];
}
bb1 (cleanup): {
resume;
}
bb2: {
StorageDead(_3);
nop;
nop;
return;
}
}

View file

@ -0,0 +1,15 @@
- // MIR for `dont_opt` before RemoveUnneededDrops
+ // MIR for `dont_opt` after RemoveUnneededDrops
fn dont_opt(_1: Vec<bool>) -> () {
let mut _0: ();
bb0: {
drop(_1) -> [return: bb1, unwind unreachable];
}
bb1: {
return;
}
}

View file

@ -1,26 +0,0 @@
- // MIR for `dont_opt` before RemoveUnneededDrops
+ // MIR for `dont_opt` after RemoveUnneededDrops
fn dont_opt(_1: Vec<bool>) -> () {
debug x => _1;
let mut _0: ();
let _2: ();
let mut _3: std::vec::Vec<bool>;
scope 1 (inlined std::mem::drop::<Vec<bool>>) {
}
bb0: {
nop;
StorageLive(_3);
_3 = move _1;
drop(_3) -> [return: bb1, unwind unreachable];
}
bb1: {
StorageDead(_3);
nop;
nop;
return;
}
}

View file

@ -1,30 +0,0 @@
- // MIR for `dont_opt` before RemoveUnneededDrops
+ // MIR for `dont_opt` after RemoveUnneededDrops
fn dont_opt(_1: Vec<bool>) -> () {
debug x => _1;
let mut _0: ();
let _2: ();
let mut _3: std::vec::Vec<bool>;
scope 1 (inlined std::mem::drop::<Vec<bool>>) {
}
bb0: {
nop;
StorageLive(_3);
_3 = move _1;
drop(_3) -> [return: bb2, unwind: bb1];
}
bb1 (cleanup): {
resume;
}
bb2: {
StorageDead(_3);
nop;
nop;
return;
}
}

View file

@ -0,0 +1,15 @@
- // MIR for `opt` before RemoveUnneededDrops
+ // MIR for `opt` after RemoveUnneededDrops
fn opt(_1: bool) -> () {
let mut _0: ();
bb0: {
- drop(_1) -> [return: bb1, unwind unreachable];
- }
-
- bb1: {
return;
}
}

View file

@ -1,26 +0,0 @@
- // MIR for `opt` before RemoveUnneededDrops
+ // MIR for `opt` after RemoveUnneededDrops
fn opt(_1: bool) -> () {
debug x => _1;
let mut _0: ();
let _2: ();
let mut _3: bool;
scope 1 (inlined std::mem::drop::<bool>) {
}
bb0: {
- nop;
StorageLive(_3);
_3 = copy _1;
- drop(_3) -> [return: bb1, unwind unreachable];
- }
-
- bb1: {
StorageDead(_3);
- nop;
- nop;
return;
}
}

View file

@ -1,26 +0,0 @@
- // MIR for `opt` before RemoveUnneededDrops
+ // MIR for `opt` after RemoveUnneededDrops
fn opt(_1: bool) -> () {
debug x => _1;
let mut _0: ();
let _2: ();
let mut _3: bool;
scope 1 (inlined std::mem::drop::<bool>) {
}
bb0: {
- nop;
StorageLive(_3);
_3 = copy _1;
- drop(_3) -> [return: bb1, unwind continue];
- }
-
- bb1: {
StorageDead(_3);
- nop;
- nop;
return;
}
}

View file

@ -0,0 +1,15 @@
- // MIR for `opt_generic_copy` before RemoveUnneededDrops
+ // MIR for `opt_generic_copy` after RemoveUnneededDrops
fn opt_generic_copy(_1: T) -> () {
let mut _0: ();
bb0: {
- drop(_1) -> [return: bb1, unwind unreachable];
- }
-
- bb1: {
return;
}
}

View file

@ -1,26 +0,0 @@
- // MIR for `opt_generic_copy` before RemoveUnneededDrops
+ // MIR for `opt_generic_copy` after RemoveUnneededDrops
fn opt_generic_copy(_1: T) -> () {
debug x => _1;
let mut _0: ();
let _2: ();
let mut _3: T;
scope 1 (inlined std::mem::drop::<T>) {
}
bb0: {
- nop;
StorageLive(_3);
_3 = copy _1;
- drop(_3) -> [return: bb1, unwind unreachable];
- }
-
- bb1: {
StorageDead(_3);
- nop;
- nop;
return;
}
}

View file

@ -1,26 +0,0 @@
- // MIR for `opt_generic_copy` before RemoveUnneededDrops
+ // MIR for `opt_generic_copy` after RemoveUnneededDrops
fn opt_generic_copy(_1: T) -> () {
debug x => _1;
let mut _0: ();
let _2: ();
let mut _3: T;
scope 1 (inlined std::mem::drop::<T>) {
}
bb0: {
- nop;
StorageLive(_3);
_3 = copy _1;
- drop(_3) -> [return: bb1, unwind continue];
- }
-
- bb1: {
StorageDead(_3);
- nop;
- nop;
return;
}
}

View file

@ -1,28 +1,56 @@
// skip-filecheck
// EMIT_MIR_FOR_EACH_PANIC_STRATEGY
//@ test-mir-pass: RemoveUnneededDrops
#![feature(custom_mir, core_intrinsics)]
use std::intrinsics::mir::*;
// EMIT_MIR remove_unneeded_drops.opt.RemoveUnneededDrops.diff
#[custom_mir(dialect = "runtime")]
fn opt(x: bool) {
drop(x);
// CHECK-LABEL: fn opt(
// CHECK-NOT: drop(
mir! {
{ Drop(x, ReturnTo(bb1), UnwindUnreachable()) }
bb1 = { Return() }
}
}
// EMIT_MIR remove_unneeded_drops.dont_opt.RemoveUnneededDrops.diff
#[custom_mir(dialect = "runtime")]
fn dont_opt(x: Vec<bool>) {
drop(x);
// CHECK-LABEL: fn dont_opt(
// CHECK: drop(
mir! {
{ Drop(x, ReturnTo(bb1), UnwindUnreachable()) }
bb1 = { Return() }
}
}
// EMIT_MIR remove_unneeded_drops.opt_generic_copy.RemoveUnneededDrops.diff
#[custom_mir(dialect = "runtime")]
fn opt_generic_copy<T: Copy>(x: T) {
drop(x);
// CHECK-LABEL: fn opt_generic_copy(
// CHECK-NOT: drop(
mir! {
{ Drop(x, ReturnTo(bb1), UnwindUnreachable()) }
bb1 = { Return() }
}
}
// EMIT_MIR remove_unneeded_drops.cannot_opt_generic.RemoveUnneededDrops.diff
// since the pass is not running on monomorphisized code,
// we can't (but probably should) optimize this
#[custom_mir(dialect = "runtime")]
fn cannot_opt_generic<T>(x: T) {
drop(x);
// CHECK-LABEL: fn cannot_opt_generic(
// CHECK: drop(
mir! {
{ Drop(x, ReturnTo(bb1), UnwindUnreachable()) }
bb1 = { Return() }
}
}
fn main() {
// CHECK-LABEL: fn main(
opt(true);
opt_generic_copy(42);
cannot_opt_generic(42);