------- Comment #1 from rguenth at gcc dot gnu dot org 2007-07-09 13:39 ------- With 2.95, 3.3.6 and 3.4.6 I get (for 32bit):
foo: pushl %ebp movl %esp,%ebp movl 8(%ebp),%edx movl 12(%ebp),%eax movl %ebp,%esp popl %ebp movl 8(%edx,%eax,4),%ecx addl 4(%edx,%eax,4),%ecx addl 12(%edx,%eax,4),%ecx movl %ecx,%eax ret 4.0.3 and 4.1.2 generate: foo: pushl %ebp movl %esp, %ebp movl 12(%ebp), %edx sall $2, %edx addl 8(%ebp), %edx movl 8(%edx), %eax addl 4(%edx), %eax addl 12(%edx), %eax leave ret 4.2.0 generates foo: pushl %ebp movl %esp, %ebp movl 12(%ebp), %ecx movl 8(%ebp), %edx popl %ebp sall $2, %ecx movl 4(%ecx,%edx), %eax addl 8(%ecx,%edx), %eax addl 12(%ecx,%edx), %eax ret while mainline generates foo: pushl %ebp movl %esp, %ebp movl 12(%ebp), %ecx movl 8(%ebp), %edx pushl %ebx leal 0(,%ecx,4), %ebx movl 8(%ebx,%edx), %eax addl 4(%edx,%ecx,4), %eax addl 12(%ebx,%edx), %eax popl %ebx popl %ebp ret 64bit variants of all of the above create foo: .LFB2: leal 1(%rsi), %edx leal 2(%rsi), %eax addl $3, %esi movl (%rdi,%rax,4), %eax addl (%rdi,%rdx,4), %eax addl (%rdi,%rsi,4), %eax ret Tree dumps (of mainline) 64bit vs. 32bit are: return (*(p + (long unsigned int) (i + 2) * 4) + *(p + (long unsigned int) (i + 1) * 4)) + *(p + (long unsigned int) (i + 3) * 4); unsigned int D.1660; D.1660 = i * 4; return (*(p + (D.1660 + 8)) + *(p + (i + 1) * 4)) + *(p + (D.1660 + 12)); -- rguenth at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Ever Confirmed|0 |1 GCC host triplet|i686-pc-linux-gnu | GCC target triplet| |i686-*-* Keywords| |missed-optimization Last reconfirmed|0000-00-00 00:00:00 |2007-07-09 13:39:51 date| | Target Milestone|--- |4.3.0 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32698