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

Reply via email to