From: Johan K. <joh...@id...> - 2001-10-10 12:26:11
|
This was an interesting case. This needs some explanation: the first loop "for (i=0xff; --i; ) { body }" was translated into "i=0xff; while (--i) { body }" wich isn't really a loop but a simple ifx and a goto (as is ofcourse the outer while loop). So the preheader of the second loop "for (j=0xff; --j; ) { body }" was moved out side the first loop. This really confused addToExitsMarkDepth(), which refused to increase the loop Depth and therefore limited the live range of the loop variables to where the body begins (unless ofcourse the var was used inside the body but only up untill that point). Anyway, I did something in SDCCloop.c:addToExitsMarkDepth():1.16 that makes sense to me. Johan P.S. and I disabled the stupid fix for bug #467035, so it's there again for all to see ----- Original Message ----- From: <no...@so...> To: <no...@so...> Sent: Wednesday, October 10, 2001 3:22 AM Subject: [sdcc - Open Discussion] Does sdcc produce correct code? > > Read and respond to this message at: > http://sourceforge.net/forum/message.php?msg_id=246354 > By: sault > > I am having serious problems. Just started using sdcc with an 8051 as the target. > Works sometimes, not others. I have found a piece of code C code for which the > compiler does not appear to produce correct assembly - creating an infinite > loop. Both sdcc 2.2.1 and 2.3.0 do the same - they use the r3 register for both > the inner and outer loop or a delay. P2 lines are connected to 8 LEDs so I should > see binary counting. > > > #include <at89x52.h> > #include <stdio.h> > int > main() > { > unsigned char i, j, c = 0; > > while (1) { > P2 = c++; > > for (i = 0xff; --i; ) { > for (j = 0xff; --j; ); > } > } > } > > > > > ; ----------------------------------------- > ; function main > ; ----------------------------------------- > _main: > ar2 = 0x02 > ar3 = 0x03 > ar4 = 0x04 > ar5 = 0x05 > ar6 = 0x06 > ar7 = 0x07 > ar0 = 0x00 > ar1 = 0x01 > > mov r2,#0x00 > 00102$: > mov _P2,r2 > inc r2 > mov r3,#0xFF > 00107$: > dec r3 > mov a,r3 > jz 00102$ > 00117$: > mov r3,#0xFF > 00104$: > dec r3 > mov a,r3 > jz 00107$ > 00118$: > sjmp 00104$ > 00110$: > ret > > ;----- > > The problem goes away if the time wasting loop is written as: > > for (i = 0xff; i; i--) { > for (j = 0xff; j; j--); > } > > because it then uses two different registers for outer and inner loops. The > compiler does even stranger things if written as: > > for (i = 0xff; i--; ) { > for (j = 0xff; j--; ); > } > > by putting in useless assembly expressions. > > Am I expecting too much of this compiler? How should one write C code to work > with this compiler? > > Saul. > > ______________________________________________________________________ > You are receiving this email because you elected to monitor this forum. > To stop monitoring this forum, login to SourceForge and visit: > http://sourceforge.net/forum/monitor.php?forum_id=1864 > |