https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90594
Bug ID: 90594 Summary: [9/10 regression] Spurious popcount emitted Product: gcc Version: 9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: wilco at gcc dot gnu.org Target Milestone: --- The following testcase emits a popcount which computes the final pointer value. This is redundant given the loop already computes the pointer value. The popcount causes the code to be significantly larger and slower than previous GCC versions. int *bad_popcount (unsigned x, int *p) { for (; x != 0; ) { int tmp = __builtin_ctz (x); x = x & (x - 1); *p++ = tmp; } return p; } GCC8: cbz w0, .L2 .L3: rbit w2, w0 clz w2, w2 str w2, [x1], 4 sub w2, w0, #1 ands w0, w0, w2 bne .L3 .L2: mov x0, x1 ret GCC9: cbz w0, .L12 mov x4, x1 mov w2, w0 .L11: rbit w3, w2 clz w3, w3 str w3, [x4], 4 sub w3, w2, #1 ands w2, w2, w3 bne .L11 fmov s0, w0 cnt v0.8b, v0.8b addv b0, v0.8b umov w0, v0.b[0] sub w0, w0, #1 add x0, x0, 1 add x0, x1, x0, lsl 2 ret .L12: mov x0, x1 ret