アカウント名:
パスワード:
リリースされるや否やSPEC 2006ベンチをコンパイルするとぶっ壊れたコード吐く [lwn.net]って騒ぎになってるのに、あえてそちらはスルーしてこのタレコミ人が突っ込んだ-O3 -ffast-mathつけると結果が変わるぞゴラァ [gnu.org]とかいう話の方を取り上げて「バグもすぐ直してくれる」とか結んじゃうんだ…凄えなこのタレコミ人・・・・・・・某ドラッカーじゃないけど、もうちょっと真摯にタレコミしてくれないもんかね
# 「gccって-O3 -ffast-mathつけてビルドして結果が変わったらバグ扱いにしてくれるんだってよ」ってGentoo使いに教えてやりたいね(笑)
Fortranは規格違反のコード書いたら鼻から悪魔が出てもいいなんて頭おかしい仕様じゃないから(むしろそんなのはC/C++くらいだろ)。
そこまで解析して最適化するなら、もうちょっと先まで解析してよとは思いますね※昔は無意味なループ削除とかやらなかったのに…ストールマン曰く「プログラマーは無意味なループを書かない」、今回の最適化はここからかけ離れてますね
ループは削除してないしwhile (1) { f(); if (p()) break; g();}みたいなコードで毎回1と0を比べて欲しいのかい
ループ削除は例です現実的にwhile(1)じゃないコードをwhile(1)扱いしてるのが問題なわけで
規格に則っていない以上、どう解釈されても文句は言えないでしょ。GCCは、配列a[n]のn番目のアクセスしなくていいよう辻褄を合わせただけ。n番目にアクセスしないならi<nの判定式は必要ない。プログラマーは、別の方法でループを抜ける方法を実装できるわけだし、実際している場合もある、その場合判定は2つも要らない。。
フェイルセーフにしなかったって事ですねまあ仕様の穴をどうにかしろって事なんでしょうが、穴のない仕様を作るも結構たいへんですし実装者の趣味・趣向が問われるところですね
プログラマが不正なアクセスしない事を把握した上でコードを簡易化するために配列を「1」オーバーするコードを書く場合もあると思いますが
それは元のコードを見た上で言っているのか?for文の再初期化式の中で、iをインクリメントするのと同時に配列a[i]を変数に代入するなんてことしているから。iがn以上になった直後に不正なアクセスが発生する。当然それをプログラマーが理解していないはずはないから。GCCは無限ループと解釈する
それに勘違いしているみたいだけどさ、未定義動作は単なる仕様の穴ではない、未定義動作が存在するから、コンパイラは強力に最適化を効かせられる面もある。鼻から悪魔が出て来るってのは、その副作用。http://blog-ja.intransient.info/2011/05/c-13.html [intransient.info]
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
ソースを見ろ -- ある4桁UID
gccの初物は危なすぎっていうか… (スコア:-1)
リリースされるや否やSPEC 2006ベンチをコンパイルするとぶっ壊れたコード吐く [lwn.net]って騒ぎになってるのに、あえてそちらはスルーして
このタレコミ人が突っ込んだ-O3 -ffast-mathつけると結果が変わるぞゴラァ [gnu.org]とかいう話の方を取り上げて「バグもすぐ直してくれる」とか結んじゃうんだ…
凄えなこのタレコミ人・・・・・・・
某ドラッカーじゃないけど、もうちょっと真摯にタレコミしてくれないもんかね
# 「gccって-O3 -ffast-mathつけてビルドして結果が変わったらバグ扱いにしてくれるんだってよ」ってGentoo使いに教えてやりたいね(笑)
Re: (スコア:0)
Fortranは規格違反のコード書いたら鼻から悪魔が出てもいいなんて頭おかしい仕様じゃないから(むしろそんなのはC/C++くらいだろ)。
Re: (スコア:0)
そこまで解析して最適化するなら、もうちょっと先まで解析してよとは思いますね
※昔は無意味なループ削除とかやらなかったのに…ストールマン曰く「プログラマーは無意味なループを書かない」、今回の最適化はここからかけ離れてますね
Re: (スコア:0)
ループは削除してないし
while (1) {
f();
if (p()) break;
g();
}
みたいなコードで毎回1と0を比べて欲しいのかい
Re: (スコア:0)
ループ削除は例です
現実的にwhile(1)じゃないコードをwhile(1)扱いしてるのが問題なわけで
Re: (スコア:1)
規格に則っていない以上、どう解釈されても文句は言えないでしょ。
GCCは、配列a[n]のn番目のアクセスしなくていいよう辻褄を合わせただけ。n番目にアクセスしないならi<nの判定式は必要ない。
プログラマーは、別の方法でループを抜ける方法を実装できるわけだし、実際している場合もある、その場合判定は2つも要らない。。
Re: (スコア:0)
フェイルセーフにしなかったって事ですね
まあ仕様の穴をどうにかしろって事なんでしょうが、穴のない仕様を作るも結構たいへんですし
実装者の趣味・趣向が問われるところですね
プログラマが不正なアクセスしない事を把握した上でコードを簡易化するために配列を「1」オーバーするコードを書く場合もあると思いますが
Re:gccの初物は危なすぎっていうか… (スコア:1)
プログラマが不正なアクセスしない事を把握した上でコードを簡易化するために配列を「1」オーバーするコードを書く場合もあると思いますが
それは元のコードを見た上で言っているのか?
for文の再初期化式の中で、iをインクリメントするのと同時に配列a[i]を変数に代入するなんてことしているから。
iがn以上になった直後に不正なアクセスが発生する。
当然それをプログラマーが理解していないはずはないから。GCCは無限ループと解釈する
それに勘違いしているみたいだけどさ、未定義動作は単なる仕様の穴ではない、
未定義動作が存在するから、コンパイラは強力に最適化を効かせられる面もある。鼻から悪魔が出て来るってのは、その副作用。
http://blog-ja.intransient.info/2011/05/c-13.html [intransient.info]