public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c/27363]  New: ARM gcc 4.1 optimization bug
@ 2006-04-30  4:48 nh26223 at yahoo dot com dot cn
  2006-04-30  5:01 ` [Bug target/27363] " pinskia at gcc dot gnu dot org
                   ` (20 more replies)
  0 siblings, 21 replies; 22+ messages in thread
From: nh26223 at yahoo dot com dot cn @ 2006-04-30  4:48 UTC (permalink / raw)
  To: gcc-bugs

The kernel is 2.6.14. When I build ALSA subsystem. I use following commandline:

arm-iwmmxt-linux-gnueabi-gcc -Wp,-MD,sound/core/.pcm_native.o.d
-nostdinc -isystem
/usr/local/arm-iwmmxt-linux-gnueabi/bin/../lib/gcc/arm-iwmmxt-linux-gnueabi/4.1.0/include
-D__KERNEL__ -Iinclude  -include include/linux/autoconf.h
-mlittle-endian -gdwarf-2 -Wall -Wundef -Wstrict-prototypes
-Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding
-fno-omit-frame-pointer -fno-optimize-sibling-calls -gdwarf-2
-fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=aapcs-linux
-mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te
-mtune=xscale -Wa,-mcpu=xscale  -msoft-float -Uarm
-Wdeclaration-after-statement -Wno-pointer-sign   -gdwarf-2
-DKBUILD_BASENAME=pcm_native -DKBUILD_MODNAME=snd_pcm -Os -c -o
sound/core/pcm_native.o sound/core/pcm_native.c


And the function is like following (using
arm-iwmmxt-linux-gnueabi-objdump -d pcm_nativ.o):

0000211c <snd_mask_refine>:
   211c:       e1a0c00d        mov     ip, sp
   2120:       e92dd8f0        stmdb   sp!, {r4, r5, r6, r7, fp, ip, lr, pc}
   2124:       e24cb004        sub     fp, ip, #4      ; 0x4
   2128:       e24dd020        sub     sp, sp, #32     ; 0x20
   212c:       e5913000        ldr     r3, [r1]
   2130:       e51b502c        ldr     r5, [fp, #-44]
   2134:       e24b603c        sub     r6, fp, #60     ; 0x3c
   2138:       e1a0c000        mov     ip, r0
   213c:       e1a0e006        mov     lr, r6
   2140:       e1a04000        mov     r4, r0
   2144:       e0055003        and     r5, r5, r3
   2148:       e1a07001        mov     r7, r1
   214c:       e8bc000f        ldmia   ip!, {r0, r1, r2, r3}
   2150:       e8ae000f        stmia   lr!, {r0, r1, r2, r3}
   2154:       e89c000f        ldmia   ip, {r0, r1, r2, r3}
   2158:       e5845000        str     r5, [r4]
   215c:       e597c004        ldr     ip, [r7, #4]
   2160:       e3550000        cmp     r5, #0  ; 0x0
   2164:       e88e000f        stmia   lr, {r0, r1, r2, r3}
   2168:       e001300c        and     r3, r1, ip              /* r1 from
                                                                  2154:       
e89c000f        ldmia   ip, {r0, r1, r2, r3}
                                                                  Using the
wrong value.
                                                                  The r1 from
this instruction should be used:
                                                                  214c:   ldmia
       ip!, {r0, r1, r2, r3}
                                                               */
   216c:       e1a00004        mov     r0, r4
   2170:       e3a02008        mov     r2, #8  ; 0x8
   2174:       e1a01006        mov     r1, r6
   2178:       e5843004        str     r3, [r4, #4]
   217c:       1a000005        bne     2198 <snd_mask_refine+0x7c>
   2180:       e3530000        cmp     r3, #0  ; 0x0
   2184:       e3e03015        mvn     r3, #21 ; 0x15
   2188:       1a000002        bne     2198 <snd_mask_refine+0x7c>
   218c:       e1a00003        mov     r0, r3
   2190:       e24bd01c        sub     sp, fp, #28     ; 0x1c
   2194:       e89da8f0        ldmia   sp, {r4, r5, r6, r7, fp, sp, pc}
   2198:       ebfffffe        bl      0 <memcmp>
   219c:       e2503000        subs    r3, r0, #0      ; 0x0
   21a0:       13a03001        movne   r3, #1  ; 0x1
   21a4:       eafffff8        b       218c <snd_mask_refine+0x70>

The C code is like following:

#define SNDRV_MASK_SIZE 2
struct mask_t {
       unsigned int bits[8];
};
typedef struct mask_t snd_mask_t;
static inline int snd_mask_empty(const snd_mask_t *mask)
{
       int i;
       for (i = 0; i < SNDRV_MASK_SIZE; i++) {
               if (mask->bits[i])
                       return 0;
       }
       return 1;
}
static inline void snd_mask_intersect(snd_mask_t *mask, const snd_mask_t *v)
{
       int i;
       for (i = 0; i < SNDRV_MASK_SIZE; i++)
               mask->bits[i] &= v->bits[i];
}
static inline void snd_mask_copy(snd_mask_t *mask, const snd_mask_t *v)
{
       *mask = *v;
}
int snd_mask_refine(snd_mask_t *mask, const snd_mask_t *v)
{
       snd_mask_t old;

       snd_mask_copy(&old, mask);
       snd_mask_intersect(mask, v);
       if (snd_mask_empty(mask))
               return -1;

       return !snd_mask_eq(mask, &old);
       return 1;
}

When I remove the -O option, the ALSA works OK. the .s file is like following:

00000040 <snd_mask_refine>:
     40:       e1a0c00d        mov     ip, sp
     44:       e92dd800        stmdb   sp!, {fp, ip, lr, pc}
     48:       e24cb004        sub     fp, ip, #4      ; 0x4
     4c:       e24dd048        sub     sp, sp, #72     ; 0x48
     50:       e50b0048        str     r0, [fp, #-72]
     54:       e50b104c        str     r1, [fp, #-76]
     58:       e51b3048        ldr     r3, [fp, #-72]
     5c:       e24be040        sub     lr, fp, #64     ; 0x40
     60:       e1a0c003        mov     ip, r3
     64:       e8bc000f        ldmia   ip!, {r0, r1, r2, r3}
     68:       e8ae000f        stmia   lr!, {r0, r1, r2, r3}
     6c:       e89c000f        ldmia   ip, {r0, r1, r2, r3}
     70:       e88e000f        stmia   lr, {r0, r1, r2, r3}
     74:       e3a03000        mov     r3, #0  ; 0x0
     78:       e50b3020        str     r3, [fp, #-32]
     7c:       ea00000c        b       b4 <snd_mask_refine+0x74>
     80:       e51b0020        ldr     r0, [fp, #-32]
     84:       e51b2020        ldr     r2, [fp, #-32]
     88:       e51b3048        ldr     r3, [fp, #-72]
     8c:       e7931102        ldr     r1, [r3, r2, lsl #2]
     90:       e51b2020        ldr     r2, [fp, #-32]
     94:       e51b304c        ldr     r3, [fp, #-76]
     98:       e7933102        ldr     r3, [r3, r2, lsl #2]
     9c:       e0012003        and     r2, r1, r3
     a0:       e51b3048        ldr     r3, [fp, #-72]
     a4:       e7832100        str     r2, [r3, r0, lsl #2]
     a8:       e51b3020        ldr     r3, [fp, #-32]
     ac:       e2833001        add     r3, r3, #1      ; 0x1
     b0:       e50b3020        str     r3, [fp, #-32]
     b4:       e51b3020        ldr     r3, [fp, #-32]
     b8:       e3530001        cmp     r3, #1  ; 0x1
     bc:       daffffef        ble     80 <snd_mask_refine+0x40>
     c0:       e51b3048        ldr     r3, [fp, #-72]
     c4:       e50b3018        str     r3, [fp, #-24]
     c8:       e3a03000        mov     r3, #0  ; 0x0
     cc:       e50b301c        str     r3, [fp, #-28]
     d0:       ea00000a        b       100 <snd_mask_refine+0xc0>
     d4:       e51b301c        ldr     r3, [fp, #-28]
     d8:       e51b2018        ldr     r2, [fp, #-24]
     dc:       e7923103        ldr     r3, [r2, r3, lsl #2]
     e0:       e3530000        cmp     r3, #0  ; 0x0
     e4:       0a000002        beq     f4 <snd_mask_refine+0xb4>
     e8:       e3a03000        mov     r3, #0  ; 0x0
     ec:       e50b3050        str     r3, [fp, #-80]
     f0:       ea000007        b       114 <snd_mask_refine+0xd4>
     f4:       e51b301c        ldr     r3, [fp, #-28]
     f8:       e2833001        add     r3, r3, #1      ; 0x1
     fc:       e50b301c        str     r3, [fp, #-28]
    100:       e51b301c        ldr     r3, [fp, #-28]
    104:       e3530001        cmp     r3, #1  ; 0x1
    108:       dafffff1        ble     d4 <snd_mask_refine+0x94>
    10c:       e3a03001        mov     r3, #1  ; 0x1
    110:       e50b3050        str     r3, [fp, #-80]
    114:       e51b3050        ldr     r3, [fp, #-80]
    118:       e3530000        cmp     r3, #0  ; 0x0
    11c:       0a000002        beq     12c <snd_mask_refine+0xec>
    120:       e3e03015        mvn     r3, #21 ; 0x15
    124:       e50b3054        str     r3, [fp, #-84]
    128:       ea00000f        b       16c <snd_mask_refine+0x12c>
    12c:       e51b3048        ldr     r3, [fp, #-72]
    130:       e50b3010        str     r3, [fp, #-16]
    134:       e24b3040        sub     r3, fp, #64     ; 0x40
    138:       e50b3014        str     r3, [fp, #-20]
    13c:       e51b0010        ldr     r0, [fp, #-16]
    140:       e51b1014        ldr     r1, [fp, #-20]
    144:       e3a02008        mov     r2, #8  ; 0x8
    148:       ebfffffe        bl      0 <memcmp>
    14c:       e1a03000        mov     r3, r0
    150:       e3530000        cmp     r3, #0  ; 0x0
    154:       13a03000        movne   r3, #0  ; 0x0
    158:       03a03001        moveq   r3, #1  ; 0x1
    15c:       e3530000        cmp     r3, #0  ; 0x0
    160:       13a03000        movne   r3, #0  ; 0x0
    164:       03a03001        moveq   r3, #1  ; 0x1
    168:       e50b3054        str     r3, [fp, #-84]
    16c:       e51b3054        ldr     r3, [fp, #-84]
    170:       e1a00003        mov     r0, r3
    174:       e24bd00c        sub     sp, fp, #12     ; 0xc
    178:       e89da800        ldmia   sp, {fp, sp, pc}


-- 
           Summary: ARM gcc 4.1 optimization bug
           Product: gcc
           Version: 4.1.0
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: nh26223 at yahoo dot com dot cn
 GCC build triplet: i386
  GCC host triplet: i386
GCC target triplet: arm xscale iwmmxt


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27363


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

end of thread, other threads:[~2007-01-26  2:53 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-04-30  4:48 [Bug c/27363] New: ARM gcc 4.1 optimization bug nh26223 at yahoo dot com dot cn
2006-04-30  5:01 ` [Bug target/27363] " pinskia at gcc dot gnu dot org
2006-04-30  5:09 ` yfw dot debian at gmail dot com
2006-04-30  5:32 ` yfw dot debian at gmail dot com
2006-04-30  9:09 ` yfw dot debian at gmail dot com
2006-05-14 17:15 ` s_j_newbury at yahoo dot co dot uk
2006-06-07 16:08 ` dirk dot behme at googlemail dot com
2006-06-12 15:44 ` dirk dot behme at googlemail dot com
2006-06-26 19:13 ` rguenth at gcc dot gnu dot org
2006-07-15 19:22 ` enrico dot scholz at informatik dot tu-chemnitz dot de
2006-07-15 19:26 ` enrico dot scholz at informatik dot tu-chemnitz dot de
2006-07-18 21:42 ` pbrook at gcc dot gnu dot org
2006-07-20 13:57 ` pbrook at gcc dot gnu dot org
2006-07-20 13:59 ` pbrook at gcc dot gnu dot org
2006-07-20 15:07 ` pbrook at gcc dot gnu dot org
2006-07-20 15:08 ` pbrook at gcc dot gnu dot org
2006-07-20 15:37 ` rearnsha at gcc dot gnu dot org
2006-07-20 15:39 ` rearnsha at gcc dot gnu dot org
2006-07-22  6:21 ` yfw dot debian at gmail dot com
2006-07-22  6:24 ` dirk dot behme at googlemail dot com
2006-10-19 22:02 ` likewise at gmx dot net
2007-01-26  2:53 ` m dot k dot edwards at gmail dot com

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