-
Notifications
You must be signed in to change notification settings - Fork 13.6k
Closed
Labels
A-LLVMArea: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.A-codegenArea: Code generationArea: Code generationC-bugCategory: This is a bug.Category: This is a bug.I-heavyIssue: Problems and improvements with respect to binary size of generated code.Issue: Problems and improvements with respect to binary size of generated code.I-slowIssue: Problems and improvements with respect to performance of generated code.Issue: Problems and improvements with respect to performance of generated code.
Description
Demos: https://godbolt.org/z/TMh3Krfc5
The motivating example is:
pub fn bad_vec(s: Vec<u8>) -> Vec<u8> {
Some(s).expect("bad_vec")
}
example::bad_myvec:
push rax
mov rax, qword ptr [rsi]
test rax, rax
je .LBB5_1
mov qword ptr [rdi], rax
movups xmm0, xmmword ptr [rsi + 8]
movups xmmword ptr [rdi + 8], xmm0
mov rax, rdi
pop rcx
ret
.LBB5_1:
lea rdi, [rip + .L__unnamed_5]
lea rdx, [rip + .L__unnamed_6]
mov esi, 9
call qword ptr [rip + core::option::expect_failed@GOTPCREL]
ud2
It looks to me like the problem with Vec
is that specifically the nonnull
attribute does not survive being wrapped in two structs that each contain a second member. If either of RawVec
or Vec
is missing a usize
member, the optimization works.
There is a missed NonZero*
optimization in here that I found looking for types that fail to optimize. It's unclear to me if this was reported previously in #49572, or if whatever fixes the problem with Vec
will also fix the NonZero*
example.
I think this is similar but not the same problem as seen in #71257
danielhenrymantilla, untitaker, nico-abram, Patrick-Poitras, Kobzol and 1 moredashed
Metadata
Metadata
Assignees
Labels
A-LLVMArea: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.A-codegenArea: Code generationArea: Code generationC-bugCategory: This is a bug.Category: This is a bug.I-heavyIssue: Problems and improvements with respect to binary size of generated code.Issue: Problems and improvements with respect to binary size of generated code.I-slowIssue: Problems and improvements with respect to performance of generated code.Issue: Problems and improvements with respect to performance of generated code.