about summary refs log tree commit diff
path: root/tests/codegen
diff options
context:
space:
mode:
authorMark Rousskov <mark.simulacrum@gmail.com>2024-03-17 17:42:37 -0400
committerMark Rousskov <mark.simulacrum@gmail.com>2024-05-27 16:26:56 -0400
commit4c002fce9d8421096538273c9b78db7d68529b94 (patch)
tree500792bf4cbde194e7be7671c4248c513cab8903 /tests/codegen
parentb0f86189380c64e4a090233a0a0a97f1e87fe88e (diff)
downloadrust-4c002fce9d8421096538273c9b78db7d68529b94.tar.gz
rust-4c002fce9d8421096538273c9b78db7d68529b94.zip
Omit non-needs_drop drop_in_place in vtables
This replaces the drop_in_place reference with null in vtables. On
librustc_driver.so, this drops about ~17k dynamic relocations from the
output, since many vtables can now be placed in read-only memory, rather
than having a relocated pointer included.

This makes a tradeoff by adding a null check at vtable call sites.
That's hard to avoid without changing the vtable format (e.g., to use a
pc-relative relocation instead of an absolute address, and avoid the
dynamic relocation that way). But it seems likely that the check is
cheap at runtime.
Diffstat (limited to 'tests/codegen')
-rw-r--r--tests/codegen/vtable-loads.rs16
1 files changed, 16 insertions, 0 deletions
diff --git a/tests/codegen/vtable-loads.rs b/tests/codegen/vtable-loads.rs
new file mode 100644
index 00000000000..1dd6ca51063
--- /dev/null
+++ b/tests/codegen/vtable-loads.rs
@@ -0,0 +1,16 @@
+//@ compile-flags: -O
+
+#![crate_type = "lib"]
+
+// CHECK-LABEL: @loop_skips_vtable_load
+#[no_mangle]
+pub fn loop_skips_vtable_load(x: &dyn Fn()) {
+    // CHECK: load ptr, ptr %0{{.*}}, !invariant.load
+    // CHECK-NEXT: tail call void %1
+    // CHECK-NOT: load ptr
+    x();
+    for _ in 0..100 {
+        // CHECK: tail call void %1
+        x();
+    }
+}