Rollup merge of #144614 - cjgillot:fortify-unneeded, r=scottmcm
Fortify RemoveUnneededDrops test. Test tweak that is useful in preparation for https://github.com/rust-lang/rust/pull/144561
This commit is contained in:
commit
37ec45382d
13 changed files with 94 additions and 222 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue