Search in @omasanori
Masanori Ogino 𓀁 Masanori Ogino 𓀁 reblogged at 6 years ago

雪餅💫 YUKIMOCHI@toot.yukimochi.jp

末代鯖の参加を鯖の物理距離を近くしてお待ちしています。(フランス -> 東京)

Masanori Ogino 𓀁 omasanori@mstdn.maud.io

ニコニコをCoqで証明してみた / Yosh さん - ニコナレ niconare.nicovideo.jp/watch/kn

Masanori Ogino 𓀁 omasanori@mstdn.maud.io

件、とにかくやりたいからやりたい以上の理由がなさそうな気がしてきた

Masanori Ogino 𓀁 Masanori Ogino 𓀁 reblogged at 6 years ago

Masanori Ogino 𓀁 omasanori@mstdn.maud.io

ちゃんとバグと戦って

Masanori Ogino 𓀁 omasanori@mstdn.maud.io

「バグトラッカーなど要らぬ。お前にとって戦う相手とは、自身のイメージに他ならない」

Masanori Ogino 𓀁 Masanori Ogino 𓀁 reblogged at 6 years ago

ザ・フライ ahiru@social.mikutter.hachune.net

Undefined
Behavior
Works

Masanori Ogino 𓀁 omasanori@mstdn.maud.io

例のようなコードそのものを書く人はあまりいないけれど、あれこれやっているうちに事実上これと同じコードになってアというのはありがち

Masanori Ogino 𓀁 omasanori@mstdn.maud.io

blog.llvm.org/2011/05/what-eve の例はこれですね。

void contains_null_check(int *P) {
 int dead = *P;
 if (P == 0) return;
 *P = 4;
}

このコードに「不要なNULLチェックを削除する」最適化を行うと、int dead = *P;という(PがNULLだとその時点で止まる)文があることから、if (P == 0) return;に到達する場合はチェックせずともNULLでないことは明らかなので if (P == 0) return;が消えます。
その後で「使われていない変数を削除する」最適化を行うとint dead = *P;も消えます。

void contains_null_check(int *P) {
 *P = 4;
}

結果、NULLチェックがあったはずのコードからNULLチェックが消えます。何が悪かったかというと最適化の順番……ではなく、int dead = *P;が悪い

Masanori Ogino 𓀁 omasanori@mstdn.maud.io

以前ここに貼ったけど、GCCとClangで最適化パスの適用順序が違うので、さっきの記事の2回目 blog.llvm.org/2011/05/what-eve に登場するある順番で最適化するとNULLチェックが吹っ飛ぶけど別の順番で最適化するとNULLチェックが残るという例は実際に起きる

Masanori Ogino 𓀁 omasanori@mstdn.maud.io

LLVM Project Blog: What Every C Programmer Should Know About Undefined Behavior #1/3 blog.llvm.org/2011/05/what-eve

最初の話については(以前も紹介したけど)この3回シリーズを読むと良いよ

Masanori Ogino 𓀁 omasanori@mstdn.maud.io

2番目の話についてはコンパイラにコントリビューションしよう以外に言うことがない

Masanori Ogino 𓀁 omasanori@mstdn.maud.io

その通り

Masanori Ogino 𓀁 Masanori Ogino 𓀁 reblogged at 6 years ago

かるばぶ babukaru

本の虫: なんでGCCはa*a*a*a*a*a を (a*a*a)*(a*a*a) に最適化できないの?っと cpplover.blogspot.com/2014/03/

まさにこれの話ぽそう?

Masanori Ogino 𓀁 omasanori@mstdn.maud.io

最初の話についてはコンパイラのバージョンを上げると壊れたり、コンパイラを変える(GCCからClangとか)と壊れたり、最適化レベルを上げると壊れたり、コンパイラのバージョンも最適化レベルも同じでも出力コードのCPUアーキテクチャが違うとアーキテクチャ依存の最適化パスが切り替わって壊れたり、ありとあらゆるタイミングで壊れる可能性があるのでUBはやめようねという話

Masanori Ogino 𓀁 omasanori@mstdn.maud.io

最後の話についてもう少し話すと、数学の授業で習うa * (b + c) = a * b + a * cのような恒等式で表される式変形がプログラミング言語が提供している整数型や浮動小数点数型の式でも必ず成り立つとは限らないのですが、-ffast-mathのようなオプションはあたかも必ず成り立つかのように式変形をして計算を高速化する代わりに結果が元の式と別の値になったりならなかったりします

Masanori Ogino 𓀁 omasanori@mstdn.maud.io

コードに問題がある場合もある(たとえば、世の中のC言語のコードにはしばしば言語仕様上動くことが保証されていない記述が含まれている)し、最適化にバグがある場合もあるし、強い最適化の中には言語仕様上許されていないコード変換を行うもの(GCCの-ffast-mathなど)もあって、これを使うと言語仕様によればある結果が確実に得られるコードも別の結果を得るようになって壊れることがある

Masanori Ogino 𓀁 Masanori Ogino 𓀁 reblogged at 6 years ago

かるばぶ babukaru

そういえばどうして最適化を強くすると動かなくなるんだろう あれは実際コードがわるいものなの それとも最適化側がわるいものなの

Masanori Ogino 𓀁 omasanori@mstdn.maud.io

ICARUS Neutrino Detector Installation at Fermilab youtu.be/1Qmr7WEKy-Q