https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92980
Bug ID: 92980 Summary: [miss optimization]redundant load missed by fre. Product: gcc Version: 10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: crazylht at gmail dot com CC: hjl.tools at gmail dot com, wwwhhhyyy333 at gmail dot com Target Milestone: --- cat test.c int foo(unsigned int *__restrict src1, int i, int k, int n) { int j = k + n; int sum = src1[j]; sum += src1[j-1]; if (i <= k) { j+=2; sum += src1[j-3]; } return sum + j; } x86_64_gcctrunk -Ofast test.c -S got foo: .LFB0: .cfi_startproc addl %edx, %ecx movl %esi, %r8d movslq %ecx, %rsi movl (%rdi,%rsi,4), %eax addl -4(%rdi,%rsi,4), %eax cmpl %r8d, %edx jl .L3 addl $2, %ecx movslq %ecx, %rdx addl -12(%rdi,%rdx,4), %eax ---- redudant load, it's actual a[j-1] which is loaded before. .L3: addl %ecx, %eax ret .cfi_endproc .LFE0: .size foo, .-foo .ident "GCC: (GNU) 10.0.0 20191117 (experimental)" .section .note.GNU-stack,"",@progbits it could be better like foo: .LFB0: .cfi_startproc addl %edx, %ecx movl %esi, %r9d movslq %ecx, %rsi movl -4(%rdi,%rsi,4), %r8d movl (%rdi,%rsi,4), %eax addl %r8d, %eax cmpl %r9d, %edx jl .L3 addl $2, %ecx addl %r8d, %eax ----> reuse earlir load result. .L3: addl %ecx, %eax ret .cfi_endproc