* gcc-2.96-99 optimization bug?
@ 2002-02-08 10:37 Atsushi Nemoto
2002-02-08 18:30 ` H . J . Lu
0 siblings, 1 reply; 4+ messages in thread
From: Atsushi Nemoto @ 2002-02-08 10:37 UTC (permalink / raw)
To: linux-mips
I found gcc 2.96 (gcc-2.96-99.1.mipsel.rpm in H.J.Lu's RedHat 7.1)
outputs wrong code for this short program.
int foo(unsigned long long a, unsigned long long b)
{
int as, bs;
as = a >> 63;
bs = b >> 63;
if (as != bs)
return as || !(b << 1);
return (a == b) || as;
}
int main(int argc, char **argv)
{
return foo(0, 0xffffffffffffffffull);
}
This program must return 0. But compiling with -O2 it returns 1 !!
# gcc -O -o foo foo.c;./foo;echo $?
0
# gcc -O2 -o foo foo.c;./foo;echo $?
1
Output wth -O -g are:
00400780 <foo>:
400780: 3c1c0fc0 lui gp,0xfc0
400784: 279c78b0 addiu gp,gp,30896
400788: 0399e021 addu gp,gp,t9
40078c: 00804021 move t0,a0
400790: 00a04821 move t1,a1
400794: 000917c2 srl v0,t1,0x1f
400798: 00402821 move a1,v0
40079c: 000717c2 srl v0,a3,0x1f
4007a0: 10a2000d beq a1,v0,4007d8 <foo+0x58>
4007a4: 00001821 move v1,zero
4007a8: 14a00008 bnez a1,4007cc <foo+0x4c>
4007ac: 00004021 move t0,zero
4007b0: 00071840 sll v1,a3,0x1
4007b4: 000627c2 srl a0,a2,0x1f
4007b8: 00641825 or v1,v1,a0
4007bc: 00061040 sll v0,a2,0x1
4007c0: 00621025 or v0,v1,v0
4007c4: 14400002 bnez v0,4007d0 <foo+0x50>
4007c8: 00000000 nop
4007cc: 24080001 li t0,1
4007d0: 03e00008 jr ra
4007d4: 01001021 move v0,t0
4007d8: 15060003 bne t0,a2,4007e8 <foo+0x68>
4007dc: 00001021 move v0,zero
4007e0: 11270003 beq t1,a3,4007f0 <foo+0x70>
4007e4: 00000000 nop
4007e8: 10a00002 beqz a1,4007f4 <foo+0x74>
4007ec: 00000000 nop
4007f0: 24020001 li v0,1
4007f4: 03e00008 jr ra
4007f8: 00000000 nop
Output with -O2 -g are:
00400780 <foo>:
400780: 3c1c0fc0 lui gp,0xfc0
400784: 279c78b0 addiu gp,gp,30896
400788: 0399e021 addu gp,gp,t9
40078c: 00805021 move t2,a0
400790: 00c04021 move t0,a2
400794: 00a05821 move t3,a1
400798: 00e04821 move t1,a3
40079c: 000b17c2 srl v0,t3,0x1f
4007a0: 000927c2 srl a0,t1,0x1f
4007a4: 00001821 move v1,zero
4007a8: 1044000a beq v0,a0,4007d4 <foo+0x54>
4007ac: 00002821 move a1,zero
4007b0: 14400006 bnez v0,4007cc <foo+0x4c>
4007b4: 24050001 li a1,1
4007b8: 00091840 sll v1,t1,0x1
4007bc: 000827c2 srl a0,t0,0x1f
4007c0: 00641825 or v1,v1,a0
4007c4: 00081040 sll v0,t0,0x1
4007c8: 00621025 or v0,v1,v0
4007cc: 03e00008 jr ra
4007d0: 00a01021 move v0,a1
4007d4: 15480003 bne t2,t0,4007e4 <foo+0x64>
4007d8: 00001821 move v1,zero
4007dc: 11690003 beq t3,t1,4007ec <foo+0x6c>
4007e0: 00000000 nop
4007e4: 10400002 beqz v0,4007f0 <foo+0x70>
4007e8: 00000000 nop
4007ec: 24030001 li v1,1
4007f0: 03e00008 jr ra
4007f4: 00601021 move v0,v1
It seems one 'bnez' in good code (at 4007c4) was lost in bad code.
Is this a know problem? If so, is there any patches available?
Thank you.
---
Atsushi Nemoto
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: gcc-2.96-99 optimization bug?
@ 2002-02-08 10:53 Zhang Fuxin
0 siblings, 0 replies; 4+ messages in thread
From: Zhang Fuxin @ 2002-02-08 10:53 UTC (permalink / raw)
To: Atsushi Nemoto; +Cc: linux-mips@oss.sgi.com
hi,
it seems fixed in latest gcc (3.1). gcc 2.96 does produce wrong code
for -O2, i posted another example one or two days ago.
在 2002-02-08 19:37:00 you wrote:
>I found gcc 2.96 (gcc-2.96-99.1.mipsel.rpm in H.J.Lu's RedHat 7.1)
>outputs wrong code for this short program.
>
>int foo(unsigned long long a, unsigned long long b)
>{
> int as, bs;
> as = a >> 63;
> bs = b >> 63;
> if (as != bs)
> return as || !(b << 1);
> return (a == b) || as;
>}
>
>int main(int argc, char **argv)
>{
> return foo(0, 0xffffffffffffffffull);
>}
>
>This program must return 0. But compiling with -O2 it returns 1 !!
>
># gcc -O -o foo foo.c;./foo;echo $?
>0
># gcc -O2 -o foo foo.c;./foo;echo $?
>1
>
>Output wth -O -g are:
>
>00400780 <foo>:
> 400780: 3c1c0fc0 lui gp,0xfc0
> 400784: 279c78b0 addiu gp,gp,30896
> 400788: 0399e021 addu gp,gp,t9
> 40078c: 00804021 move t0,a0
> 400790: 00a04821 move t1,a1
> 400794: 000917c2 srl v0,t1,0x1f
> 400798: 00402821 move a1,v0
> 40079c: 000717c2 srl v0,a3,0x1f
> 4007a0: 10a2000d beq a1,v0,4007d8 <foo+0x58>
> 4007a4: 00001821 move v1,zero
> 4007a8: 14a00008 bnez a1,4007cc <foo+0x4c>
> 4007ac: 00004021 move t0,zero
> 4007b0: 00071840 sll v1,a3,0x1
> 4007b4: 000627c2 srl a0,a2,0x1f
> 4007b8: 00641825 or v1,v1,a0
> 4007bc: 00061040 sll v0,a2,0x1
> 4007c0: 00621025 or v0,v1,v0
> 4007c4: 14400002 bnez v0,4007d0 <foo+0x50>
> 4007c8: 00000000 nop
> 4007cc: 24080001 li t0,1
> 4007d0: 03e00008 jr ra
> 4007d4: 01001021 move v0,t0
> 4007d8: 15060003 bne t0,a2,4007e8 <foo+0x68>
> 4007dc: 00001021 move v0,zero
> 4007e0: 11270003 beq t1,a3,4007f0 <foo+0x70>
> 4007e4: 00000000 nop
> 4007e8: 10a00002 beqz a1,4007f4 <foo+0x74>
> 4007ec: 00000000 nop
> 4007f0: 24020001 li v0,1
> 4007f4: 03e00008 jr ra
> 4007f8: 00000000 nop
>
>Output with -O2 -g are:
>
>00400780 <foo>:
> 400780: 3c1c0fc0 lui gp,0xfc0
> 400784: 279c78b0 addiu gp,gp,30896
> 400788: 0399e021 addu gp,gp,t9
> 40078c: 00805021 move t2,a0
> 400790: 00c04021 move t0,a2
> 400794: 00a05821 move t3,a1
> 400798: 00e04821 move t1,a3
> 40079c: 000b17c2 srl v0,t3,0x1f
> 4007a0: 000927c2 srl a0,t1,0x1f
> 4007a4: 00001821 move v1,zero
> 4007a8: 1044000a beq v0,a0,4007d4 <foo+0x54>
> 4007ac: 00002821 move a1,zero
> 4007b0: 14400006 bnez v0,4007cc <foo+0x4c>
> 4007b4: 24050001 li a1,1
> 4007b8: 00091840 sll v1,t1,0x1
> 4007bc: 000827c2 srl a0,t0,0x1f
> 4007c0: 00641825 or v1,v1,a0
> 4007c4: 00081040 sll v0,t0,0x1
> 4007c8: 00621025 or v0,v1,v0
> 4007cc: 03e00008 jr ra
> 4007d0: 00a01021 move v0,a1
> 4007d4: 15480003 bne t2,t0,4007e4 <foo+0x64>
> 4007d8: 00001821 move v1,zero
> 4007dc: 11690003 beq t3,t1,4007ec <foo+0x6c>
> 4007e0: 00000000 nop
> 4007e4: 10400002 beqz v0,4007f0 <foo+0x70>
> 4007e8: 00000000 nop
> 4007ec: 24030001 li v1,1
> 4007f0: 03e00008 jr ra
> 4007f4: 00601021 move v0,v1
>
>
>It seems one 'bnez' in good code (at 4007c4) was lost in bad code.
>
>Is this a know problem? If so, is there any patches available?
>
>Thank you.
>---
>Atsushi Nemoto
Regards
Zhang Fuxin
fxzhang@ict.ac.cn
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: gcc-2.96-99 optimization bug?
2002-02-08 10:37 gcc-2.96-99 optimization bug? Atsushi Nemoto
@ 2002-02-08 18:30 ` H . J . Lu
2002-02-12 2:03 ` Atsushi Nemoto
0 siblings, 1 reply; 4+ messages in thread
From: H . J . Lu @ 2002-02-08 18:30 UTC (permalink / raw)
To: Atsushi Nemoto; +Cc: linux-mips
On Fri, Feb 08, 2002 at 07:37:31PM +0900, Atsushi Nemoto wrote:
> I found gcc 2.96 (gcc-2.96-99.1.mipsel.rpm in H.J.Lu's RedHat 7.1)
> outputs wrong code for this short program.
>
> It seems one 'bnez' in good code (at 4007c4) was lost in bad code.
>
> Is this a know problem? If so, is there any patches available?
>
gcc 3.1 seems fine. No one is working on gcc 2.96. I am working on
a new Linuxx/mips which will use gcc 3.1.
H.J.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: gcc-2.96-99 optimization bug?
2002-02-08 18:30 ` H . J . Lu
@ 2002-02-12 2:03 ` Atsushi Nemoto
0 siblings, 0 replies; 4+ messages in thread
From: Atsushi Nemoto @ 2002-02-12 2:03 UTC (permalink / raw)
To: hjl; +Cc: linux-mips
>>>>> On Fri, 8 Feb 2002 10:30:47 -0800, "H . J . Lu" <hjl@lucon.org> said:
hjl> gcc 3.1 seems fine. No one is working on gcc 2.96. I am working
hjl> on a new Linuxx/mips which will use gcc 3.1.
Thank you. I will wait for your new package and try it.
---
Atsushi Nemoto
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2002-02-12 3:00 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-02-08 10:37 gcc-2.96-99 optimization bug? Atsushi Nemoto
2002-02-08 18:30 ` H . J . Lu
2002-02-12 2:03 ` Atsushi Nemoto
-- strict thread matches above, loose matches on Subject: below --
2002-02-08 10:53 Zhang Fuxin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox