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