gcc のバグ?

QT を arm用にコンパイルしていたらうまく動かないことがわかった。
どうやら、コンパイラがバグっているようだ。(疑心暗鬼だが、、、)

bool QLinuxFbScreen::useOffscreen()
{
    if ((mapsize - size) < 16*1024)
        return false;

    return true;
}

このコードを次のようにはく。

ldr r0, [r0, #1084]
ldr r3, [r0, #1080]
sub r0, r3, r0

r0 は隠された引数で this にあたる。
r0 から #1084 のオフセットは恐らく mapsize
r0 から #1080 のオフセットは恐らく size

確かに struct でそうなっている。

    int size;               // Screen size
    int mapsize;       // Total mapped memory

上のアセンブラコードだと r0 を書きつぶす。
C 風に書けば

r0 = this;

r0 = r0->mapsize;
r3 = r0->size;

いくつかの gcc (4.1.2, 4.2.4, 4.3.3) で試したが変わらない。gcc の arm.md にその記述があるところまでは追ったが、依存関係の記述問題にあたるので gnu に登録しておしまい。
とりあえず -O0 で回避。これでやっと armadillo 500FX で QT が動くようになった。