http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48316
--- Comment #2 from rguenther at suse dot de <rguenther at suse dot de> --- On Wed, 12 Mar 2014, xinliangli at gmail dot com wrote: > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48316 > > davidxl <xinliangli at gmail dot com> changed: > > What |Removed |Added > ---------------------------------------------------------------------------- > CC| |xinliangli at gmail dot com > > --- Comment #1 from davidxl <xinliangli at gmail dot com> --- > int a[8][8]; > > > int foo(int i) > { > return a[i][3] + a[i+1][3] + a[i+2][3]; > } > > ICC generates: > > movslq %edi, %rdi #5.1 > shlq $5, %rdi #6.10 > movl 12+a(%rdi), %eax #6.10 > addl 44+a(%rdi), %eax #6.20 > addl 76+a(%rdi), %eax > > GCC can not CSE the common code for address arithmetic: > > leal 1(%rdi), %eax > movslq %edi, %rdx > addl $2, %edi > cltq > movslq %edi, %rdi > salq $5, %rdx > salq $5, %rax > salq $5, %rdi > movl a+12(%rax), %eax > addl a+12(%rdx), %eax > addl a+12(%rdi), %eax > ret This particular case is a RTL optimization deficiency (or a missed SLSR case). The address operations are only lowered during RTL expansion.