about summary refs log tree commit diff
path: root/tests/mir-opt/remove_unneeded_drops.rs
blob: 49dc611838e38e4db1a4d2bb7ae34e0078b01297 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//@ 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]);
}