summaryrefslogtreecommitdiffstats
path: root/tests/mir-opt/inline/indirect_destination.rs
blob: 2842e23366e0098768dd362002590c249358e4fe (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
// Test for inlining with an indirect destination place.
//
// unit-test: Inline
// edition: 2021
// needs-unwind
#![crate_type = "lib"]
#![feature(custom_mir, core_intrinsics)]
use core::intrinsics::mir::*;

#[custom_mir(dialect = "runtime", phase = "initial")]
// CHECK-LABEL: fn f(
// CHECK:      bb1: {
// CHECK-NEXT:   StorageLive([[A:.*]]);
// CHECK-NEXT:   [[A]] = &mut (*_1);
// CHECK-NEXT:   StorageLive([[B:.*]]);
// CHECK-NEXT:   [[B]] = const 42_u8;
// CHECK-NEXT:   (*[[A]]) = move [[B]];
// CHECK-NEXT:   StorageDead([[B]]);
// CHECK-NEXT:   StorageDead([[A]]);
// CHECK-NEXT:   goto -> bb1;
// CHECK-NEXT: }
pub fn f(a: *mut u8) {
    mir! {
        {
            Goto(bb1)
        }
        bb1 = {
            Call(*a = g(), bb1, UnwindUnreachable())
        }
    }
}

#[custom_mir(dialect = "runtime", phase = "initial")]
#[inline(always)]
fn g() -> u8 {
    mir! {
        {
            RET = 42;
            Return()
        }
    }
}