https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107043
Bug ID: 107043 Summary: range information not used in popcount Product: gcc Version: 13.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: drepper.fsp+rhbz at gmail dot com Target Milestone: --- This code could be compiled to a simple return of the value 1 but it isn't because the range information for n does not survive long enough. int g(int n) { n &= 0x8000; if (n == 0) return 1; return __builtin_popcount(n); } The code generated today is lengthy: 0: 81 e7 00 80 00 00 and $0x8000,%edi 6: ba 01 00 00 00 mov $0x1,%edx b: 89 f8 mov %edi,%eax d: c1 e8 0f shr $0xf,%eax 10: 85 ff test %edi,%edi 12: 0f 44 c2 cmove %edx,%eax 15: c3 ret