summaryrefslogtreecommitdiffstats
path: root/tests/run-make/pgo-indirect-call-promotion/interesting.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:20:29 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:20:29 +0000
commit631cd5845e8de329d0e227aaa707d7ea228b8f8f (patch)
treea1b87c8f8cad01cf18f7c5f57a08f102771ed303 /tests/run-make/pgo-indirect-call-promotion/interesting.rs
parentAdding debian version 1.69.0+dfsg1-1. (diff)
downloadrustc-631cd5845e8de329d0e227aaa707d7ea228b8f8f.tar.xz
rustc-631cd5845e8de329d0e227aaa707d7ea228b8f8f.zip
Merging upstream version 1.70.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
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();
+ }
+}