public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug target/53056] bad code generated for ARM NEON with vector types in structs
2012-04-20 20:16 [Bug target/53056] New: bad code generated for ARM NEON with vector types in structs drwowe at yahoo dot com
@ 2012-04-20 20:16 ` drwowe at yahoo dot com
2012-04-20 20:21 ` drwowe at yahoo dot com
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: drwowe at yahoo dot com @ 2012-04-20 20:16 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53056
--- Comment #1 from D W <drwowe at yahoo dot com> 2012-04-20 20:16:35 UTC ---
Also tested arm-linux-gnueabi-gcc-4.8.0-svn186501. Same results.
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug target/53056] New: bad code generated for ARM NEON with vector types in structs
@ 2012-04-20 20:16 drwowe at yahoo dot com
2012-04-20 20:16 ` [Bug target/53056] " drwowe at yahoo dot com
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: drwowe at yahoo dot com @ 2012-04-20 20:16 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53056
Bug #: 53056
Summary: bad code generated for ARM NEON with vector types in
structs
Classification: Unclassified
Product: gcc
Version: 4.7.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: drwowe@yahoo.com
Consider the following snippet:
typedef int vi16 __attribute__((vector_size(16*sizeof(int))));
vi16 add(vi16 a, vi16b) {
return a + b;
}
compile with arm-linux-gnueabi-gcc-4.7 -O2 -march=armv7-a -mhard-float
-mfpu=neon
Some fairly good code is produced:
sub sp, sp, #8
str r4, [sp, #-4]!
fstmfdd sp!, {d8, d9, d10, d11, d12, d13}
add ip, sp, #52
add r4, sp, #116
vldmia r4, {d24-d31}
stmia ip, {r2, r3}
vldmia ip, {d6-d13}
vadd.i32 q8, q3, q12
vadd.i32 q9, q4, q13
vadd.i32 q10, q5, q14
vadd.i32 q11, q6, q15
vstmia r0, {d16-d23}
fldmfdd sp!, {d8, d9, d10, d11, d12, d13}
ldmfd sp!, {r4}
add sp, sp, #8
bx lr
However, the the vector is embedded in a struct the code generation becomes
awful.
typedef struct A {
vi16 v;
} A;
vi16 add1(A a, A b) {
return a.v + b.v;
}
// Same code as add1
vi16 add2(A a, A b) {
vi16* av = &a.v;
vi16* bv = &b.v;
return a.v + b.v;
}
Both add1 and add2 produce the same code:
add1:
@ args = 128, pretend = 8, frame = 128
@ frame_needed = 0, uses_anonymous_args = 0
@ link register save eliminated.
sub sp, sp, #8
sub sp, sp, #128
add r1, sp, #128
stmia sp, {r2, r3}
stmia r1, {r2, r3}
ldr r3, [sp, #192]
ldr r2, [r1, #8]
str r3, [sp, #64]
ldr r3, [sp, #196]
str r2, [sp, #8]
ldr r2, [r1, #12]
str r3, [sp, #68]
ldr r3, [sp, #200]
... lots and lots of load and store instructions.
But adding an "optimization barrier" to add2 produces similar code to the
original example, by making the compiler "forget" the origin of the pointer.
vi16 add3(A a, A b) {
vi16* av = &a.v;
vi16* bv = &b.v;
asm("" : "+r"(av), "+r"(bv)); // causes good code to be generated.
return *av + *bv;
}
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug target/53056] bad code generated for ARM NEON with vector types in structs
2012-04-20 20:16 [Bug target/53056] New: bad code generated for ARM NEON with vector types in structs drwowe at yahoo dot com
2012-04-20 20:16 ` [Bug target/53056] " drwowe at yahoo dot com
@ 2012-04-20 20:21 ` drwowe at yahoo dot com
2012-04-21 23:37 ` rearnsha at gcc dot gnu.org
2013-08-05 21:42 ` [Bug target/53056] poor " rearnsha at gcc dot gnu.org
3 siblings, 0 replies; 5+ messages in thread
From: drwowe at yahoo dot com @ 2012-04-20 20:21 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53056
--- Comment #2 from D W <drwowe at yahoo dot com> 2012-04-20 20:20:46 UTC ---
Typo: add2 should be:
vi16 add2(A a, A b) {
vi16* av = &a.v;
vi16* bv = &b.v;
return *av + *bv;
}
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug target/53056] bad code generated for ARM NEON with vector types in structs
2012-04-20 20:16 [Bug target/53056] New: bad code generated for ARM NEON with vector types in structs drwowe at yahoo dot com
2012-04-20 20:16 ` [Bug target/53056] " drwowe at yahoo dot com
2012-04-20 20:21 ` drwowe at yahoo dot com
@ 2012-04-21 23:37 ` rearnsha at gcc dot gnu.org
2013-08-05 21:42 ` [Bug target/53056] poor " rearnsha at gcc dot gnu.org
3 siblings, 0 replies; 5+ messages in thread
From: rearnsha at gcc dot gnu.org @ 2012-04-21 23:37 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53056
Richard Earnshaw <rearnsha at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Last reconfirmed| |2012-04-21
CC| |rearnsha at gcc dot gnu.org
Ever Confirmed|0 |1
--- Comment #3 from Richard Earnshaw <rearnsha at gcc dot gnu.org> 2012-04-21 23:35:27 UTC ---
Try -fno-split-wide-types.
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug target/53056] poor code generated for ARM NEON with vector types in structs
2012-04-20 20:16 [Bug target/53056] New: bad code generated for ARM NEON with vector types in structs drwowe at yahoo dot com
` (2 preceding siblings ...)
2012-04-21 23:37 ` rearnsha at gcc dot gnu.org
@ 2013-08-05 21:42 ` rearnsha at gcc dot gnu.org
3 siblings, 0 replies; 5+ messages in thread
From: rearnsha at gcc dot gnu.org @ 2013-08-05 21:42 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53056
Richard Earnshaw <rearnsha at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |RESOLVED
Resolution|--- |FIXED
Target Milestone|--- |4.8.0
--- Comment #4 from Richard Earnshaw <rearnsha at gcc dot gnu.org> ---
Fixed in the run-up to gcc-4.8.0. Code generated is now:
add1:
sub sp, sp, #8
str r4, [sp, #-4]!
add r1, sp, #4
add r4, sp, #68
vldmia r4, {d24-d31}
ldr r4, [sp], #4
stmia r1, {r2, r3}
vldmia r1, {d0-d7}
add sp, sp, #8
vadd.i32 q8, q0, q12
vadd.i32 q9, q1, q13
vadd.i32 q10, q2, q14
vadd.i32 q11, q3, q15
vstmia r0, {d16-d23}
bx lr
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2013-08-05 21:42 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-04-20 20:16 [Bug target/53056] New: bad code generated for ARM NEON with vector types in structs drwowe at yahoo dot com
2012-04-20 20:16 ` [Bug target/53056] " drwowe at yahoo dot com
2012-04-20 20:21 ` drwowe at yahoo dot com
2012-04-21 23:37 ` rearnsha at gcc dot gnu.org
2013-08-05 21:42 ` [Bug target/53056] poor " rearnsha at gcc dot gnu.org
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).