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