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

            Bug ID: 89922
           Summary: Loop on fixed size array is not unrolled and poorly
                    optimized
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: antoshkka at gmail dot com
  Target Milestone: ---

Consider the example:


struct array {
   int data[5];
};

array test(int i) {
    array a = {1, i, 2, 3, 4};

    for (int j = 0; j < 5; ++j) {
      a.data[j] += j;
    }

    return a;
}


GCC-9 generates ~20 instructions with jmps.

Rewriting the same function with unrolled loop makes the assembly much better:

array test2(int i) {
    array a = {1, i, 2, 3, 4};
    a.data[0] += 0;
    a.data[1] += 1;
    a.data[2] += 2;
    a.data[3] += 3;
    a.data[4] += 4;

    return a;
}


Assembly for `test2` takes only ~8 instructions:
test2(int):
        add     esi, 1
        mov     DWORD PTR [rdi], 1
        mov     rax, rdi
        movabs  rdx, 25769803780
        mov     DWORD PTR [rdi+4], esi
        mov     QWORD PTR [rdi+8], rdx
        mov     DWORD PTR [rdi+16], 8
        ret

Reply via email to