Bug 16185 - ICE: in spill_failure, at reload1.c:1892, global registers and long long
Summary: ICE: in spill_failure, at reload1.c:1892, global registers and long long
Status: RESOLVED WORKSFORME
Alias: None
Product: gcc
Classification: Unclassified
Component: target (show other bugs)
Version: 3.3.3
: P2 minor
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords: ice-on-valid-code, ra
: 21469 22080 24292 27431 27967 31753 35135 (view as bug list)
Depends on:
Blocks:
 
Reported: 2004-06-24 21:24 UTC by Herton Ronaldo Krzesinski
Modified: 2009-09-17 12:13 UTC (History)
11 users (show)

See Also:
Host:
Target: i*86-*-*
Build:
Known to work:
Known to fail: 2.95 2.95.3 3.3.3 3.3.4 3.4.0 3.4.1 4.0.0 4.1.0
Last reconfirmed: 2008-09-14 04:32:13


Attachments
preprocessed file (16.15 KB, application/x-bzip2)
2004-06-25 01:54 UTC, Herton Ronaldo Krzesinski
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Herton Ronaldo Krzesinski 2004-06-24 21:24:04 UTC
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 Herton Ronaldo Krzesinski 2004-06-24 21:24:56 UTC
[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 Herton Ronaldo Krzesinski 2004-06-24 21:29:34 UTC
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 Falk Hueffner 2004-06-24 21:31:55 UTC
Please attach the preprocessed source obtained by adding -save-temps.
Comment 4 Herton Ronaldo Krzesinski 2004-06-25 01:54:23 UTC
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
Comment 5 Serge Belyshev 2004-06-26 17:12:08 UTC
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 Andrew Pinski 2004-12-27 03:32:05 UTC
x86 is known to be register stared and global registers just makes it worse because they make the 
registers fixed.
Comment 7 Serge Belyshev 2005-01-11 16:18:25 UTC
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 Serge Belyshev 2005-05-09 20:28:04 UTC
*** Bug 21469 has been marked as a duplicate of this bug. ***
Comment 9 Serge Belyshev 2005-06-15 17:28:34 UTC
*** Bug 22080 has been marked as a duplicate of this bug. ***
Comment 10 Steven Bosscher 2005-06-26 12:26:20 UTC
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 Andrew Pinski 2005-10-10 00:22:41 UTC
*** Bug 24292 has been marked as a duplicate of this bug. ***
Comment 12 Ranjit Mathew 2006-02-24 07:51:28 UTC
(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 Andrew Pinski 2006-05-04 17:42:52 UTC
*** Bug 27431 has been marked as a duplicate of this bug. ***
Comment 14 Andrew Pinski 2006-06-08 23:05:10 UTC
*** Bug 27967 has been marked as a duplicate of this bug. ***
Comment 15 Serge Belyshev 2007-05-27 19:51:34 UTC
*** Bug 31753 has been marked as a duplicate of this bug. ***
Comment 16 Uroš Bizjak 2009-03-12 17:48:40 UTC
*** Bug 35135 has been marked as a duplicate of this bug. ***
Comment 17 Uroš Bizjak 2009-09-17 12:13:28 UTC
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