In debug mode, not even the range iterators get optimized away, you end up with explicit monomorphised calls to IntoIterator::into_iter
and Iterator::next
. As you can see here: https://godbolt.org/g/29MrHv
Specifically:
example::sum_from_to:
push rbp
mov rbp, rsp
sub rsp, 80
mov dword ptr [rbp - 60], 0
mov dword ptr [rbp - 56], edi
mov dword ptr [rbp - 52], esi
mov esi, dword ptr [rbp - 56]
mov edi, dword ptr [rbp - 52]
mov dword ptr [rbp - 32], esi
mov dword ptr [rbp - 28], edi
mov rdi, qword ptr [rbp - 32]
call <I as core::iter::traits::IntoIterator>::into_iter
mov qword ptr [rbp - 16], rax
mov rax, qword ptr [rbp - 16]
mov qword ptr [rbp - 24], rax
mov esi, dword ptr [rbp - 24]
mov ecx, dword ptr [rbp - 20]
mov dword ptr [rbp - 64], esi
mov dword ptr [rbp - 68], ecx
mov eax, dword ptr [rbp - 64]
mov dword ptr [rbp - 48], eax
mov ecx, dword ptr [rbp - 68]
mov dword ptr [rbp - 44], ecx
.LBB9_2:
lea rdi, [rbp - 48]
call core::iter::range::<impl core::iter::iterator::Iterator for core::ops::Range<A>>::next
mov qword ptr [rbp - 8], rax
mov rax, qword ptr [rbp - 8]
mov qword ptr [rbp - 40], rax
mov eax, dword ptr [rbp - 40]
test eax, eax
jne .LBB9_5
jmp .LBB9_4
.LBB9_4:
mov eax, dword ptr [rbp - 60]
add rsp, 80
pop rbp
ret
.LBB9_5:
mov eax, dword ptr [rbp - 36]
add eax, dword ptr [rbp - 60]
setb cl
test cl, 1
mov dword ptr [rbp - 72], eax
jne .LBB9_7
mov eax, dword ptr [rbp - 72]
mov dword ptr [rbp - 60], eax
jmp .LBB9_2
.LBB9_7:
lea rax, [rip + panic_loc.4]
mov rdi, rax
call core::panicking::panic@PLT