Closed
Description
I tried this code:
pub fn arr() -> usize {
let values = [23, 16, 54, 3, 60, 9];
let mut acc = 0;
for item in values {
acc += item;
}
acc
}
I expected to see this happen: The loop should be inlined because values
is const-known. For example, here is the generated assembly on Rust 1.63.0 (Godbolt) and Rust Beta (Godbolt):
example::arr:
mov eax, 165
ret
Instead, this happened: On nightly, the loop is inlined. However, the entire function is not computed despite the stable and beta Rust inlining it. Here is the generated assembly on Nightly (Godbolt):
.LCPI0_0:
.quad 23
.quad 16
.LCPI0_1:
.quad 54
.quad 3
.LCPI0_2:
.quad 60
.quad 9
example::arr:
sub rsp, 72
movaps xmm0, xmmword ptr [rip + .LCPI0_0]
movaps xmmword ptr [rsp], xmm0
movaps xmm0, xmmword ptr [rip + .LCPI0_1]
movaps xmmword ptr [rsp + 16], xmm0
movaps xmm0, xmmword ptr [rip + .LCPI0_2]
movaps xmmword ptr [rsp + 32], xmm0
mov qword ptr [rsp + 56], 6
xor ecx, ecx
xor edx, edx
jmp .LBB0_1
.LBB0_3:
lea rdi, [rcx + 1]
mov qword ptr [rsp + 48], rdi
mov rdx, qword ptr [rsp + 8*rcx]
mov esi, 1
mov rcx, rdi
add rdx, rax
test rsi, rsi
je .LBB0_5
.LBB0_1:
mov rax, rdx
cmp rcx, 5
jbe .LBB0_3
xor esi, esi
add rdx, rax
test rsi, rsi
jne .LBB0_1
.LBB0_5:
add rsp, 72
ret
Meta
n/a - disclosed at usages
Keywords: const inline loop, const loop, const loop not evaluated
Relevant discord thread: https://discord.com/channels/273534239310479360/592856094527848449/1013050670942793808
Metadata
Metadata
Assignees
Labels
Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.Category: This is a bug.Call for participation: An issue has been fixed and does not reproduce, but no test has been added.Issue: Problems and improvements with respect to performance of generated code.High priorityRelevant to the compiler team, which will review and decide on the PR/issue.Performance or correctness regression from stable to nightly.