| //@ 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) { |
| // 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>) { |
| // 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) { |
| // 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) { |
| // 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); |
| dont_opt(vec![true]); |
| } |