I finally got to the bottom of some "unexpected behavior" from the amreb-linux target of the 4.1.2 compiler.

I'm hoping that someone can say if is this an optimization bug (optimizes away too much) or a problem with this code.

extern int ReadChar( char *p);
/* grab a character from input buffer if available, or make a call to get a chunk */
#define READCHAR(p) \
((p->bufposP >= p->inbufendm1P) ? (ReadChar(p)) : \
(*(unsigned char *)(p->bufposP++)))

   for(bytesread = 0; bytesread < len; bytesread++)
     {
       int ch = READCHAR(p);
       if(ch < 0) break;
       htP->threshP[bytesread] = ch;
       /* discard every other byte. */
       if( READCHAR(p) < 0) break;
     }

With the armeb-linux compiler at -O2, in the second invocation of READCHAR, the compiler optimizes away the load from bufposP AND the post-increment. Its clear that there's no point in doing the load since its only needed to conditionally break out of the loop, and an unsigned char can't be less-than zero. However, can't make up my mind as to whether or not it should be allowed to optimize away the post-increment. For the first invocation of READCHAR, the compiler generates a conditional load byte with post-increment instruction.

This code has worked on perhaps 7 different architectures over that last 10 years, using gcc and serveral other compilers.

Thanks, JB

Reply via email to