
okkyの日記: COMPILER EXPLORER 1
日記 by
okky
なんか10回位アドレスを調べなおしているので、もうここに書いておこう。
このページ、今時のコンパイラがどういうコードを吐くか知りたいときに便利です。
例えばこれ:
https://godbolt.org/z/6q5fhj
from, to を整数で与えると、from .. to の間の数字の話を求めて printf() で出してくれるという、要するに有名なガウスの等差級数の和を求める話を一般化した奴なのだが。
見ての通り、アセンブラ側にループが無い。
今時のコンパイラ、等差級数の和ごときは自動検出して、いきなり公式に当てはめてしまうのだ。
こうなると、何をどう書いた時に「コンパイラがそのアルゴリズムを知らなくて」素直に書かれた通りのコードを出すのか、どう書いた時は
「ふふん、そんなの私はお見通しですよ」
と全然違うコードを出してくるのか、正直判らない。で、コンパイラが見抜けるものについては「わかりやすい」「コンパイラが最適化のためのパターンを見つけやすい」書き方の方が、凝ったアルゴリズムを直接書くよりも良い、と言う事になりかねない。
そしてそういう議論をするときには、
「こういうコードが出ているんだからこう書いた方が良い」
的な内容を皆で共有するには、こういうページを使った方が便利なのだ(少し変更したらどうなるか、とか気になるポイントを各々実験できるから)。
すげえ.... (スコア:1)
gccとclang の出し方が違うとか、バージョンによって結構差があるとか実に興味深いです。
gcc は途中からxmmレジスタ使うようになったみたいですが、そっちの方が速いのかな。
ただ、こういうソースの意味を読む、というコンパイラの動作は、スーパーコンピュータの世界ではずいぶんと前からやってたような気がします(ソースは記憶)。Fortranですけど。