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

            Bug ID: 113435
           Summary: Missed optimization of loop invariant elimination
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: 652023330028 at smail dot nju.edu.cn
  Target Milestone: ---

Hello, we noticed that maybe there is a missed optimization for loop invariant
elimination.

Loop invariant: (a+b)/w

https://godbolt.org/z/T6zoGxrd1
int a, b, c, d, w;
void func(){
    for(int i=0;i<10000;i++){
        a+=c;
        b+=-c;
        d+=(a+b)/w;
    }
}

GCC (trunk) -O3:
func():
        push    rbx
        mov     r11d, DWORD PTR b[rip]
        mov     ecx, 10000
        mov     ebx, DWORD PTR a[rip]
        mov     r8d, DWORD PTR c[rip]
        mov     r10d, DWORD PTR w[rip]
        mov     r9d, DWORD PTR d[rip]
        mov     edi, r11d
        mov     esi, ebx
.L2:
        lea     eax, [rdi+rsi]
        sub     edi, r8d
        add     esi, r8d
        cdq
        idiv    r10d
        add     r9d, eax
        sub     ecx, 1
        jne     .L2
        imul    eax, r8d, -9999
        add     ebx, r8d
        sub     r11d, r8d
        mov     DWORD PTR d[rip], r9d
        sub     ebx, eax
        add     eax, r11d
        mov     DWORD PTR a[rip], ebx
        pop     rbx
        mov     DWORD PTR b[rip], eax
        ret

Expected code (Clang):
func():                               # @func()
        mov     r8d, dword ptr [rip + c]
        mov     esi, dword ptr [rip + a]
        mov     edi, dword ptr [rip + b]
        mov     ecx, dword ptr [rip + d]
        lea     eax, [rdi + rsi]
        cdq
        idiv    dword ptr [rip + w]
        add     eax, eax
        mov     edx, 10000
        lea     r9d, [rax + rax]
.LBB0_1:                                # =>This Inner Loop Header: Depth=1
        add     ecx, eax
        add     ecx, r9d
        add     ecx, r9d
        add     edx, -10
        jne     .LBB0_1
        imul    eax, r8d, 10000
        add     esi, eax
        sub     edi, eax
        mov     dword ptr [rip + a], esi
        mov     dword ptr [rip + b], edi
        mov     dword ptr [rip + d], ecx
        ret

Thank you very much for your time and effort! We look forward to hearing from
you.
  • [Bug tree-optimization/1... 652023330028 at smail dot nju.edu.cn via Gcc-bugs

Reply via email to