summaryrefslogtreecommitdiffstats
path: root/tests/run-make/pgo-indirect-call-promotion/interesting.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/run-make/pgo-indirect-call-promotion/interesting.rs')
-rw-r--r--tests/run-make/pgo-indirect-call-promotion/interesting.rs56
1 files changed, 56 insertions, 0 deletions
diff --git a/tests/run-make/pgo-indirect-call-promotion/interesting.rs b/tests/run-make/pgo-indirect-call-promotion/interesting.rs
new file mode 100644
index 000000000..4fd096d62
--- /dev/null
+++ b/tests/run-make/pgo-indirect-call-promotion/interesting.rs
@@ -0,0 +1,56 @@
+#![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();
+ }
+}