[Bug tree-optimization/54589] New: [missed-optimization] struct offset add should be folded into address calculation
sgunderson at bigfoot dot com
gcc-bugzilla@gcc.gnu.org
Sat Sep 15 13:37:00 GMT 2012
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54589
Bug #: 54589
Summary: [missed-optimization] struct offset add should be
folded into address calculation
Classification: Unclassified
Product: gcc
Version: 4.8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: sgunderson@bigfoot.com
Hi,
I found this in 4.4 (Ubuntu 10.04), and have confirmed it's still there in
gcc (Debian 20120820-1) 4.8.0 20120820 (experimental) [trunk revision 190537]
This code:
#include <emmintrin.h>
struct param {
int a, b, c, d;
__m128i array[256];
};
void func(struct param *p, unsigned char *src, int *dst)
{
__m128i x = p->array[*src];
*dst = _mm_cvtsi128_si32(x);
}
compiles with -O2 on x86-64 to this assembler:
0000000000000000 <func>:
0: 0f b6 06 movzbl (%rsi),%eax
3: 48 83 c0 01 add $0x1,%rax
7: 48 c1 e0 04 shl $0x4,%rax
b: 8b 04 07 mov (%rdi,%rax,1),%eax
e: 89 02 mov %eax,(%rdx)
10: c3 retq
The add should be folded into the address calculation here. (The shl can't,
because it's too big.) Curiously enough, if I misalign the struct element by
removing c and d, and declaring the struct __attribute__((packed)), GCC will do
that; the mov will then be from $8(%rdi,%rax,1),%eax and there is no redundant
add.
More information about the Gcc-bugs
mailing list