Bug List: (This bug is not in your last search results)   Show last search results      Search page      Enter new bug
Bug#: 16185
Product:  
Component:  
Status: RESOLVED
Resolution: WORKSFORME
Assigned To: Not yet assigned to anyone <unassigned@gcc.gnu.org>
Host:
Reported against  
Priority:  
Severity:  
Target Milestone:  
 
 
Target:
Reporter: Herton Ronaldo Krzesinski <herton@brturbo.com>
Add CC:
CC:
Remove selected CCs
Build:
URL:
Summary:
Keywords:
Known to work:
Known to fail:

Attachment Description Type Created Size Actions
helper.i.bz2 preprocessed file application/x-bzip2 2004-06-25 01:54 16.15 KB Edit
Create a New Attachment (proposed patch, testcase, etc.) View All

Bug 16185 depends on: Show dependency tree
Show dependency graph
Bug 16185 blocks:

Additional Comments:






View Bug Activity   |   Format For Printing   |   Clone This Bug


Description:   Last confirmed: 2008-09-14 04:32 Opened: 2004-06-24 21:24
When compiling qemu 0.5.5 (http://fabrice.bellard.free.fr/qemu/), the following
error occurs:

gcc -O2 -frename-registers -fomit-frame-pointer -march=i686 -fomit-frame-pointer
-I. -I/tmp/qemu/BUILD/qemu-0.5.5/target-i386 -I/tmp/qemu/BUILD/qemu-0.5.5
-D_GNU_SOURCE -c -o translate.o /tmp/qemu/BUILD/qemu-0.5.5/target-i386/translate.c
gcc -O2 -frename-registers -fomit-frame-pointer -march=i686 -I.
-I/tmp/qemu/BUILD/qemu-0.5.5/target-i386 -I/tmp/qemu/BUILD/qemu-0.5.5
-D_GNU_SOURCE -c -o helper.o /tmp/qemu/BUILD/qemu-0.5.5/target-i386/helper.c
In file included from /tmp/qemu/BUILD/qemu-0.5.5/target-i386/helper.c:2492:
/tmp/qemu/BUILD/qemu-0.5.5/softmmu_template.h: In function `slow_ldq_mmu':
/tmp/qemu/BUILD/qemu-0.5.5/softmmu_template.h:179: error: unable to find a
register to spill in class `GENERAL_REGS'
/tmp/qemu/BUILD/qemu-0.5.5/softmmu_template.h:179: error: this is the insn:
(insn:HI 167 164 168 6 0x407a0ec8 (parallel [
            (set (reg:DI 112)
                (lshiftrt:DI (reg/v:DI 63)
                    (subreg:QI (reg:SI 111) 0)))
            (clobber (scratch:SI))
            (clobber (reg:CC 17 flags))
        ]) 320 {lshrdi3_1} (insn_list 136 (insn_list 164 (nil)))
    (expr_list:REG_DEAD (reg/v:DI 63)
        (expr_list:REG_UNUSED (scratch:SI)
            (expr_list:REG_UNUSED (reg:CC 17 flags)
                (nil)))))
/tmp/qemu/BUILD/qemu-0.5.5/softmmu_template.h:179: confused by earlier errors,
bailing out
make[1]: ** [helper.o] Erro 1
make[1]: Leaving directory `/tmp/qemu/BUILD/qemu-0.5.5/i386'
make: ** [all] Erro 1
erro: Status de saída ruim em /tmp/qemu/BUILDROOT/rpm-tmp.6894 (%build)

As the log shows, I used the flags "-O2 -frename-registers -fomit-frame-pointer
-march=i686". Interestingly, the problem above doesn't occurs when I specify
-march={i386,i486,i586}, I only have an error when using i686/athlon/pentium4 (I
didn't test all combinations, probably other options greater than i686 are also
affected). To compile qemu with different flags, you must edit Makefile and
Makefile.target from qemu sources, using for example sed:

sed -i "s/CFLAGS=.*/CFLAGS=-O2 -frename-registers -fomit-frame-pointer
-march=i686/" Makefile{,.target}

------- Comment #1 From Herton Ronaldo Krzesinski 2004-06-24 21:24 -------
[herton@moen herton]$ gcc -v
Reading specs from /usr/lib/gcc-lib/i386-conectiva-linux/3.3.3/specs
Configured with: ../configure --prefix=/usr --bindir=/usr/bin --libdir=/usr/lib
--mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share
--enable-shared --disable-checking --enable-long-long --enable-__cxa_atexit
--enable-threads=posix --disable-libunwind-exceptions --enable-libgcj
--enable-languages=c,c++,f77,objc,java --with-system-zlib
--host=i386-conectiva-linux --target=i386-conectiva-linux
--with-gxx_include_dir=/usr/include/c++/3.3.3
Thread model: posix
gcc version 3.3.3 (release)

------- Comment #2 From Herton Ronaldo Krzesinski 2004-06-24 21:29 -------
Ops, I forgot to include the steps to compile and reproduce the error:

1) Edit Makefile and Makefile.target with provided CFLAGS (for example using sed
as already showed).
2) Run configure: ./configure --prefix=/usr
3) make -j1

------- Comment #3 From Falk Hueffner 2004-06-24 21:31 -------
Please attach the preprocessed source obtained by adding -save-temps.

------- Comment #4 From Herton Ronaldo Krzesinski 2004-06-25 01:54 -------
Created an attachment (id=6625) [edit]
preprocessed file

Here goes, console output, compressed .i file attached:

gcc -v -save-temps -O2 -frename-registers -fomit-frame-pointer -march=pentium4
-I. -I/tmp/qemu/BUILD/qemu-0.5.5/target-i386
-I/tmp/qemu/BUILD/qemu-0.5.5 -D_GNU_SOURCE -c -o helper.o
/tmp/qemu/BUILD/qemu-0.5.5/target-i386/helper.c
Reading specs from /usr/lib/gcc-lib/i386-conectiva-linux/3.3.3/specs
Configured with: ../configure --prefix=/usr --bindir=/usr/bin --libdir=/usr/lib
--mandir=/usr/share/man --infodir=/usr/share
/info --datadir=/usr/share --enable-shared --disable-checking
--enable-long-long --enable-__cxa_atexit --enable-threads=posi
x --disable-libunwind-exceptions --enable-libgcj
--enable-languages=c,c++,f77,objc,java --with-system-zlib --host=i386-conec
tiva-linux --target=i386-conectiva-linux
--with-gxx_include_dir=/usr/include/c++/3.3.3
Thread model: posix
gcc version 3.3.3 (release)
 /usr/lib/gcc-lib/i386-conectiva-linux/3.3.3/cc1 -E -quiet -v -I.
-I/tmp/qemu/BUILD/qemu-0.5.5/target-i386 -I/tmp/qemu/BUILD
/qemu-0.5.5 -D__GNUC__=3 -D__GNUC_MINOR__=3 -D__GNUC_PATCHLEVEL__=3
-D_GNU_SOURCE /tmp/qemu/BUILD/qemu-0.5.5/target-i386/hel
per.c -march=pentium4 -frename-registers -fomit-frame-pointer -O2 helper.i
ignoring nonexistent directory "/usr/i386-conectiva-linux/include"
#include "..." search starts here:
#include <...> search starts here:
 .
 /tmp/qemu/BUILD/qemu-0.5.5/target-i386
 /tmp/qemu/BUILD/qemu-0.5.5
 /usr/local/include
 /usr/lib/gcc-lib/i386-conectiva-linux/3.3.3/include
 /usr/include
End of search list.
 /usr/lib/gcc-lib/i386-conectiva-linux/3.3.3/cc1 -fpreprocessed helper.i -quiet
-dumpbase helper.c -march=pentium4 -auxbase-
strip helper.o -O2 -version -frename-registers -fomit-frame-pointer -o helper.s

GNU C version 3.3.3 (release) (i386-conectiva-linux)
	compiled by GNU C version 3.3.3 (release).
GGC heuristics: --param ggc-min-expand=31 --param ggc-min-heapsize=4096
In file included from /tmp/qemu/BUILD/qemu-0.5.5/target-i386/helper.c:2492:
/tmp/qemu/BUILD/qemu-0.5.5/softmmu_template.h: In function `slow_ldq_mmu':
/tmp/qemu/BUILD/qemu-0.5.5/softmmu_template.h:179: error: unable to find a
register to spill in class `GENERAL_REGS'
/tmp/qemu/BUILD/qemu-0.5.5/softmmu_template.h:179: error: this is the insn:
(insn:HI 167 164 168 6 0x4071f3f4 (parallel [
	    (set (reg:DI 112)
		(lshiftrt:DI (reg/v:DI 63)
		    (subreg:QI (reg:SI 111) 0)))
	    (clobber (scratch:SI))
	    (clobber (reg:CC 17 flags))
	]) 320 {lshrdi3_1} (insn_list 136 (insn_list 164 (nil)))
    (expr_list:REG_DEAD (reg/v:DI 63)
	(expr_list:REG_UNUSED (scratch:SI)
	    (expr_list:REG_UNUSED (reg:CC 17 flags)
		(nil)))))
/tmp/qemu/BUILD/qemu-0.5.5/softmmu_template.h:179: confused by earlier errors,
bailing out
make[1]: ** [helper.o] Erro 1
make[1]: Leaving directory `/tmp/qemu/BUILD/qemu-0.5.5/i386'
make: ** [all] Erro 1

------- Comment #5 From Serge Belyshev 2004-06-26 17:12 -------
small testcase:
-------------------------------------------------------------------------------
register T0 asm ("ebx");
register T1 asm ("esi");
register T2 asm ("edi");

void foo (int a, int b, long long c)
{
	*(long long *) (a + b) = c;
}
-------------------------------------------------------------------------------

Confirmed, a regression from 2.6.3 and 2.7.2.

------- Comment #6 From Andrew Pinski 2004-12-27 03:32 -------
x86 is known to be register stared and global registers just makes it worse
because they make the 
registers fixed.

------- Comment #7 From Serge Belyshev 2005-01-11 16:18 -------
Caused by this patch:

Fri May 15 21:40:06 1998  John Wehle  (john@feith.com)

	* i386.md (movdi-1, movdi): Rewrite based on SI move patterns.

------- Comment #8 From Serge Belyshev 2005-05-09 20:28 -------
*** Bug 21469 has been marked as a duplicate of this bug. ***

------- Comment #9 From Serge Belyshev 2005-06-15 17:28 -------
*** Bug 22080 has been marked as a duplicate of this bug. ***

------- Comment #10 From Steven Bosscher 2005-06-26 12:26 -------
Taking three or more registers as in the test cases from comment #5 and 
from Bug 21469, or using regparam, is just asking for trouble on a target 
with only six registers available, total.  While this is a regression, we 
also have cases that didn't compile with old compilers and now do.  It is 
just a matter of luck if you're going to fix registers -- even the order 
in which the statements are expanded to RTL can matter for the register 
pressure, and in this case y'all are so unlucky to need a larger number of 
registers than what you've left available to the compiler. 
 
I believe this bug should be closed as SUSPEND unless test cases exist 
that use neither regparam nor global register variables. 
 

------- Comment #11 From Andrew Pinski 2005-10-10 00:22 -------
*** Bug 24292 has been marked as a duplicate of this bug. ***

------- Comment #12 From Ranjit Mathew 2006-02-24 07:51 -------
(In reply to comment #5)
> small testcase:

This particular testcase doesn't fail for me anymore on mainline
as of 2006-02-24. However, QEMU 0.8.0 still doesn't build with
this compiler (you'll have to configure with --disable-gcc-check).

FWIW, I get:
--------------------------- 8< ---------------------------
/home/ranmath/src/gcc/build/gcc/xgcc -B/home/ranmath/src/gcc/build/gcc/ -Wall
-O
2 -g -fno-strict-aliasing -fomit-frame-pointer -mpreferred-stack-boundary=2
-fal
ign-functions=0 -fno-gcse -fno-reorder-blocks -fno-optimize-sibling-calls -I.
-I
/home/ranmath/tmp/qemu-0.8.0/target-i386 -I/home/ranmath/tmp/qemu-0.8.0
-I/home/
ranmath/tmp/qemu-0.8.0/linux-user
-I/home/ranmath/tmp/qemu-0.8.0/linux-user/i386
 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
-I/home/ranmath/tmp/qe
mu-0.8.0/fpu -DHAS_AUDIO -I/home/ranmath/tmp/qemu-0.8.0/slirp -c -o op.o
/home/r
anmath/tmp/qemu-0.8.0/target-i386/op.c
/home/ranmath/tmp/qemu-0.8.0/target-i386/ops_sse.h: In function
'op_pshufw_mmx':
/home/ranmath/tmp/qemu-0.8.0/target-i386/ops_sse.h:574: error: unable to find a
register to spill in class 'GENERAL_REGS'
/home/ranmath/tmp/qemu-0.8.0/target-i386/ops_sse.h:574: error: this is the
insn:
(insn:HI 17 16 18 2 /home/ranmath/tmp/qemu-0.8.0/target-i386/ops_sse.h:569 (set
(strict_low_part (subreg:HI (reg/v:DI 63 [ r ]) 0))
        (mem/s/j:HI (plus:SI (mult:SI (reg:SI 64)
                    (const_int 2 [0x2]))
                (reg/v/f:SI 59 [ s ])) [0 <variable>._w S2 A16])) 40
{*movstrict
hi_1} (insn_list:REG_DEP_TRUE 49 (insn_list:REG_DEP_TRUE 12
(insn_list:REG_DEP_T
RUE 16 (nil))))
    (expr_list:REG_DEAD (reg:SI 64)
        (nil)))
/home/ranmath/tmp/qemu-0.8.0/target-i386/ops_sse.h:574: confused by earlier
erro
rs, bailing out
make[1]: *** [op.o] Error 1
make[1]: Leaving directory `/home/ranmath/tmp/qemu-0.8.0/i386-user'
make: *** [all] Error 1
--------------------------- 8< ---------------------------

I am at SVN revision 111414.

------- Comment #13 From Andrew Pinski 2006-05-04 17:42 -------
*** Bug 27431 has been marked as a duplicate of this bug. ***

------- Comment #14 From Andrew Pinski 2006-06-08 23:05 -------
*** Bug 27967 has been marked as a duplicate of this bug. ***

------- Comment #15 From Serge Belyshev 2007-05-27 19:51 -------
*** Bug 31753 has been marked as a duplicate of this bug. ***

------- Comment #16 From Uros Bizjak 2009-03-12 17:48 -------
*** Bug 35135 has been marked as a duplicate of this bug. ***

------- Comment #17 From Uros Bizjak 2009-09-17 12:13 -------
A recent patch in mainline should fix this problem [1]. The testcase works OK
for 4.3.4, 4.4.2 and 4.5.0. Please re-test with current mainline SVN and open a
new PR if the test still fails.

[1] http://gcc.gnu.org/ml/gcc-patches/2009-09/msg00003.html

Bug List: (This bug is not in your last search results)   Show last search results      Search page      Enter new bug