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