0

最適化せずに、リンクされたリストの値から配列を作成するのに最適なコードがあります。最適化 (-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]);
    ...
}

これが正しく最適化されない理由について明らかなことはありますか?

4

2 に答える 2

-1

このバグは 2 年以上前のものです。私は GCC ARM コンパイラと GCC AVR コンパイラの両方でそれに直面しました。インデックスによる配列要素または構造体の要素に値を代入しようとすると発生します。私が懸念している限り、唯一の解決策は、最適化レベルを最大-O1または最大まで下げることです。-O0

于 2013-10-04T12:56:33.907 に答える