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.