https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120842

            Bug ID: 120842
           Summary: optimization for check many equal by bits or
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rockeet at gmail dot com
  Target Milestone: ---

bool many_eq_max_13(unsigned int val) {
    [[assume(val < 32)]];
    return val ==  1 || val ==  4 || val ==  7 || val ==  9 ||
           val == 10 || val == 13;
}
bool many_eq_max_31(unsigned int val) {
    [[assume(val < 32)]];
    return val ==  1 || val ==  4 || val ==  7 || val ==  9 ||
           val == 10 || val == 13 || val == 31;
}
bool many_eq_max_63(unsigned int val) {
    [[assume(val < 64)]];
    return val ==  1 || val ==  4 || val ==  7 || val ==  9 ||
           val == 10 || val == 13 || val == 31 || val == 63;
}

gcc just produce optimal code for many_eq_max_31:
(https://godbolt.org/z/jrf8rexj7)

"many_eq_max_13(unsigned int)":
        mov     eax, 658
        mov     edx, 9216
        bt      rax, rdi
        setc    al
        bt      rdx, rdi
        setc    dl
        test    al, al
        cmove   eax, edx
        ret
"many_eq_max_31(unsigned int)":
        mov     eax, 2147493522
        bt      rax, rdi
        setc    al
        ret
"many_eq_max_63(unsigned int)":
        mov     eax, 9874
        bt      rax, rdi
        setc    al
        test    al, al
        je      .L7
        ret
.L7:
        and     edi, -33
        cmp     edi, 31
        sete    al
        ret

both gcc and clang is not perfect for this case, clang is a bit better.

Reply via email to