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

            Bug ID: 94573
           Summary: Optimizer produces suboptimal code related to
                    -fstore-merging
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: zhongyunde at tom dot com
  Target Milestone: ---

For the following code, we can known init the array C000016DD is always 
consecutive, so we can use the more bigger mode size.
test base on the x86-64 gcc 9.2 on https://gcc.godbolt.org/, now it is still
handled DWORD by DWORD, and we except optimize it with QWORD or more bigger
size.

extern signed int C000016DD[43][12]; 

void C00001F93(int index)
{
    C000016DD[index][0] = 0;
    C000016DD[index][1] = 0;
    C000016DD[index][2] = 0;
    C000016DD[index][3] = 0;
    C000016DD[index][4] = 0;
    C000016DD[index][5] = 0;
    C000016DD[index][6] = 0;
    C000016DD[index][7] = 0;

    return;
}

============= related assemble =============
C00001F93(int):
        movsx   rdi, edi
        lea     rax, [rdi+rdi*2]
        sal     rax, 4
        mov     DWORD PTR C000016DD[rax], 0
        mov     DWORD PTR C000016DD[rax+4], 0
        mov     DWORD PTR C000016DD[rax+8], 0
        mov     DWORD PTR C000016DD[rax+12], 0
        mov     DWORD PTR C000016DD[rax+16], 0
        mov     DWORD PTR C000016DD[rax+20], 0
        mov     DWORD PTR C000016DD[rax+24], 0
        mov     DWORD PTR C000016DD[rax+28], 0
        ret

Reply via email to