rust/tests/run-make/pgo-indirect-call-promotion/interesting.rs

53 lines
967 B
Rust

#![crate_name = "interesting"]
#![crate_type = "rlib"]
extern crate opaque;
#[no_mangle]
pub fn function_called_always() {
opaque::opaque_f1();
}
#[no_mangle]
pub fn function_called_never() {
opaque::opaque_f2();
}
#[no_mangle]
pub fn call_a_bunch_of_functions(fns: &[fn()]) {
// Indirect call promotion transforms the below into something like
//
// for f in fns {
// if f == function_called_always {
// function_called_always()
// } else {
// f();
// }
// }
//
// where `function_called_always` actually gets inlined too.
for f in fns {
f();
}
}
pub trait Foo {
fn foo(&self);
}
impl Foo for u32 {
#[no_mangle]
fn foo(&self) {
opaque::opaque_f2();
}
}
#[no_mangle]
pub fn call_a_bunch_of_trait_methods(trait_objects: &[&dyn Foo]) {
// Same as above, just with vtables in between
for x in trait_objects {
x.foo();
}
}