egcs-1.1.2 on SH1: miscompiles function

Hartmut hartmut.schirmer@arcormail.de
Wed Apr 21 11:01:00 GMT 1999


Hi,

egcs-1.1.2 create wrong code cross-compiling for SH-1 target. 
(Host: Win NT4.0 i586)

I looks like it generates an additional assembler line that causes the bug.

The qsort func below will crash when

- compiled by Haifa-enabled  egcs-1.1.2 and -O2 or -O3
- compiled by Haifa-disabled egcs-1.1.2 and -O2 or -O3

The qsort func below will work ok when

- compiled by Haifa-enabled  egcs-1.1.2 and -Os

The qsort func below looks ok when

- compiled by Haifa-disabled egcs-1.1.2 and -Os

I didn't check for -O1 and -O0

Any idea whats going wrong ?

Thanks,
Hartmut


Here's the code:
----------------------------------------------------------------------------

typedef unsigned int size_t;
void *memcpy(void *s1, const void *s2, size_t n);

void qsort( void *vbase, size_t nel, size_t width,
           int (*compar)(const void *, const void *) )
{
    char     *base, *cp1, *cp2;
    int i,j,l,r;
    struct
    {
        int   l;
        int   r;
    }
    stack[20];
    
    int s;
    
    char    xbuf[200];
    char    _cbuf[200];
    
    base = (char *)vbase;
    
    if(width >= sizeof (xbuf) )
        return;
    
    
    xbuf[width] = 0;
    s = 0;
    stack[0].l = 0;
    stack[0].r = nel-1;
    do
    {
         
        l = stack[s].l;
        r = stack[s].r;   // bug: r isn't set to nel-1 on first loop !!
        s--;
        
        do
        {
            i = l;
            j = r;
            memcpy( xbuf, base+width*((i+j)/2), width);
            do
            {
                while((*compar)(base+i*width, xbuf) < 0)
                    i++;
                while((*compar)(xbuf, base+j*width) < 0)
                    j--;
                if(i <= j)
                {
                    cp1 = base+i*width;
                    cp2 = base+j*width;
                    
                    memcpy( _cbuf, cp1, width );
                    memcpy( cp1, cp2, width );
                    memcpy( cp2, _cbuf, width );
                    
                    i++;
                    j--;
                }
                
            } while(i <= j);
            
            if(j-l < r-i)
            {
                if(i < r)
                {    
                    if ( ++s >= sizeof(stack) / sizeof(stack[0]) )
                        return;
                    stack[s].l = i;
                    stack[s].r = r;
                }
                
                r = j;         
            }
            else
            {
                if(l < j)
                {
                    if ( ++s >= sizeof(stack) / sizeof(stack[0]) )
                        return;
                    stack[s].l = l;
                    stack[s].r = j;
                }
                l = i;
            }
            
        } while(l < r);
        
        
    } while(s >= 0);
}

----------------------------------------------------------------------------

looking at the asm output one finds the additional line:

----------------------------------------------------------------------------
	.file	"qsort.c"
	.data
! GNU C version egcs-2.91.66 19990314 (egcs-1.1.2 release) (sh-hitachi-coff) compiled by GNU C version egcs-2.91.60 19981201 (egcs-1.1.1 release).
! options passed:  -m1 -mrelax -ansi -O3 -Wall -Wwrite-strings
! -Wno-trigraphs -Wunused -Wno-main -ansi -fverbose-asm
! -fomit-frame-pointer
! options enabled:  -fdefer-pop -fomit-frame-pointer -fcse-follow-jumps
! -fcse-skip-blocks -fexpensive-optimizations -fthread-jumps
! -fstrength-reduce -fpeephole -fforce-mem -ffunction-cse
! -finline-functions -finline -fkeep-static-consts -fcaller-saves
! -freg-struct-return -fdelayed-branch -fgcse -frerun-cse-after-loop
! -frerun-loop-opt -fschedule-insns2 -fsjlj-exceptions -fcommon
! -fverbose-asm -fgnu-linker -fregmove -foptimize-register-move
! -fargument-alias -m1 -mrelax

gcc2_compiled.:
___gnu_compiled_c:
	.text
	.align 2
	.global	_qsort
_qsort:
	mov.l	r8,@-r15
	mov.w	L40,r3
	mov.w	L41,r0
	mov.l	r9,@-r15
	mov.l	r10,@-r15
	mov.l	r11,@-r15
	mov.l	r12,@-r15
	mov.l	r13,@-r15
	mov.l	r14,@-r15
	sts.l	pr,@-r15
	mov.w	L42,r1
	sub	r3,r15		// get 628 bytes for local vars
	mov	r6,r13
	add	r15,r0
	cmp/hi	r1,r13
	mov.l	r4,@(52,r0)	// vbase  -> (r15+508+52)
	mov.l	r7,@(56,r0)	// compar -> (r15+508+56)
	bf	L61
	bra	L1
	nop
L61:
	mov.w	L43,r3
	mov	#0,r1
	mov.w	L44,r9
	mov	r3,r2
	add	r15,r2
	mov	#0,r10
	add	r15,r9
	mov	r2,r0
	mov.b	r1,@(r0,r13)	// xbuf[width] = 0   (xbuf at r15+160)
	add	#-1,r5
	mov.l	r10,@(4,r9)
	mov.l	@(4,r9),r11
	mov	r15,r0
	mov.l	r11,@r15	// stack[0].l = 0  (stack at r15)
	add	#4,r0
	mov.l	r5,@(4,r15)	// stack[0].r = nel-1
	mov.l	r0,@(16,r9)	// &stack[0].r -> r15+572+16
	mov.l	r2,@(8,r9)
	mov.l	r10,@(28,r9)	// s = 0  (s at r15+572+28)
	mov.w	L44,r11
	mov.w	L45,r10
	add	r15,r11
	mov.l	r10,@(12,r9)
	mov.l	@(12,r11),r0
	add	r15,r0
	mov.l	r0,@(12,r9)
	.align 2
L3:
	mov.w	L44,r0
	add	r15,r0
	mov.l	@(28,r0),r9	// (r15+572+28) -> r9 (0 on first)
	mov	r15,r0
	mov.l	@(r0,r9),r9	// l = stack[s]
	mov.w	L41,r0
	add	r15,r0
	mov.l	r9,@(60,r0)	// l at r15+508+60
	mov.w	L44,r0
	add	r15,r0
// bug starts here
	mov.l	@(28,r0),r0	// (r15+572+28) -> r0 (0 on first)
// <<<
	mov.l	@(16,r0),r9	// (16) -> r9 
	mov.l	@(r0,r9),r9	// (r9+sizeof(long)*s) -> r9  
                                // this is r9 = stack[s].r if we delete the mov.l @(28,r0),r0 line
	mov.w	L44,r0
	mov.w	L44,r10
	add	r15,r0
	add	r15,r10
	mov.l	r9,@(0,r0)
	mov.l	@(28,r10),r11
	add	#-8,r11
	mov.l	r11,@(28,r0)
	mov.w	L44,r0
	add	r15,r0
	mov.l	@(4,r0),r9
	add	#-1,r9
	mov.l	r9,@(4,r10)
	mov.l	@(4,r0),r1
	shll2	r1
	mov.w	L44,r10
	add	r1,r1
	add	r15,r10
	mov.l	r1,@(20,r0)
	mov.l	@(20,r10),r11
	mov.l	@(16,r10),r10
	add	r10,r11
	mov.l	r11,@(20,r0)
	mov.w	L44,r11
	mov.w	L44,r0
	add	r15,r11
	add	r15,r0
	mov.l	r1,@(24,r11)
	mov.l	@(24,r0),r9
	add	r15,r9
	mov.l	r9,@(24,r11)
	.align 2
L6:
	mov.w	L41,r10
	mov.w	L44,r11
	add	r15,r10
	add	r15,r11
	mov.l	@(60,r10),r14
	mov.l	@(0,r11),r3
	mov	r14,r5
	mov	r3,r0
	add	r0,r5
	mov	r5,r1
	rotl	r1
	mov	r13,r4
	movt	r1
L33:
	mov.l	L46,r9
	add	r1,r5
	mov.l	r3,@(36,r11)
	.uses L33
	jsr	@r9
	shar	r5
	mov.w	L41,r10
	mov	r0,r1
	mov.w	L44,r11
	add	r15,r10
	mov	r13,r6
	mov.l	@(52,r10),r10
	add	r15,r11
L34:
	mov.l	L47,r0
	add	r10,r1
	mov.l	@(8,r11),r4
	.uses L34
	jsr	@r0
	mov	r1,r5
	mov.w	L44,r9
L36:
	mov.l	L46,r10
	add	r15,r9
	mov	r13,r5
	.uses L36
	jsr	@r10
	mov.l	@(0,r9),r4
	mov	r0,r1
	mov.w	L41,r11
	mov	r1,r12
	mov.w	L41,r0
	add	r15,r11
	mov	r1,r8
	add	r15,r0
	mov.l	@(52,r11),r11
	mov	r13,r5
	.uses L36
	jsr	@r10
	mov.l	@(60,r0),r4
	mov.w	L44,r9
	add	r11,r12
	mov.w	L44,r10
	add	r15,r9
	mov	r0,r1
	add	r15,r10
	mov.l	r1,@(48,r9)
	mov.l	@(48,r10),r11
	mov.w	L41,r10
	add	r15,r10
	mov.l	@(52,r10),r10
	mov	r8,r7
	add	r10,r11
	mov	r1,r2
	mov.l	r11,@(48,r9)
	mov.w	L44,r11
	add	r15,r11
	mov.l	@(36,r11),r3
	.align 2
L9:
	mov.w	L41,r0
	add	r15,r0
	mov.l	@(52,r0),r0
	mov	r2,r8
	bra	L12
	add	r0,r8
	.align 2
L14:
	mov.w	L44,r9
	add	r13,r8
	add	r15,r9
	add	r13,r2
	mov.l	@(48,r9),r10
	add	r13,r10
	add	#1,r14
	mov.l	r10,@(48,r9)
L12:
	mov.w	L43,r5
	mov.w	L44,r11
	mov.w	L41,r0
	add	r15,r11
	mov.l	r2,@(32,r11)
	mov.l	r3,@(36,r11)
	add	r15,r0
	mov.l	r7,@(40,r11)
	mov.l	@(56,r0),r0
	mov	r8,r4
	jsr	@r0
	add	r15,r5
	mov.w	L44,r9
	add	r15,r9
	mov.l	@(32,r9),r2
	mov.l	@(36,r9),r3
	mov	r0,r1
	mov.l	@(40,r9),r7
	cmp/pz	r1
	bf	L14
	mov.w	L43,r10
	mov.w	L44,r11
	mov.l	r10,@(44,r9)
	add	r15,r11
	mov.l	@(44,r11),r0
	add	r15,r0
	mov.l	r0,@(44,r9)
	neg	r13,r6
	mov.w	L41,r9
	add	r15,r9
	mov.l	@(52,r9),r9
	mov	r7,r8
	bra	L16
	add	r9,r8
	.align 2
L40:
	.short	628
L41:
	.short	508
L42:
	.short	199
L43:
	.short	160
L44:
	.short	572
L45:
	.short	360
L48:
	.align 2
L46:
	.long	___mulsi3
L47:
	.long	_memcpy
	.align 2
L18:
	add	r6,r8
	add	r6,r12
	sub	r13,r7
	add	#-1,r3
L16:
	mov.w	L49,r10
	mov.w	L50,r11
	add	r15,r10
	mov.l	r2,@(32,r10)
	mov.l	r3,@(36,r10)
	mov.l	r6,@(52,r10)
	add	r15,r11
	mov.l	r7,@(40,r10)
	mov.l	@(56,r11),r11
	mov	r8,r5
	jsr	@r11
	mov.l	@(44,r10),r4
	mov	r0,r1
	mov.w	L49,r0
	add	r15,r0
	mov.l	@(32,r0),r2
	mov.l	@(36,r0),r3
	mov.l	@(52,r0),r6
	mov.l	@(40,r0),r7
	cmp/pz	r1
	bf	L18
	cmp/gt	r3,r14
	bt	L11
	mov.l	@(12,r0),r4
L39:
	mov.l	L51,r9
	mov	r13,r6
	.uses L39
	jsr	@r9
	mov.l	@(48,r0),r5
	mov.w	L49,r10
	mov	r12,r5
	add	r15,r10
	mov	r13,r6
	.uses L39
	jsr	@r9
	mov.l	@(48,r10),r4
	mov.w	L49,r11
	mov	r12,r4
	add	r15,r11
	mov	r13,r6
	.uses L39
	jsr	@r9
	mov.l	@(12,r11),r5
	mov.w	L49,r0
	add	r15,r0
	add	#1,r14
	mov.l	@(48,r0),r9
	add	r13,r9
	neg	r13,r1
	mov.l	r9,@(48,r0)
	mov.l	@(32,r0),r2
	add	r1,r12
	mov.l	@(40,r0),r7
	add	r13,r2
	mov.l	@(36,r0),r3
	add	r1,r7
	add	#-1,r3
L11:
	cmp/gt	r3,r14
	bt	L60
	bra	L9
	nop
L60:
	mov.w	L50,r10
	mov.w	L49,r11
	add	r15,r10
	add	r15,r11
	mov.l	@(60,r10),r10
	mov	r3,r2
	mov.l	@(0,r11),r1
	sub	r10,r2
	sub	r14,r1
	cmp/ge	r1,r2
	bt	L23
	mov.l	@(0,r11),r0
	cmp/ge	r0,r14
	bt	L24
	mov.w	L49,r9
	add	r15,r9
	mov.l	@(20,r9),r10
	add	#8,r10
	mov.l	r10,@(20,r11)
	mov.w	L49,r11
	add	r15,r11
	mov.l	@(24,r11),r0
	add	#8,r0
	mov.l	r0,@(24,r9)
	mov.w	L49,r9
	add	r15,r9
	mov.l	@(28,r9),r10
	add	#8,r10
	mov.l	r10,@(28,r11)
	mov.w	L49,r11
	add	r15,r11
	mov.l	@(4,r11),r0
	add	#1,r0
	mov.l	r0,@(4,r9)
	mov.l	@(4,r11),r9
	mov	#19,r1
	cmp/hi	r1,r9
	bt	L1
	mov.l	@(24,r11),r10
	mov.w	L49,r0
	mov.l	r14,@r10
	add	r15,r0
	mov.l	@(0,r0),r9
	mov.l	@(20,r11),r0
	mov.l	r9,@r0
L24:
	mov.w	L49,r10
	add	r15,r10
	bra	L8
	mov.l	r3,@(0,r10)
	.align 2
L23:
	mov.w	L50,r11
	add	r15,r11
	mov.l	@(60,r11),r11
	cmp/ge	r3,r11
	bt	L27
	mov.w	L49,r0
	add	r15,r0
	mov.l	@(20,r0),r9
	add	#8,r9
	mov.w	L49,r10
	add	r15,r10
	mov.l	r9,@(20,r0)
	mov.l	@(24,r10),r11
	add	#8,r11
	mov.l	r11,@(24,r0)
	mov.w	L49,r0
	add	r15,r0
	mov.l	@(28,r0),r9
	add	#8,r9
	mov.l	r9,@(28,r10)
	mov.w	L49,r10
	add	r15,r10
	mov.l	@(4,r10),r11
	add	#1,r11
	mov.l	r11,@(4,r0)
	mov.l	@(4,r10),r0
	mov	#19,r1
	cmp/hi	r1,r0
	bt	L1
	mov.w	L50,r9
	add	r15,r9
	mov.l	@(60,r9),r11
	mov.l	@(24,r10),r9
	mov.l	r11,@r9
	mov.l	@(20,r10),r0
	mov.l	r3,@r0
L27:
	mov.w	L50,r9
	add	r15,r9
	mov.l	r14,@(60,r9)
L8:
	mov.w	L50,r10
	add	r15,r10
	mov.l	@(60,r10),r11
	mov.w	L49,r10
	add	r15,r10
	mov.l	@(0,r10),r10
	cmp/ge	r10,r11
	bt	L59
	bra	L6
	nop
L59:
	mov.w	L49,r11
	add	r15,r11
	mov.l	@(4,r11),r11
	cmp/pz	r11
	bf	L1
	bra	L3
	nop
L1:
	mov.w	L52,r7
	add	r7,r15
	lds.l	@r15+,pr
	mov.l	@r15+,r14
	mov.l	@r15+,r13
	mov.l	@r15+,r12
	mov.l	@r15+,r11
	mov.l	@r15+,r10
	mov.l	@r15+,r9
	rts	
	mov.l	@r15+,r8
	.align 1
L49:
	.short	572
L50:
	.short	508
L52:
	.short	628
L53:
	.align 2
L51:
	.long	_memcpy


More information about the Gcc-bugs mailing list