public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug rtl-optimization/21182] New: gcc can use registers but uses stack instead
@ 2005-04-23 22:30 vda at port dot imtp dot ilyichevsk dot odessa dot ua
2005-04-23 22:32 ` [Bug rtl-optimization/21182] " vda at port dot imtp dot ilyichevsk dot odessa dot ua
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: vda at port dot imtp dot ilyichevsk dot odessa dot ua @ 2005-04-23 22:30 UTC (permalink / raw)
To: gcc-bugs
in this long but relatively simple function gcc
can store all frequently used local variables in registers,
but it fails to do so.
gcc can be forced to do this optimization by asm("reg") modifiers.
Resulting code is ~1k smaller.
# gcc -v
Reading specs from
/.share/usr/app/gcc-3.4.3/bin/../lib/gcc/i386-pc-linux-gnu/3.4.3/specs
Configured with: ../gcc-3.4.3/configure --prefix=/usr/app/gcc-3.4.3
--exec-prefix=/usr/app/gcc-3.4.3 --bindir=/usr/bin --sbindir=/usr/sbin
--libexecdir=/usr/app/gcc-3.4.3/libexec --datadir=/usr/app/gcc-3.4.3/share
--sysconfdir=/etc --sharedstatedir=/usr/app/gcc-3.4.3/var/com
--localstatedir=/usr/app/gcc-3.4.3/var --libdir=/usr/lib
--includedir=/usr/include --infodir=/usr/info --mandir=/usr/man
--with-slibdir=/usr/app/gcc-3.4.3/lib --with-local-prefix=/usr/local
--with-gxx-include-dir=/usr/app/gcc-3.4.3/include/g++-v3
--enable-languages=c,c++ --with-system-zlib --disable-nls --enable-threads=posix
i386-pc-linux-gnu
Thread model: posix
gcc version 3.4.3
--
Summary: gcc can use registers but uses stack instead
Product: gcc
Version: 3.4.3
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: rtl-optimization
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: vda at port dot imtp dot ilyichevsk dot odessa dot ua
CC: gcc-bugs at gcc dot gnu dot org
GCC build triplet: i386-pc-linux-gnu
GCC host triplet: i386-pc-linux-gnu
GCC target triplet: i386-pc-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21182
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug rtl-optimization/21182] gcc can use registers but uses stack instead
2005-04-23 22:30 [Bug rtl-optimization/21182] New: gcc can use registers but uses stack instead vda at port dot imtp dot ilyichevsk dot odessa dot ua
@ 2005-04-23 22:32 ` vda at port dot imtp dot ilyichevsk dot odessa dot ua
2005-04-23 22:39 ` pinskia at gcc dot gnu dot org
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: vda at port dot imtp dot ilyichevsk dot odessa dot ua @ 2005-04-23 22:32 UTC (permalink / raw)
To: gcc-bugs
------- Additional Comments From vda at port dot imtp dot ilyichevsk dot odessa dot ua 2005-04-23 22:32 -------
Created an attachment (id=8719)
--> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=8719&action=view)
testcase. change #if 0 into #if 1 and compare resulting asm
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21182
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug rtl-optimization/21182] gcc can use registers but uses stack instead
2005-04-23 22:30 [Bug rtl-optimization/21182] New: gcc can use registers but uses stack instead vda at port dot imtp dot ilyichevsk dot odessa dot ua
2005-04-23 22:32 ` [Bug rtl-optimization/21182] " vda at port dot imtp dot ilyichevsk dot odessa dot ua
@ 2005-04-23 22:39 ` pinskia at gcc dot gnu dot org
2005-04-23 22:49 ` vda at port dot imtp dot ilyichevsk dot odessa dot ua
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: pinskia at gcc dot gnu dot org @ 2005-04-23 22:39 UTC (permalink / raw)
To: gcc-bugs
------- Additional Comments From pinskia at gcc dot gnu dot org 2005-04-23 22:39 -------
Hmm, on the mainline, we get for wc -l:
1613 t.s
1459 t1.s
t1 is the normal #if 0.
Note I used "-O2 -fomit-frame-pointer".
--
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |missed-optimization, ra
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21182
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug rtl-optimization/21182] gcc can use registers but uses stack instead
2005-04-23 22:30 [Bug rtl-optimization/21182] New: gcc can use registers but uses stack instead vda at port dot imtp dot ilyichevsk dot odessa dot ua
2005-04-23 22:32 ` [Bug rtl-optimization/21182] " vda at port dot imtp dot ilyichevsk dot odessa dot ua
2005-04-23 22:39 ` pinskia at gcc dot gnu dot org
@ 2005-04-23 22:49 ` vda at port dot imtp dot ilyichevsk dot odessa dot ua
2005-04-23 22:54 ` vda at port dot imtp dot ilyichevsk dot odessa dot ua
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: vda at port dot imtp dot ilyichevsk dot odessa dot ua @ 2005-04-23 22:49 UTC (permalink / raw)
To: gcc-bugs
------- Additional Comments From vda at port dot imtp dot ilyichevsk dot odessa dot ua 2005-04-23 22:49 -------
Aha!
I found out that gcc will use registers with -O3, but not with -O2.
# gcc -O3 serpent.c -S -o serpent-O3.s
# gcc -O2 serpent.c -S -o serpent-O2.s
# ls -l
-rw-r--r-- 1 root root 27975 Apr 24 01:47 serpent-O2.s
-rw-r--r-- 1 root root 21566 Apr 24 01:47 serpent-O3.s
# wc -l serpent-O2.s serpent-O3.s
1558 serpent-O2.s
1265 serpent-O3.s
2823 total
I don't have 4.0.0 here yet...
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21182
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug rtl-optimization/21182] gcc can use registers but uses stack instead
2005-04-23 22:30 [Bug rtl-optimization/21182] New: gcc can use registers but uses stack instead vda at port dot imtp dot ilyichevsk dot odessa dot ua
` (2 preceding siblings ...)
2005-04-23 22:49 ` vda at port dot imtp dot ilyichevsk dot odessa dot ua
@ 2005-04-23 22:54 ` vda at port dot imtp dot ilyichevsk dot odessa dot ua
2005-04-24 13:05 ` vda at port dot imtp dot ilyichevsk dot odessa dot ua
2005-05-07 15:24 ` steven at gcc dot gnu dot org
5 siblings, 0 replies; 7+ messages in thread
From: vda at port dot imtp dot ilyichevsk dot odessa dot ua @ 2005-04-23 22:54 UTC (permalink / raw)
To: gcc-bugs
------- Additional Comments From vda at port dot imtp dot ilyichevsk dot odessa dot ua 2005-04-23 22:54 -------
These are -O2 and -O3 code comparison.
-O3 code have all modified variables in registers
and thus is smaller and most likely faster.
serpent_encrypt:
pushl %ebp
movl %esp, %ebp
pushl %edi
pushl %esi
pushl %ebx
subl $256, %esp
movl 8(%ebp), %edx
movl 16(%ebp), %eax
movl 12(%eax), %ebx
movl 12(%edx), %ecx
xorl %ebx, %ecx
movl (%edx), %edi
movl %ecx, -20(%ebp)
xorl (%eax), %edi
movl 8(%edx), %ecx
movl 4(%edx), %ebx
movl -20(%ebp), %esi
xorl 8(%eax), %ecx
orl %edi, -20(%ebp)
xorl 4(%eax), %ebx
xorl %ebx, -20(%ebp)
xorl %esi, %edi
xorl %ecx, %esi
andl %edi, %ebx
xorl %edi, %ecx
notl %esi
xorl -20(%ebp), %edi
movl %edx, -16(%ebp)
serpent_encrypt:
pushl %ebp
movl %esp, %ebp
pushl %edi
pushl %esi
pushl %ebx
pushl %edx
movl 8(%ebp), %edi
movl 16(%ebp), %ecx
movl 12(%edi), %eax
xorl 12(%ecx), %eax
movl 8(%edi), %esi
movl 4(%edi), %edx
movl (%edi), %ebx
xorl 8(%ecx), %esi
xorl 4(%ecx), %edx
xorl (%ecx), %ebx
movl %eax, %ecx
orl %ebx, %ecx
xorl %eax, %ebx
xorl %esi, %eax
xorl %edx, %ecx
notl %eax
andl %ebx, %edx
xorl %eax, %edx
xorl %ebx, %esi
xorl %ecx, %ebx
orl %ebx, %eax
xorl %esi, %ebx
andl %edx, %esi
xorl %esi, %eax
notl %edx
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21182
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug rtl-optimization/21182] gcc can use registers but uses stack instead
2005-04-23 22:30 [Bug rtl-optimization/21182] New: gcc can use registers but uses stack instead vda at port dot imtp dot ilyichevsk dot odessa dot ua
` (3 preceding siblings ...)
2005-04-23 22:54 ` vda at port dot imtp dot ilyichevsk dot odessa dot ua
@ 2005-04-24 13:05 ` vda at port dot imtp dot ilyichevsk dot odessa dot ua
2005-05-07 15:24 ` steven at gcc dot gnu dot org
5 siblings, 0 replies; 7+ messages in thread
From: vda at port dot imtp dot ilyichevsk dot odessa dot ua @ 2005-04-24 13:05 UTC (permalink / raw)
To: gcc-bugs
------- Additional Comments From vda at port dot imtp dot ilyichevsk dot odessa dot ua 2005-04-24 13:05 -------
With 4.0.0: gcc -O2 gives the same result as gcc -O3,
which is better than gcc 3.4.3 -O2 but worse than 3.4.3 -O3.
For example:
movl %edx, -20(%ebp)
orl %ecx, %edi
movl %ebx, %esi
xorl %ecx, %esi
andl %eax, %ebx
xorl %edi, %ebx
movl %eax, %ecx
notl %ecx
xorl %ebx, %ecx
orl %edi, %eax
xorl %eax, %esi
rorl $19, %esi
rorl $29, -20(%ebp)
xorl %esi, %ebx
xorl -20(%ebp), %ecx
xorl -20(%ebp), %ebx
rorl $31, %ebx
leal 0(,%esi,8), %edx
1) Why %edx was stored in -20(%ebp), there is no %edx usage
in the following insns. %edx value could stay in register
and we can continue to work on its value in register.
2) rorl $31, %ebx == roll $1, %ebx, but 1 bit roll insn is
smaller.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21182
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug rtl-optimization/21182] gcc can use registers but uses stack instead
2005-04-23 22:30 [Bug rtl-optimization/21182] New: gcc can use registers but uses stack instead vda at port dot imtp dot ilyichevsk dot odessa dot ua
` (4 preceding siblings ...)
2005-04-24 13:05 ` vda at port dot imtp dot ilyichevsk dot odessa dot ua
@ 2005-05-07 15:24 ` steven at gcc dot gnu dot org
5 siblings, 0 replies; 7+ messages in thread
From: steven at gcc dot gnu dot org @ 2005-05-07 15:24 UTC (permalink / raw)
To: gcc-bugs
--
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Ever Confirmed| |1
Last reconfirmed|0000-00-00 00:00:00 |2005-05-07 15:23:12
date| |
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21182
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2005-05-07 15:24 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-04-23 22:30 [Bug rtl-optimization/21182] New: gcc can use registers but uses stack instead vda at port dot imtp dot ilyichevsk dot odessa dot ua
2005-04-23 22:32 ` [Bug rtl-optimization/21182] " vda at port dot imtp dot ilyichevsk dot odessa dot ua
2005-04-23 22:39 ` pinskia at gcc dot gnu dot org
2005-04-23 22:49 ` vda at port dot imtp dot ilyichevsk dot odessa dot ua
2005-04-23 22:54 ` vda at port dot imtp dot ilyichevsk dot odessa dot ua
2005-04-24 13:05 ` vda at port dot imtp dot ilyichevsk dot odessa dot ua
2005-05-07 15:24 ` steven 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).