public inbox for gcc-prs@sourceware.org
help / color / mirror / Atom feed
* Re: target/7091: ice with gcc 3.1 when optimizing for k6
@ 2002-10-03 10:17 hubicka
  0 siblings, 0 replies; 2+ messages in thread
From: hubicka @ 2002-10-03 10:17 UTC (permalink / raw)
  To: gcc-bugs, gcc-prs, nobody, peter

Synopsis: ice with gcc 3.1 when optimizing for k6

State-Changed-From-To: open->closed
State-Changed-By: hubicka
State-Changed-When: Thu Oct  3 10:17:44 2002
State-Changed-Why:
    no longer reproduce in 3.2 branch

http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=7091


^ permalink raw reply	[flat|nested] 2+ messages in thread

* target/7091: ice with gcc 3.1 when optimizing for k6
@ 2002-06-20 18:21 peter
  0 siblings, 0 replies; 2+ messages in thread
From: peter @ 2002-06-20 18:21 UTC (permalink / raw)
  To: gcc-gnats, debian-gcc


>Number:         7091
>Category:       target
>Synopsis:       ice with gcc 3.1 when optimizing for k6
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          ice-on-legal-code
>Submitter-Id:   net
>Arrival-Date:   Thu Jun 20 18:06:00 PDT 2002
>Closed-Date:
>Last-Modified:
>Originator:     Peter Cordes
>Release:        3.1.1 20020606 (Debian prerelease) (Debian testing/unstable)
>Organization:
>Environment:

 AMD k6-2 CPU.  Also reproducable on an Intel P200MMX (still only when
optimizing for k6).

Debian Release: 3.0
Architecture: i386
Kernel: Linux yeti 2.4.18 #1 Thu Apr 4 17:15:43 AST 2002 i586
Locale: LANG=C, LC_CTYPE=C

 Debian GNU/Linux, using gcc-3.1 packages, version 3.1.1-0pre2.
Versions of packages gcc-3.1 depends on:
ii  binutils                   2.12.90.0.9-1 The GNU assembler, linker and bina
ii  cpp-3.1                    1:3.1.1-0pre2 The GNU C preprocessor.
ii  gcc-3.1-base               1:3.1.1-0pre2 The GNU Compiler Collection (base
ii  libc6                      2.2.5-6       GNU C Library: Shared libraries an
ii  libgcc1                    1:3.1.1-0pre2 GCC support library.

configured with: /mnt/data/gcc-3.1/gcc-3.1-3.1.1ds1/src/configure -v --enable-languages=c,c++,java,f77,proto,objc,ada --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-gxx-include-dir=/usr/include/g++-v3-3.1 --enable-shared --with-system-zlib --enable-long-long --enable-nls --without-included-gettext --enable-clocale=gnu --enable-threads=posix --enable-java-gc=boehm --enable-objc-gc i386-linux

>Description:

 In case it matters, this code is from alsa 0.9.0rc1-2,
pci/trident/trident_memory.c.  The preprocessed source was 15000 lines, but
only 100 of them are needed to trigger the bug.

$ gcc-3.1 gcc_bug.c -c -O6 -march=k6 
gcc_bug.c: In function snd_trident_synth_bzero':
gcc_bug.c:106: unrecognizable insn:
(insn 238 231 240 (set (reg:SI 99)
        (ashift:SI (plus:SI (reg/v:SI 63)
                (const_int -1 [0xffffffff]))
            (const_int 12 [0xc]))) -1 (insn_list 28 (nil))
   (nil))
gcc_bug.c:106: Internal compiler error in extract_insn, at recog.c:2132



>How-To-Repeat:

 Compile this code with -O2 -mcpu=k6.  -O1 doesn't do it. -mcpu=anything else 
doesn't do it either.  (-O3 or higher ices too.)

-------------------------------- gcc-bug.c
typedef unsigned int size_t;

static inline void * __memset_generic(void * s, char c,size_t count)
{
int d0, d1;
__asm__ __volatile__(
        "rep\n\t"
        "stosb"
        : "=&c" (d0), "=&D" (d1)
        :"a" (c),"1" (s),"0" (count)
        :"memory");
return s;
}

static inline void * __constant_c_and_count_memset(void * s, unsigned long pattern, size_t count)
{
        switch (count) {
                case 0:
                        return s;
                case 1:
                        *(unsigned char *)s = pattern;
                        return s;
                case 2:
                        *(unsigned short *)s = pattern;
                        return s;
                case 3:
                        *(unsigned short *)s = pattern;
                        *(2+(unsigned char *)s) = pattern;
                        return s;
                case 4:
                        *(unsigned long *)s = pattern;
                        return s;
        }
	  {
		  int d0, d1;
		  switch (count % 4) {
		   case 0: __asm__ __volatile__( "rep ; stosl" "" : "=&c" (d0), "=&D" (d1) : "a" (pattern),"0" (count/4),"1" ((long) s) : "memory"); return s;
		   case 1: __asm__ __volatile__( "rep ; stosl" "\n\tstosb" : "=&c" (d0), "=&D" (d1) : "a" (pattern),"0" (count/4),"1" ((long) s) : "memory"); return s;
		   case 2: __asm__ __volatile__( "rep ; stosl" "\n\tstosw" : "=&c" (d0), "=&D" (d1) : "a" (pattern),"0" (count/4),"1" ((long) s) : "memory"); return s;
		   default: __asm__ __volatile__( "rep ; stosl" "\n\tstosw\n\tstosb" : "=&c" (d0), "=&D" (d1) : "a" (pattern),"0" (count/4),"1" ((long) s) : "memory"); return s;
		  }
	  }
}

static inline void * __constant_c_memset(void * s, unsigned long c, size_t count)
{
int d0, d1;
__asm__ __volatile__(
        "rep ; stosl\n\t"
        "testb $2,%b3\n\t"
        "je 1f\n\t"
        "stosw\n"
        "1:\ttestb $1,%b3\n\t"
        "je 2f\n\t"
        "stosb\n"
        "2:"
        : "=&c" (d0), "=&D" (d1)
        :"a" (c), "q" (count), "0" (count/4), "1" ((long) s)
        :"memory");
return (s);
}

typedef struct snd_util_memblk snd_util_memblk_t;
struct snd_util_memblk {
        int size;
        int offset;
};

typedef struct {
        unsigned long * shadow_entries;
} snd_trident_tlb_t;

typedef struct _snd_trident trident_t;
struct _snd_trident {
        snd_trident_tlb_t tlb;
};

int snd_trident_synth_bzero(trident_t *trident, snd_util_memblk_t *blk, int offset, int size);

inline static void *offset_ptr(trident_t *trident, int offset)
{
        char *ptr;
        ptr = (void*)((trident)->tlb.shadow_entries[((offset) >> 12)]);
        ptr += offset % (1UL << 12);
        return (void*)ptr;
}

int snd_trident_synth_bzero(trident_t *trident, snd_util_memblk_t *blk, int offset, int size)
{
        int page, nextofs, end_offset, temp, temp1;

        offset += blk->offset;
        end_offset = offset + size;
        page = ((offset) >> 12) + 1;
        do {
                nextofs = ((page) << 12);
                temp = nextofs - offset;
                temp1 = end_offset - offset;
                if (temp1 < temp)
                        temp = temp1;
                (__builtin_constant_p(0) ? (__builtin_constant_p((temp)) ? __constant_c_and_count_memset(((offset_ptr(trident, offset))),((0x01010101UL*(unsigned char)(0))),((temp))) : __constant_c_memset(((offset_ptr(trident, offset))),((0x01010101UL*(unsigned char)(0))),((temp)))) : (__builtin_constant_p((temp)) ? __memset_generic((((offset_ptr(trident, offset)))),(((0))),(((temp)))) : __memset_generic(((offset_ptr(trident, offset))),((0)),((temp)))));
                offset = nextofs;
                page++;
        } while (offset < end_offset);
        return 0;
}
-----------------------------------------------

>Fix:
     gcc-3.0 doesn't ice on this code.  I don't know if it actually compiles
it correctly or not.   (Other alsa modules compiled with gcc-3.1 seemed to
make my kernel unstable, but that's nothing to do with this.)
>Release-Note:
>Audit-Trail:
>Unformatted:


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2002-10-03 17:17 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-10-03 10:17 target/7091: ice with gcc 3.1 when optimizing for k6 hubicka
  -- strict thread matches above, loose matches on Subject: below --
2002-06-20 18:21 peter

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).