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

            Bug ID: 92574
           Summary: Inefficient code for multidimensional array assess
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: hjl.tools at gmail dot com
  Target Milestone: ---

For

[hjl@gnu-skx-1 tmp]$ cat foo3.c 
extern long bar[25][10];
long
foo (long ip, long itp)
{
  long ip1 = ip + 1;
  long itp1 = itp + 1;

  return (bar[ip][itp]
          + bar[ip][itp1]
          + bar[ip1][itp]
          + bar[ip1][itp1]);
}

On x86-64 GCC -O2 generate:

        .type   foo, @function
foo:
.LFB0:
        .cfi_startproc
        leaq    (%rdi,%rdi,4), %rax
        leaq    1(%rsi), %rcx
        addq    %rax, %rax
        leaq    (%rax,%rsi), %rdx
        addq    %rcx, %rax
        movq    bar(,%rax,8), %rax
        addq    bar(,%rdx,8), %rax
        leaq    5(%rdi,%rdi,4), %rdx
        addq    %rdx, %rdx
        addq    %rdx, %rsi
        addq    %rcx, %rdx
        addq    bar(,%rsi,8), %rax
        addq    bar(,%rdx,8), %rax
        ret
        .cfi_endproc

Clang 8 generates:

        .type   foo,@function
foo:                                    # @foo
        .cfi_startproc
# %bb.0:
        shlq    $4, %rdi
        leaq    (%rdi,%rdi,4), %rcx
        movq    bar+8(%rcx,%rsi,8), %rax
        addq    bar(%rcx,%rsi,8), %rax
        addq    bar+80(%rcx,%rsi,8), %rax
        addq    bar+88(%rcx,%rsi,8), %rax
        retq
.Lfunc_end0:
        .size   foo, .Lfunc_end0-foo
        .cfi_endproc

Reply via email to