[Bug middle-end/37774] New: [4.4 Regression] Unnecessary load instruction in a loop
hjl dot tools at gmail dot com
gcc-bugzilla@gcc.gnu.org
Wed Oct 8 17:10:00 GMT 2008
Gcc 4.4 generates an extra load in a loop:
[hjl@gnu-6 gcc]$ cat /tmp/b.c
#include <tmmintrin.h>
extern __m128i src[10];
extern __m128i resdst[10];
void
foo (void)
{
int i;
for (i = 0; i < 10; i++)
resdst[i] = _mm_abs_epi16 (src[i]);
}
[hjl@gnu-6 gcc]$ gcc -O2 -S /tmp/b.c -o old.s -mssse3
-fno-asynchronous-unwind-tables
[hjl@gnu-6 gcc]$ gcc --version
gcc (GCC) 4.3.0 20080428 (Red Hat 4.3.0-8)
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[hjl@gnu-6 gcc]$ cat old.s
.file "b.c"
.text
.p2align 4,,15
.globl foo
.type foo, @function
foo:
xorl %eax, %eax
.p2align 4,,10
.p2align 3
.L2:
pabsw src(%rax), %xmm0
movdqa %xmm0, resdst(%rax)
addq $16, %rax
cmpq $160, %rax
jne .L2
rep
ret
.size foo, .-foo
.ident "GCC: (GNU) 4.3.0 20080428 (Red Hat 4.3.0-8)"
.section .note.GNU-stack,"",@progbits
[hjl@gnu-6 gcc]$ ./xgcc -B./ -O2 -mssse3 -S /tmp/b.c
-fno-asynchronous-unwind-tables
[hjl@gnu-6 gcc]$ cat b.s
.file "b.c"
.text
.p2align 4,,15
.globl foo
.type foo, @function
foo:
xorl %eax, %eax
.p2align 4,,10
.p2align 3
.L2:
movdqu src(%rax), %xmm0
pabsw %xmm0, %xmm0
movdqu %xmm0, resdst(%rax)
addq $16, %rax
cmpq $160, %rax
jne .L2
rep
ret
.size foo, .-foo
.ident "GCC: (GNU) 4.4.0 20081006 (experimental) [trunk revision
140917]"
There are 2 problems:
1. Alignment info is lost and unaligned load is generated.
2. The load isn't needed at all.
--
Summary: [4.4 Regression] Unnecessary load instruction in a loop
Product: gcc
Version: 4.4.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: middle-end
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: hjl dot tools at gmail dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37774
More information about the Gcc-bugs
mailing list