public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c/36134] New: GCC creates suboptimal ASM : usage of ADDA.L where LEA could be used
@ 2008-05-05 13:51 gunnar at greyhound-data dot com
2008-05-07 19:34 ` [Bug target/36134] " rguenth at gcc dot gnu dot org
` (7 more replies)
0 siblings, 8 replies; 9+ messages in thread
From: gunnar at greyhound-data dot com @ 2008-05-05 13:51 UTC (permalink / raw)
To: gcc-bugs
+++ This bug was initially created as a clone of Bug #36133 +++
Hello,
The ASM code created by GCC 4.2.1 for 68k/Coldfire platform is not optimal.
Comparing ASM output created by GCC 2.9 with GCC 4.2,
the generated code got partially much worse with GCC 4.
One problem that was visible a lot was that GCC used ADDA.L instead using the
shorter LEA instruction.
Please see the below example for details.
In line 28 and 2E you can see that two times the ADDA.L instructions was used,
where instead the shorter LEA instruction could have been used.
Example: C-source
Code:
void * copy_32x4a(void *destparam, const void *srcparam, size_t size)
{
int *dest = destparam;
const int *src = srcparam;
int size32;
size32 = size / 16;
for (; size32; size32--) {
*dest++ = *src++;
*dest++ = *src++;
*dest++ = *src++;
*dest++ = *src++;
}
}
Compile option: m68k-linux-gnu-gcc -mcpu=54455 -msoft-float -o example -Os
-fomit-frame-pointer example.c
Code generated by GCC 4.2:
04: 202f 000c movel %sp@(12),%d0
08: 226f 0004 moveal %sp@(4),%a1
0c: 206f 0008 moveal %sp@(8),%a0
10: e888 lsrl #4,%d0
12: 6022 bras 36
14: 2290 movel %a0@,%a1@
16: 2368 0004 0004 movel %a0@(4),%a1@(4)
1c: 2368 0008 0008 movel %a0@(8),%a1@(8)
22: 2368 000c 000c movel %a0@(12),%a1@(12)
28: d3fc 0000 0010 addal #16,%a1
2e: d1fc 0000 0010 addal #16,%a0
34: 5380 subql #1,%d0
36: 4a80 tstl %d0
38: 66da bnes 14
3a: 4e75 rts
For comparison here is code that you would expect:
04: 202f 000c movel %sp@(12),%d0
08: 226f 0004 moveal %sp@(4),%a1
0c: 206f 0008 moveal %sp@(8),%a0
10: e888 lsrl #4,%d0
12: 6022 beq 20
14: 20d9 movel %a1@+,%a0@+
16: 20d9 movel %a1@+,%a0@+
18: 20d9 movel %a1@+,%a0@+
1a: 20d9 movel %a1@+,%a0@+
1c: 5380 subql #1,%d0
1e: 66da bnes 14
20: 4e75 rts
Compiler used:
m68k-linux-gnu-gcc -v
Using built-in specs.
Target: m68k-linux-gnu
Configured with: /scratch/shinwell/cf-fall-linux-lite/src/gcc-4.2/configure
--build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=m68k-linux-gnu
--enable-threads --disable-libmudflap --disable-libssp --disable-libgomp
--disable-libstdcxx-pch --with-arch=cf --with-gnu-as --with-gnu-ld
--enable-languages=c,c++ --enable-shared --enable-symvers=gnu
--enable-__cxa_atexit --with-pkgversion=Sourcery G++ Lite 4.2-47
--with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls
--prefix=/opt/freescale/usr/local/gcc-4.2.47-eglibc-2.5.47/m68k-linux
--with-sysroot=/opt/freescale/usr/local/gcc-4.2.47-eglibc-2.5.47/m68k-linux/m68k-linux-gnu/libc
--with-build-sysroot=/scratch/shinwell/cf-fall-linux-lite/install/m68k-linux-gnu/libc
--enable-poison-system-directories
--with-build-time-tools=/scratch/shinwell/cf-fall-linux-lite/install/m68k-linux-gnu/bin
--with-build-time-tools=/scratch/shinwell/cf-fall-linux-lite/install/m68k-linux-gnu/bin
Thread model: posix
gcc version 4.2.1 (Sourcery G++ Lite 4.2-47)
I hope that this report help you to improve the quality of GCC.
Kind regards
Gunnar von Boehn
--
P.S. I put the noticed issues in indivitual tivkets for easier tracking. I hope
that this is helpfull.
--
Summary: GCC creates suboptimal ASM : usage of ADDA.L where LEA
could be used
Product: gcc
Version: 4.2.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: gunnar at greyhound-data dot com
GCC build triplet: i686-pc-linux-gnu
GCC host triplet: i686-pc-linux-gnu
GCC target triplet: m68k-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36134
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug target/36134] GCC creates suboptimal ASM : usage of ADDA.L where LEA could be used
2008-05-05 13:51 [Bug c/36134] New: GCC creates suboptimal ASM : usage of ADDA.L where LEA could be used gunnar at greyhound-data dot com
@ 2008-05-07 19:34 ` rguenth at gcc dot gnu dot org
2008-05-28 16:20 ` gunnar at greyhound-data dot com
` (6 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: rguenth at gcc dot gnu dot org @ 2008-05-07 19:34 UTC (permalink / raw)
To: gcc-bugs
------- Comment #1 from rguenth at gcc dot gnu dot org 2008-05-07 19:33 -------
It would have been nice to check at least gcc 4.3 (or better current trunk).
--
rguenth at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
Severity|normal |enhancement
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36134
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug target/36134] GCC creates suboptimal ASM : usage of ADDA.L where LEA could be used
2008-05-05 13:51 [Bug c/36134] New: GCC creates suboptimal ASM : usage of ADDA.L where LEA could be used gunnar at greyhound-data dot com
2008-05-07 19:34 ` [Bug target/36134] " rguenth at gcc dot gnu dot org
@ 2008-05-28 16:20 ` gunnar at greyhound-data dot com
2008-05-29 12:51 ` gunnar at greyhound-data dot com
` (5 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: gunnar at greyhound-data dot com @ 2008-05-28 16:20 UTC (permalink / raw)
To: gcc-bugs
------- Comment #2 from gunnar at greyhound-data dot com 2008-05-28 16:18 -------
(In reply to comment #1)
> It would have been nice to check at least gcc 4.3 (or better current trunk).
>
I've verified with latest source gcc source "version 4.4.0 20080523
(experimental) (GCC)"
The most current GCC source still has the problem
that ADD.L instructions are used for incrementing pointers instead using
shorter LEA instruction.
Code generated by GCC 4.4 for the testcase.
copy_32x4:
link.w %fp,#-12
movem.l #3076,(%sp)
move.l 16(%fp),%d2
lsr.l #4,%d2
move.l 8(%fp),%a3
move.l 12(%fp),%a2
jra .L6
.L7:
move.l (%a2),%a1
subq.l #1,%d2
move.l 4(%a2),%d0
move.l 8(%a2),%d1
move.l 12(%a2),%a0
add.l #16,%a2
move.l %a1,(%a3)
move.l %d0,4(%a3)
move.l %d1,8(%a3)
move.l %a0,12(%a3)
add.l #16,%a3
.L6:
tst.l %d2
jne .L7
movem.l (%sp),#3076
unlk %fp
rts
Regards
Gunnar
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36134
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug target/36134] GCC creates suboptimal ASM : usage of ADDA.L where LEA could be used
2008-05-05 13:51 [Bug c/36134] New: GCC creates suboptimal ASM : usage of ADDA.L where LEA could be used gunnar at greyhound-data dot com
2008-05-07 19:34 ` [Bug target/36134] " rguenth at gcc dot gnu dot org
2008-05-28 16:20 ` gunnar at greyhound-data dot com
@ 2008-05-29 12:51 ` gunnar at greyhound-data dot com
2008-06-02 22:37 ` schwab at suse dot de
` (4 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: gunnar at greyhound-data dot com @ 2008-05-29 12:51 UTC (permalink / raw)
To: gcc-bugs
------- Comment #3 from gunnar at greyhound-data dot com 2008-05-29 12:50 -------
Created an attachment (id=15699)
--> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=15699&action=view)
Prefer 4 byte long LEA over 6 byte long ADD.L
Please include the attached patch for GCC.
The added patch has changed the case statement to prefer the 4 byte long lea
over the 6 byte long add.l for immediate sub/add instructions to address
registers with an immediate operant size of 16bit max.
LEA is optimized for pipelining (with destination forwarding) and is shorter
than ADD.L
Regards
Gunnar von Boehn
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36134
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug target/36134] GCC creates suboptimal ASM : usage of ADDA.L where LEA could be used
2008-05-05 13:51 [Bug c/36134] New: GCC creates suboptimal ASM : usage of ADDA.L where LEA could be used gunnar at greyhound-data dot com
` (2 preceding siblings ...)
2008-05-29 12:51 ` gunnar at greyhound-data dot com
@ 2008-06-02 22:37 ` schwab at suse dot de
2008-06-10 15:24 ` gunnar at greyhound-data dot com
` (3 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: schwab at suse dot de @ 2008-06-02 22:37 UTC (permalink / raw)
To: gcc-bugs
------- Comment #4 from schwab at suse dot de 2008-06-02 22:37 -------
Could you please submit your patch to gcc-patches@gcc.gnu.org, including a
ChangeLog entry and stating how you tested it.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36134
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug target/36134] GCC creates suboptimal ASM : usage of ADDA.L where LEA could be used
2008-05-05 13:51 [Bug c/36134] New: GCC creates suboptimal ASM : usage of ADDA.L where LEA could be used gunnar at greyhound-data dot com
` (3 preceding siblings ...)
2008-06-02 22:37 ` schwab at suse dot de
@ 2008-06-10 15:24 ` gunnar at greyhound-data dot com
2008-06-12 14:27 ` gunnar at greyhound-data dot com
` (2 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: gunnar at greyhound-data dot com @ 2008-06-10 15:24 UTC (permalink / raw)
To: gcc-bugs
------- Comment #5 from gunnar at greyhound-data dot com 2008-06-10 15:24 -------
(In reply to comment #4)
> Could you please submit your patch to gcc-patches@gcc.gnu.org, including a
> ChangeLog entry and stating how you tested it.
>
As requested I did send the email last week.
Do you need anything else from me to work on this?
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36134
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug target/36134] GCC creates suboptimal ASM : usage of ADDA.L where LEA could be used
2008-05-05 13:51 [Bug c/36134] New: GCC creates suboptimal ASM : usage of ADDA.L where LEA could be used gunnar at greyhound-data dot com
` (4 preceding siblings ...)
2008-06-10 15:24 ` gunnar at greyhound-data dot com
@ 2008-06-12 14:27 ` gunnar at greyhound-data dot com
2008-11-14 10:51 ` ams at gcc dot gnu dot org
2008-11-14 10:55 ` ams at gcc dot gnu dot org
7 siblings, 0 replies; 9+ messages in thread
From: gunnar at greyhound-data dot com @ 2008-06-12 14:27 UTC (permalink / raw)
To: gcc-bugs
------- Comment #6 from gunnar at greyhound-data dot com 2008-06-12 14:27 -------
Andreas,
could you please have a look at this?
Cheers
Gunnar
--
gunnar at greyhound-data dot com changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |schwab at suse dot de
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36134
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug target/36134] GCC creates suboptimal ASM : usage of ADDA.L where LEA could be used
2008-05-05 13:51 [Bug c/36134] New: GCC creates suboptimal ASM : usage of ADDA.L where LEA could be used gunnar at greyhound-data dot com
` (5 preceding siblings ...)
2008-06-12 14:27 ` gunnar at greyhound-data dot com
@ 2008-11-14 10:51 ` ams at gcc dot gnu dot org
2008-11-14 10:55 ` ams at gcc dot gnu dot org
7 siblings, 0 replies; 9+ messages in thread
From: ams at gcc dot gnu dot org @ 2008-11-14 10:51 UTC (permalink / raw)
To: gcc-bugs
------- Comment #7 from ams at gcc dot gnu dot org 2008-11-14 10:50 -------
Subject: Bug 36134
Author: ams
Date: Fri Nov 14 10:49:06 2008
New Revision: 141853
URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=141853
Log:
2008-11-14 Maxim Kuvyrkov <maxim@codesourcery.com>
Andrew Stubbs <ams@codesourcery.com>
Gunnar Von Boehn <gunnar@genesi-usa.com>
gcc/
PR target/36134
* config/m68k/m68k.md (addsi3_5200): Add a new alternative preferring
the shorter LEA insn over ADD.L where possible.
gcc/testsuite/
PR target/36134
* gcc.target/m68k/pr36134.c: New test.
Added:
trunk/gcc/testsuite/gcc.target/m68k/pr36134.c
Modified:
trunk/gcc/ChangeLog
trunk/gcc/config/m68k/m68k.md
trunk/gcc/testsuite/ChangeLog
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36134
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug target/36134] GCC creates suboptimal ASM : usage of ADDA.L where LEA could be used
2008-05-05 13:51 [Bug c/36134] New: GCC creates suboptimal ASM : usage of ADDA.L where LEA could be used gunnar at greyhound-data dot com
` (6 preceding siblings ...)
2008-11-14 10:51 ` ams at gcc dot gnu dot org
@ 2008-11-14 10:55 ` ams at gcc dot gnu dot org
7 siblings, 0 replies; 9+ messages in thread
From: ams at gcc dot gnu dot org @ 2008-11-14 10:55 UTC (permalink / raw)
To: gcc-bugs
------- Comment #8 from ams at gcc dot gnu dot org 2008-11-14 10:53 -------
The patch posted here has been accepted and committed:
http://gcc.gnu.org/ml/gcc-patches/2008-11/msg00581.html
This should resolve this issue.
Andrew
--
ams at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |ams at gcc dot gnu dot org
Status|UNCONFIRMED |RESOLVED
Resolution| |FIXED
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36134
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2008-11-14 10:55 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-05-05 13:51 [Bug c/36134] New: GCC creates suboptimal ASM : usage of ADDA.L where LEA could be used gunnar at greyhound-data dot com
2008-05-07 19:34 ` [Bug target/36134] " rguenth at gcc dot gnu dot org
2008-05-28 16:20 ` gunnar at greyhound-data dot com
2008-05-29 12:51 ` gunnar at greyhound-data dot com
2008-06-02 22:37 ` schwab at suse dot de
2008-06-10 15:24 ` gunnar at greyhound-data dot com
2008-06-12 14:27 ` gunnar at greyhound-data dot com
2008-11-14 10:51 ` ams at gcc dot gnu dot org
2008-11-14 10:55 ` ams at gcc dot gnu dot 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).