Fortify RemoveUnneededDrops test.
This commit is contained in:
parent
498ae9fed2
commit
0e53d8533b
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
|
//@ test-mir-pass: RemoveUnneededDrops
|
||||||
// EMIT_MIR_FOR_EACH_PANIC_STRATEGY
|
|
||||||
|
#![feature(custom_mir, core_intrinsics)]
|
||||||
|
use std::intrinsics::mir::*;
|
||||||
|
|
||||||
// EMIT_MIR remove_unneeded_drops.opt.RemoveUnneededDrops.diff
|
// EMIT_MIR remove_unneeded_drops.opt.RemoveUnneededDrops.diff
|
||||||
|
#[custom_mir(dialect = "runtime")]
|
||||||
fn opt(x: bool) {
|
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
|
// EMIT_MIR remove_unneeded_drops.dont_opt.RemoveUnneededDrops.diff
|
||||||
|
#[custom_mir(dialect = "runtime")]
|
||||||
fn dont_opt(x: Vec<bool>) {
|
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
|
// EMIT_MIR remove_unneeded_drops.opt_generic_copy.RemoveUnneededDrops.diff
|
||||||
|
#[custom_mir(dialect = "runtime")]
|
||||||
fn opt_generic_copy<T: Copy>(x: T) {
|
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
|
// EMIT_MIR remove_unneeded_drops.cannot_opt_generic.RemoveUnneededDrops.diff
|
||||||
// since the pass is not running on monomorphisized code,
|
// since the pass is not running on monomorphisized code,
|
||||||
// we can't (but probably should) optimize this
|
// we can't (but probably should) optimize this
|
||||||
|
#[custom_mir(dialect = "runtime")]
|
||||||
fn cannot_opt_generic<T>(x: T) {
|
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() {
|
fn main() {
|
||||||
|
// CHECK-LABEL: fn main(
|
||||||
opt(true);
|
opt(true);
|
||||||
opt_generic_copy(42);
|
opt_generic_copy(42);
|
||||||
cannot_opt_generic(42);
|
cannot_opt_generic(42);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue