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}
[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)
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
Please attach the preprocessed source obtained by adding -save-temps.
Created attachment 6625 [details] 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
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.
x86 is known to be register stared and global registers just makes it worse because they make the registers fixed.
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.
*** Bug 21469 has been marked as a duplicate of this bug. ***
*** Bug 22080 has been marked as a duplicate of this bug. ***
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.
*** Bug 24292 has been marked as a duplicate of this bug. ***
(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.
*** Bug 27431 has been marked as a duplicate of this bug. ***
*** Bug 27967 has been marked as a duplicate of this bug. ***
*** Bug 31753 has been marked as a duplicate of this bug. ***
*** Bug 35135 has been marked as a duplicate of this bug. ***
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