From: SourceForge.net <no...@so...> - 2003-09-04 18:04:31
|
Bugs item #800609, was opened at 2003-09-04 20:04 Message generated for change (Tracker Item Submitted) made by Item Submitter You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=800609&group_id=599 Category: Icode generator Group: None Status: Open Resolution: None Priority: 5 Submitted By: Pavel Pisa (ppisa) Assigned to: Nobody/Anonymous (nobody) Summary: Too intrusive loop order reversal code Initial Comment: I have tested CVS-2003-08-31 sources for MCS51 target. Invocation line sdcc ulad21.c --model-large --xram-loc 0x8480 --code-loc 0x8800 --data-loc 0x28 --idata-loc 0x80 --stack-loc 0xC0 The compiler output: ulad21.c:129: warning: in function xdata_test unreferenced function argument : 'stop' ulad21.c:294: warning: conditional flow changed by optimizer 'ulad21.c(294)':so said EVELYN the modified DOG ulad21.c:294: warning: conditional flow changed by optimizer 'ulad21.c(244)':so said EVELYN the modified DOG ulad21.c:294: warning: 'auto' variable 'led_delay' may be used before initialization at ulad21.c(245) ulad21.c:294: warning: unreachable code ulad21.c(245) ulad21.c:294: warning: unreachable code ulad21.c(247) The order of the next loop has been incorrectly reversed. for(i=0;i<20;i++){ uc=i; if(ul_write(ul_fd,&uc,1)!=1) printf("ul_write failed\n"); } The function ul_write(ul_fd,&uc,1) takes data block from memory pointed by second argument. The series of call should write bytes 0,1,2,3...,19, but 19,18,...,0 has been obtained. The function prototype ul_write(UL_ARGPTRTYPE const void *buffer, size_t size) reentrant; I can send full sources or try to narrow them down into minimal bug triggering sample. The code is part of bigger project. I am trying to prepare SDCC glue to use my assembly uLAN RS-485 network from C code. The previous version has been already used by my colleague from C application under Keil compiller. More about uLAN and PC side drivers at http://cmp.felk.cvut.cz/~pisa/ulan/ul_drv.html The result of my project should be Assembly resulting code follows ;ulad21.c:265: for(i=0;i<20;i++){ ; genAssign ; Peephole 230 replaced inefficient 16 bit constant mov dptr,#_main_i_1_1 mov a,#0x14 movx @dptr,a inc dptr clr a movx @dptr,a mov dptr,#_main_i_1_1 00155$: ;ulad21.c:266: uc=i; ; genAssign mov dptr,#_main_i_1_1 movx a,@dptr mov r2,a inc dptr movx a,@dptr mov r3,a ; genMinus ; genMinusDec mov a,r2 add a,#0xff mov r4,a mov a,r3 addc a,#0xff mov r5,a ; genCast mov _main_sloc0_1_0,r4 ; genAssign mov dptr,#_main_uc_1_1 mov a,_main_sloc0_1_0 movx @dptr,a ;ulad21.c:267: if(ul_write(ul_fd,&uc,1)!=1) ; genIpush push ar2 push ar3 push ar4 push ar5 mov a,#0x01 push acc ; Peephole 181 changed mov to clr clr a push acc ; genCall ; Peephole 182.a used 16 bit load of DPTR mov dptr,#_main_uc_1_1 lcall _ul_write mov _main_sloc1_1_0,dpl mov (_main_sloc1_1_0 + 1),dph dec sp dec sp pop ar5 pop ar4 pop ar3 pop ar2 ; genCmpEq mov a,_main_sloc1_1_0 cjne a,#0x01,00201$ mov a,(_main_sloc1_1_0 + 1) jnz 00201$ mov a,#0x01 sjmp 00202$ 00201$: clr a 00202$: ; genIfx ; genIfxJump ; Peephole 109 removed ljmp by inverse jump logic jnz 00134$ 00203$: ;ulad21.c:268: printf("ul_write failed\n"); ; genIpush push ar2 push ar3 push ar4 push ar5 mov a,#__str_11 push acc mov a,#(__str_11 >> 8) push acc mov a,#0x02 push acc ; genCall lcall _printf dec sp dec sp dec sp pop ar5 pop ar4 pop ar3 pop ar2 00134$: ; genAssign mov dptr,#_main_i_1_1 movx a,@dptr mov r1,a inc dptr movx a,@dptr mov r6,a ; genMinus ; genMinusDec mov a,r1 add a,#0xff mov r7,a mov a,r6 addc a,#0xff mov r0,a ; genAssign mov dptr,#_main_i_1_1 mov a,r7 movx @dptr,a inc dptr mov a,r0 movx @dptr,a ;ulad21.c:265: for(i=0;i<20;i++){ ; genIfx mov a,r7 orl a,r0 ; genIfxJump jz 00204$ ljmp 00155$ 00204$: ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=800609&group_id=599 |
From: SourceForge.net <no...@so...> - 2003-09-05 05:16:00
|
Bugs item #800609, was opened at 2003-09-04 13:04 Message generated for change (Comment added) made by epetrich You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=800609&group_id=599 Category: Icode generator >Group: fixed >Status: Closed >Resolution: Fixed Priority: 5 Submitted By: Pavel Pisa (ppisa) >Assigned to: Erik Petrich (epetrich) Summary: Too intrusive loop order reversal code Initial Comment: I have tested CVS-2003-08-31 sources for MCS51 target. Invocation line sdcc ulad21.c --model-large --xram-loc 0x8480 --code-loc 0x8800 --data-loc 0x28 --idata-loc 0x80 --stack-loc 0xC0 The compiler output: ulad21.c:129: warning: in function xdata_test unreferenced function argument : 'stop' ulad21.c:294: warning: conditional flow changed by optimizer 'ulad21.c(294)':so said EVELYN the modified DOG ulad21.c:294: warning: conditional flow changed by optimizer 'ulad21.c(244)':so said EVELYN the modified DOG ulad21.c:294: warning: 'auto' variable 'led_delay' may be used before initialization at ulad21.c(245) ulad21.c:294: warning: unreachable code ulad21.c(245) ulad21.c:294: warning: unreachable code ulad21.c(247) The order of the next loop has been incorrectly reversed. for(i=0;i<20;i++){ uc=i; if(ul_write(ul_fd,&uc,1)!=1) printf("ul_write failed\n"); } The function ul_write(ul_fd,&uc,1) takes data block from memory pointed by second argument. The series of call should write bytes 0,1,2,3...,19, but 19,18,...,0 has been obtained. The function prototype ul_write(UL_ARGPTRTYPE const void *buffer, size_t size) reentrant; I can send full sources or try to narrow them down into minimal bug triggering sample. The code is part of bigger project. I am trying to prepare SDCC glue to use my assembly uLAN RS-485 network from C code. The previous version has been already used by my colleague from C application under Keil compiller. More about uLAN and PC side drivers at http://cmp.felk.cvut.cz/~pisa/ulan/ul_drv.html The result of my project should be Assembly resulting code follows ;ulad21.c:265: for(i=0;i<20;i++){ ; genAssign ; Peephole 230 replaced inefficient 16 bit constant mov dptr,#_main_i_1_1 mov a,#0x14 movx @dptr,a inc dptr clr a movx @dptr,a mov dptr,#_main_i_1_1 00155$: ;ulad21.c:266: uc=i; ; genAssign mov dptr,#_main_i_1_1 movx a,@dptr mov r2,a inc dptr movx a,@dptr mov r3,a ; genMinus ; genMinusDec mov a,r2 add a,#0xff mov r4,a mov a,r3 addc a,#0xff mov r5,a ; genCast mov _main_sloc0_1_0,r4 ; genAssign mov dptr,#_main_uc_1_1 mov a,_main_sloc0_1_0 movx @dptr,a ;ulad21.c:267: if(ul_write(ul_fd,&uc,1)!=1) ; genIpush push ar2 push ar3 push ar4 push ar5 mov a,#0x01 push acc ; Peephole 181 changed mov to clr clr a push acc ; genCall ; Peephole 182.a used 16 bit load of DPTR mov dptr,#_main_uc_1_1 lcall _ul_write mov _main_sloc1_1_0,dpl mov (_main_sloc1_1_0 + 1),dph dec sp dec sp pop ar5 pop ar4 pop ar3 pop ar2 ; genCmpEq mov a,_main_sloc1_1_0 cjne a,#0x01,00201$ mov a,(_main_sloc1_1_0 + 1) jnz 00201$ mov a,#0x01 sjmp 00202$ 00201$: clr a 00202$: ; genIfx ; genIfxJump ; Peephole 109 removed ljmp by inverse jump logic jnz 00134$ 00203$: ;ulad21.c:268: printf("ul_write failed\n"); ; genIpush push ar2 push ar3 push ar4 push ar5 mov a,#__str_11 push acc mov a,#(__str_11 >> 8) push acc mov a,#0x02 push acc ; genCall lcall _printf dec sp dec sp dec sp pop ar5 pop ar4 pop ar3 pop ar2 00134$: ; genAssign mov dptr,#_main_i_1_1 movx a,@dptr mov r1,a inc dptr movx a,@dptr mov r6,a ; genMinus ; genMinusDec mov a,r1 add a,#0xff mov r7,a mov a,r6 addc a,#0xff mov r0,a ; genAssign mov dptr,#_main_i_1_1 mov a,r7 movx @dptr,a inc dptr mov a,r0 movx @dptr,a ;ulad21.c:265: for(i=0;i<20;i++){ ; genIfx mov a,r7 orl a,r0 ; genIfxJump jz 00204$ ljmp 00155$ 00204$: ---------------------------------------------------------------------- >Comment By: Erik Petrich (epetrich) Date: 2003-09-05 00:15 Message: Logged In: YES user_id=635249 This loop reversal problem is now fixed in src/SDCCast.c 1.186 However, I am puzzled by the code generated for the ul_write(ul_fd,&uc,1) function call. It appears that ul_fd is not being passed to ul_write and I can't reproduce this behaviour (but I am having to guess how your variables are declared). Perhaps the function call was actually ul_write(&uc,1)? If this aspect of the bug report is accurate (the ul_fd parameter is being lost), please open a new bug report for it and include enough source code to reproduce the problem. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=800609&group_id=599 |
From: SourceForge.net <no...@so...> - 2003-09-05 07:56:47
|
Bugs item #800609, was opened at 2003-09-04 20:04 Message generated for change (Comment added) made by ppisa You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=800609&group_id=599 Category: Icode generator Group: fixed Status: Closed Resolution: Fixed Priority: 5 Submitted By: Pavel Pisa (ppisa) Assigned to: Erik Petrich (epetrich) Summary: Too intrusive loop order reversal code Initial Comment: I have tested CVS-2003-08-31 sources for MCS51 target. Invocation line sdcc ulad21.c --model-large --xram-loc 0x8480 --code-loc 0x8800 --data-loc 0x28 --idata-loc 0x80 --stack-loc 0xC0 The compiler output: ulad21.c:129: warning: in function xdata_test unreferenced function argument : 'stop' ulad21.c:294: warning: conditional flow changed by optimizer 'ulad21.c(294)':so said EVELYN the modified DOG ulad21.c:294: warning: conditional flow changed by optimizer 'ulad21.c(244)':so said EVELYN the modified DOG ulad21.c:294: warning: 'auto' variable 'led_delay' may be used before initialization at ulad21.c(245) ulad21.c:294: warning: unreachable code ulad21.c(245) ulad21.c:294: warning: unreachable code ulad21.c(247) The order of the next loop has been incorrectly reversed. for(i=0;i<20;i++){ uc=i; if(ul_write(ul_fd,&uc,1)!=1) printf("ul_write failed\n"); } The function ul_write(ul_fd,&uc,1) takes data block from memory pointed by second argument. The series of call should write bytes 0,1,2,3...,19, but 19,18,...,0 has been obtained. The function prototype ul_write(UL_ARGPTRTYPE const void *buffer, size_t size) reentrant; I can send full sources or try to narrow them down into minimal bug triggering sample. The code is part of bigger project. I am trying to prepare SDCC glue to use my assembly uLAN RS-485 network from C code. The previous version has been already used by my colleague from C application under Keil compiller. More about uLAN and PC side drivers at http://cmp.felk.cvut.cz/~pisa/ulan/ul_drv.html The result of my project should be Assembly resulting code follows ;ulad21.c:265: for(i=0;i<20;i++){ ; genAssign ; Peephole 230 replaced inefficient 16 bit constant mov dptr,#_main_i_1_1 mov a,#0x14 movx @dptr,a inc dptr clr a movx @dptr,a mov dptr,#_main_i_1_1 00155$: ;ulad21.c:266: uc=i; ; genAssign mov dptr,#_main_i_1_1 movx a,@dptr mov r2,a inc dptr movx a,@dptr mov r3,a ; genMinus ; genMinusDec mov a,r2 add a,#0xff mov r4,a mov a,r3 addc a,#0xff mov r5,a ; genCast mov _main_sloc0_1_0,r4 ; genAssign mov dptr,#_main_uc_1_1 mov a,_main_sloc0_1_0 movx @dptr,a ;ulad21.c:267: if(ul_write(ul_fd,&uc,1)!=1) ; genIpush push ar2 push ar3 push ar4 push ar5 mov a,#0x01 push acc ; Peephole 181 changed mov to clr clr a push acc ; genCall ; Peephole 182.a used 16 bit load of DPTR mov dptr,#_main_uc_1_1 lcall _ul_write mov _main_sloc1_1_0,dpl mov (_main_sloc1_1_0 + 1),dph dec sp dec sp pop ar5 pop ar4 pop ar3 pop ar2 ; genCmpEq mov a,_main_sloc1_1_0 cjne a,#0x01,00201$ mov a,(_main_sloc1_1_0 + 1) jnz 00201$ mov a,#0x01 sjmp 00202$ 00201$: clr a 00202$: ; genIfx ; genIfxJump ; Peephole 109 removed ljmp by inverse jump logic jnz 00134$ 00203$: ;ulad21.c:268: printf("ul_write failed\n"); ; genIpush push ar2 push ar3 push ar4 push ar5 mov a,#__str_11 push acc mov a,#(__str_11 >> 8) push acc mov a,#0x02 push acc ; genCall lcall _printf dec sp dec sp dec sp pop ar5 pop ar4 pop ar3 pop ar2 00134$: ; genAssign mov dptr,#_main_i_1_1 movx a,@dptr mov r1,a inc dptr movx a,@dptr mov r6,a ; genMinus ; genMinusDec mov a,r1 add a,#0xff mov r7,a mov a,r6 addc a,#0xff mov r0,a ; genAssign mov dptr,#_main_i_1_1 mov a,r7 movx @dptr,a inc dptr mov a,r0 movx @dptr,a ;ulad21.c:265: for(i=0;i<20;i++){ ; genIfx mov a,r7 orl a,r0 ; genIfxJump jz 00204$ ljmp 00155$ 00204$: ---------------------------------------------------------------------- >Comment By: Pavel Pisa (ppisa) Date: 2003-09-05 09:56 Message: Logged In: YES user_id=523128 Thanks very much for your care. > Perhaps the function call was actually ul_write(&uc,1)? You are right, it is my fault. I am trying to have same api and function prototypes for PC and MCS51, but lower level implementation on MCS51 does not support multiple opens (more fd) => I use macros to eliminate unnecessary argument ul_fd, but I did not want to complicate report, so I have striped this down, but forgot to delete ul_fd from prototype. Thanks again. ---------------------------------------------------------------------- Comment By: Erik Petrich (epetrich) Date: 2003-09-05 07:15 Message: Logged In: YES user_id=635249 This loop reversal problem is now fixed in src/SDCCast.c 1.186 However, I am puzzled by the code generated for the ul_write(ul_fd,&uc,1) function call. It appears that ul_fd is not being passed to ul_write and I can't reproduce this behaviour (but I am having to guess how your variables are declared). Perhaps the function call was actually ul_write(&uc,1)? If this aspect of the bug report is accurate (the ul_fd parameter is being lost), please open a new bug report for it and include enough source code to reproduce the problem. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=800609&group_id=599 |