ttの日記: ああなんか自信なくなってきた 2
日記 by
tt
ので、偉い人教えてください。
extern const int s1bits[16], s2bits[16];
void
scfsi_calc(int *p, int s1, int s2, int c1, int c2)
{
int i;
for (i = 0; i < 16; i++) {
if (s1 <= s1bits[i] && s2 <= s2bits[i]) {
int c = s1bits[i] * c1 + s2bits[i] * c2;
if (p[0] > c) {
p[0] = c;
p[1] = i;
}
}
}
}
ってのを、ix86向けにコンパイルしたgcc3.4に、-O -funswitch-loops (あるいは-O3)というコンパイルオプションをつけてコンパイルすると、間違えたコードが生成されます。どうも、s1bits[]とかs2bits[]の全要素が同じ値であると仮定したようなコードになります。-funswitch-loops がなければ問題はおきません。
ところが、一番最初の外部変数の宣言文を
extern int s1bits[16], s2bits[16];
だとか
const int s1bits[16], s2bits[16];
だとかにすると、正しいコードになります。
もしかして、extern const って、そんな意味あったんでしょうか…(汗)。
extern const int s1bits[16], s2bits[16];
void
scfsi_calc(int *p, int s1, int s2, int c1, int c2)
{
int i;
for (i = 0; i < 16; i++) {
if (s1 <= s1bits[i] && s2 <= s2bits[i]) {
int c = s1bits[i] * c1 + s2bits[i] * c2;
if (p[0] > c) {
p[0] = c;
p[1] = i;
}
}
}
}
ってのを、ix86向けにコンパイルしたgcc3.4に、-O -funswitch-loops (あるいは-O3)というコンパイルオプションをつけてコンパイルすると、間違えたコードが生成されます。どうも、s1bits[]とかs2bits[]の全要素が同じ値であると仮定したようなコードになります。-funswitch-loops がなければ問題はおきません。
ところが、一番最初の外部変数の宣言文を
extern int s1bits[16], s2bits[16];
だとか
const int s1bits[16], s2bits[16];
だとかにすると、正しいコードになります。
もしかして、extern const って、そんな意味あったんでしょうか…(汗)。
バグでしょ (スコア:0)
Re:バグでしょ (スコア:1)
ということで、安心してレポートあげたいと思います。どうもありがとうございました。
-- Takehiro TOMINAGA // may the source be with you!