diff options
| author | Mark Rousskov <mark.simulacrum@gmail.com> | 2024-03-17 17:42:37 -0400 |
|---|---|---|
| committer | Mark Rousskov <mark.simulacrum@gmail.com> | 2024-05-27 16:26:56 -0400 |
| commit | 4c002fce9d8421096538273c9b78db7d68529b94 (patch) | |
| tree | 500792bf4cbde194e7be7671c4248c513cab8903 /tests/codegen | |
| parent | b0f86189380c64e4a090233a0a0a97f1e87fe88e (diff) | |
| download | rust-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.rs | 16 |
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(); + } +} |
