From: Oleg N. C. <al...@bk...> - 2011-02-09 13:39:39
|
Dear SDCC developers, I found a SDCC Z80 code generation bug. > 1.Attach the code you are compiling with SDCC int main (void) { unsigned char i,mr2,sp; mr2 = 1; sp = 0; // (mr2-1)*sp = 0, i.e. for(i=1;i<=0;i++) ... /* and because i=1, and (1<=0) is FALSE, this loop must NOT BE RUNNED */ for(i=1;i<=((mr2-1)*sp);i++) { // ... but this code IS RUNNED!!! :( } // Here is unreachable code, because loop is eternal. } > 2.Specify the exact command you use to run SDCC, or attach your Makefile. sdcc\sdcc -mz80 --code-loc 26000 --data-loc 0xF000 --no-std-crt0 --opt-code-size --funsigned-char --disable-warning 59 -L z80 testbug.c > 3.Specify the SDCC version, your platform and operating system C:\Soft\Dev-Zx\SDCC\bug\sdcc>sdcc -v SDCC : mcs51/gbz80/z80/ds390/pic16/pic14/TININative/ds400/hc08 3.0.1 #6183 (Jan 26 2011) (MINGW32) > 4.Provide an exact copy of any error message or incorrect output The problem is eternal loop with incorrect code generation. More earlier versions of SDCC generate the correct code. I tried old version: C:\Soft\Dev-Zx\SDCC\bug\sdcc>sdcc -v SDCC : mcs51/gbz80/z80/ds390/pic16/pic14/TININative/ds400/hc08 2.9.7 #5839 (May 30 2010) (MINGW32) and code was absolutely correct. Difference is: SDCC VERSION 2.9.7 (CORRECT) SDCC VERSION 3.0.1 (INCORRECT) ;--------------------------------------------------------------- ;testbug.c:5: for(i=1;i<=((mr2-1)*sp);i++) { // ... but this code IS RUNNED!!! :( ld c,#0x01 ld c,#0x01 00101$: 00101$: ld l,c ld l,c ld a,#0x00 ld a,#0x00 ld h,a ld h,a sub a,l sub a, l ld a,#0x00 ld a,#0x00 sbc a,h sbc a, h jp PO, 00110$ xor a, #0x80 00110$: ret M ret M inc c inc c jr 00101$ jr 00101$ ;--------------------------------------------------------------- Thank you. -- Oleg N. Cher, Vedanta Software |