[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

egcs bug?



青木@kinotropeです。

PostgreSQLのコンパイルで最適化オプション(-O, -O2)を付けると正常に動作 
しない件をちょっと調べてみました。

問題を簡単にしていくと、下記のようなものになると思います。
プロトタイプ宣言はわざと外しています。

% cat i.c
char
int2eq(short arg1, short arg2)
{
    return arg1 == arg2;
}

% cat t.c
#include <stdio.h>

int main()
{
    short s1 = -2;
    int s2 = 65534;	/* 呼び出し側がintかどうかは未確認ですが */
    extern char int2eq();

    printf("%d == %d: %d\n", s1, s2, int2eq(s1, s2));
}


最適化をかけた場合、 int2eq()は short ではなく int で処理しているよう 
です。
cc -S -O i.c すると、
int2eq:
        xor 3,3,4
        subfic 0,3,0
        adde 3,0,3
        blr

のようになります。


本来int2eq()の呼び出し側でshortを渡すようにすべきですが、まだ追い切れ 
ていません。