Skip to content

[ER] A missed removal of division by zero test #86109

@leonardo-m

Description

@leonardo-m

This function foo:

type T = i16; pub fn foo(start: T) -> T { if start <= 0 { return 0; } let mut count = 0; for i in start .. 10_000 { if 752 % i != 0 { count += 1; } } count } fn main() { println!("{}", (T::MIN ..= T::MAX) .map(foo) .sum::<T>()); }

Compiled with optimizations by rustc (1.54.0-nightly 4de7572 2021-05-01) gives:

foo:  lea eax, [rdi - 1]  movzx eax, ax  cmp eax, 9998  ja .LBB0_1  mov r8d, 9999  sub r8d, edi  mov esi, edi  neg esi  xor ecx, ecx .LBB0_4:  cmp r8w, si  jae .LBB0_6  mov ax, 752  xor edx, edx  idiv di  lea eax, [rdi + 1]  cmp dx, 1  sbb cx, -1  movzx edx, ax  mov edi, eax  cmp edx, 10000  jne .LBB0_4  mov eax, ecx  ret .LBB0_1:  xor ecx, ecx  mov eax, ecx  ret .LBB0_6:  push rax  lea rdi, [rip + str.0]  lea rdx, [rip + .L__unnamed_1]  mov esi, 57  call qword ptr [rip + core::panicking::panic@GOTPCREL]  ud2 str.0:  .ascii "attempt to calculate the remainder with a divisor of zero"

Running the code you confirm that the divisor can't be zero.
I think Rustc should be able to remove this test.
(The same code with T=u16 contains no division by zero test).

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-codegenArea: Code generationC-enhancementCategory: An issue proposing an enhancement or a PR with one.E-needs-testCall for participation: An issue has been fixed and does not reproduce, but no test has been added.I-slowIssue: Problems and improvements with respect to performance of generated code.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions