Missed optimization/perf oddity with allocations
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 119k
- Forks
- 16.1k
- PR merge metrics
- PR metrics pending
Description
Consider the following minimized example:
pub fn test() {
for _ in 0..128 {
let _ = vec![0; 32];
}
}
Expected output (rustc 1.81.0 eeb90cda1 2024-09-04):
example::test::hbbde2d255ea2eb40:
ret
Actual output (rustc 1.91.0-nightly 040a98af7 2025-08-20):
Note: Starting in 1.89 with #141061, unexpected calls replace the unexpected movzxs seen in version 1.83 to 1.88.
example::test::h8c11ad83f7845e4c:
push rbx
mov rbx, qword ptr [rip + __rustc[861857bac794ed70]::__rust_no_alloc_shim_is_unstable_v2@GOTPCREL]
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
call rbx
mov rax, rbx
pop rbx
jmp rax
Actual output with unexpected `movzx`s (rustc 1.88.0 6b00bc388 2025-06-23):
example::test::ha559be6b680d7ef2:
mov rax, qword ptr [rip + __rust_no_alloc_shim_is_unstable@GOTPCREL]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx ecx, byte ptr [rax]
movzx eax, byte ptr [rax]
ret
Godbolt: https://www.godbolt.org/z/x458Pv8P5
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the minimized test() example and reproduce its generated assembly in the linked Godbolt example across the Rust versions listed. Compare the optimized-away 1.81 output with the repeated movzx and allocation-shim calls in later versions. Done means identifying and correcting the regression so this example no longer emits the unexpected instructions.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- compilers, performance
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100