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.