最適化せずに、リンクされたリストの値から配列を作成するのに最適なコードがあります。最適化 (-02) を有効にすると、配列の最初の値は正しく読み込まれますが、後続の値はすべて正しく表示されません (無効なメモリ範囲)。
typedef struct lineInfo_s lineInfo_t;
struct lineInfo_s{
unsigned short * lineBuffer;
volatile lineInfo_t * next;
volatile lineInfo_t * prev;
};
static unsigned char blankLine[72]; //Use this when no entry in linked list
static void foo(lineInfo_t * lineAddr) {
unsigned char * lines[6];
bool noNext = lineAddr->next==0UL;
bool noNextNext = true;
if(!noNext) noNextNext = (lineAddr->next)->next==0UL;
...
//Load the Array
lines[0] = (unsigned char*)lineAddr->lineBuffer;
lines[1] = (noNext)? blankLine:(unsigned char*)(lineAddr->next->lineBuffer);
lines[2] = ((noNext||noNextNext)? blankLine:(unsigned char*)(lineAddr->next)->next->lineBuffer);
lines[3] = (lineAddr->prev==0UL)? blankLine:(unsigned char*)(lineAddr->prev->lineBuffer);
//Print results
printf("%08X %08X %08X %08X", lines[0], lines[1], lines[2], lines[3]);
...
}
これが正しく最適化されない理由について明らかなことはありますか?