From: SourceForge.net <no...@so...> - 2007-07-07 10:23:17
|
Bugs item #1739475, was opened at 2007-06-18 21:29 Message generated for change (Comment added) made by nobody You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1739475&group_id=599 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: Icode generator Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Stas Sergeev (stsp) Assigned to: Nobody/Anonymous (nobody) Summary: pointer double-dereference doesn't work Initial Comment: Hi. The following (also attached) code miscompiles: --- idata volatile unsigned char t = 3; idata volatile unsigned char a = (unsigned char)&t; idata volatile unsigned char b = 0; idata volatile unsigned char c = (unsigned char)&b; unsigned char main() { idata unsigned char * idata unsigned char *p = (idata unsigned char * idata unsigned char *)(c - 1); #define BUG 1 #if BUG return **p; #else idata volatile unsigned char *tmp = *p; return *tmp; #endif } --- The asm looks like this: --- ; ddptr.c:8: idata unsigned char * idata unsigned char *p = mov r0,#_c mov ar2,@r0 mov r3,#0x00 dec r2 cjne r2,#0xff,00103$ dec r3 00103$: ; ddptr.c:12: return **p; ----------------- BUG! ------------------ mov ar0,@r0 mov ar2,@r0 mov dpl,r2 ret --- Where I put "BUG!", obviously "mov r0, r2" is missing. The test-case should return 3, but returns 0. Define BUG to 0 to get the correct result. ---------------------------------------------------------------------- Comment By: Nobody/Anonymous (nobody) Date: 2007-07-07 03:23 Message: Logged In: NO the actual problem seems to be peephole rule 177.c the unoptimized code contains the sequence: mov ar0,r2 mov ar0,@r0 and rule 177.c will match: replace { mov %1,%2 mov %1,%3 } by { ; Peephole 177.c removed redundant mov mov %1,%3 } if notVolatile %1 %2 this rule doesn't check for %3 beeing independent of %1 here %1 is r0, and %3 is @r0 Robert Larice larice 0x40 vidisys 0x2e de ---------------------------------------------------------------------- Comment By: Nobody/Anonymous (nobody) Date: 2007-07-07 02:20 Message: Logged In: NO for debuging purpose the offending code can be reduced to char foo(unsigned char c) { return ** ((idata char * idata *) c); } compilation with sdcc --no-peep --fverbose-asm -c -mmcs51 generates correct code: ; genReceive mov r2,dpl ; bug-4a.c:3: return ** ((idata char * idata *) c); ; genCast mov ar0,r2 ; genPointerGet ; genNearPointerGet mov ar0,@r0 ; genPointerGet ; genNearPointerGet mov ar2,@r0 ; genRet mov dpl,r2 00101$: ret but without no-peep, incorrect code is generated ; genReceive ; Peephole 301 mov r2,dpl removed ; bug-4a.c:3: return ** ((idata char * idata *) c); ; genCast ; genPointerGet ; genNearPointerGet ; Peephole 177.c removed redundant mov mov ar0,@r0 ; genPointerGet ; genNearPointerGet mov ar2,@r0 ; genRet mov dpl,r2 ; Peephole 500 removed redundant label 00101$ ret the peephole comment ; Peephole 301 mov r2,dpl removed is quite intresting. greetings, Robert Larice larice 0x40 vidisys 0x2e de ---------------------------------------------------------------------- Comment By: Nobody/Anonymous (nobody) Date: 2007-07-06 12:34 Message: Logged In: NO sorry, drop that last comment of mine greetings, Robert Larice larice 0x40 vidisys 0x2e de ---------------------------------------------------------------------- Comment By: Nobody/Anonymous (nobody) Date: 2007-07-06 11:53 Message: Logged In: NO with #4870 the asm looks ok. mov r0,#_c mov ar2,@r0 mov r3,#0x00 dec r2 cjne r2,#0xff,00103$ dec r3 00103$: mov ar0,@r0 mov ar2,@r0 mov dpl,r2 ret greetings, Robert Larice larice 0x40 vidisys 0x2e de ---------------------------------------------------------------------- Comment By: Nobody/Anonymous (nobody) Date: 2007-07-06 11:41 Message: Logged In: NO with #4870 the asm looks ok. mov r0,#_c mov ar2,@r0 mov r3,#0x00 dec r2 cjne r2,#0xff,00103$ dec r3 00103$: mov ar0,@r0 mov ar2,@r0 mov dpl,r2 ret greetings, Robert Larice larice 0x40 vidisys 0x2e de ---------------------------------------------------------------------- Comment By: Patryk (patryks) Date: 2007-06-19 01:54 Message: Logged In: YES user_id=1788180 Originator: NO Reproduced with SDCC #4847. Shouldn't your 'p' definition look like below? idata unsigned char * idata * p = (idata unsigned char * idata *)(c - 1); Anyway it doesn't change the result, but is at least free of syntax errors missed by SDCC. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1739475&group_id=599 |