Closed
Description
pub struct Bar {
l: u8,
f: [u8; 200],
}
pub fn roo(f: &mut Bar) {
f.f = noo();
}
#[inline(never)]
pub fn noo() -> [u8; 200] {
[0; 200]
}
compiles to
example::roo:
push rbp
mov rbp, rsp
push r14
push rbx
sub rsp, 208
mov rbx, rdi
lea r14, [rbp - 216]
mov rdi, r14
call example::noo@PLT
inc rbx
mov edx, 200
mov rdi, rbx
mov rsi, r14
call memcpy@PLT
add rsp, 208
pop rbx
pop r14
pop rbp
ret
example::noo:
push rbp
mov rbp, rsp
xorps xmm0, xmm0
movups xmmword ptr [rdi + 176], xmm0
movups xmmword ptr [rdi + 160], xmm0
movups xmmword ptr [rdi + 144], xmm0
movups xmmword ptr [rdi + 128], xmm0
movups xmmword ptr [rdi + 112], xmm0
movups xmmword ptr [rdi + 96], xmm0
movups xmmword ptr [rdi + 80], xmm0
movups xmmword ptr [rdi + 64], xmm0
movups xmmword ptr [rdi + 48], xmm0
movups xmmword ptr [rdi + 32], xmm0
movups xmmword ptr [rdi + 16], xmm0
movups xmmword ptr [rdi], xmm0
mov qword ptr [rdi + 192], 0
mov rax, rdi
pop rbp
ret
If I drop 'l' field the copy goes away and I get:
example::roo:
push rbp
mov rbp, rsp
call example::noo@PLT
pop rbp
ret
example::noo:
push rbp
mov rbp, rsp
xorps xmm0, xmm0
movups xmmword ptr [rdi + 176], xmm0
movups xmmword ptr [rdi + 160], xmm0
movups xmmword ptr [rdi + 144], xmm0
movups xmmword ptr [rdi + 128], xmm0
movups xmmword ptr [rdi + 112], xmm0
movups xmmword ptr [rdi + 96], xmm0
movups xmmword ptr [rdi + 80], xmm0
movups xmmword ptr [rdi + 64], xmm0
movups xmmword ptr [rdi + 48], xmm0
movups xmmword ptr [rdi + 32], xmm0
movups xmmword ptr [rdi + 16], xmm0
movups xmmword ptr [rdi], xmm0
mov qword ptr [rdi + 192], 0
mov rax, rdi
pop rbp
ret
Metadata
Metadata
Assignees
Labels
Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.Area: MIR optimizationsFixed by the Named Return Value Opt. (NRVO)Category: An issue proposing an enhancement or a PR with one.Issue: Problems and improvements with respect to performance of generated code.Relevant to the compiler team, which will review and decide on the PR/issue.