日本中のバイナリアンを虜にしてやまない (誇張あり) コンパイラ基盤技術である LLVM の記念すべき第一回勉強会に参加してきた。
- http://lucille.atso-net.jp/blog/?p=577
- http://groups.google.co.jp/group/llvm_study/web/%E7%AC%AC%E4%B8%80%E5%9B%9E+llvm+%E5%8B%89%E5%BC%B7%E4%BC%9A
いつものどおり気になったところだけまとめておく。
LLVM Intro
- ベクトル命令に対応しているため CG に有効である。
- iPhone SDK でも利用されている。
- ARM backend の充実につながった。
- デモ
% llvm-gcc -emit-llvm ... # 生成される .o が LLVM bitcode % llvm-dis ... # .o から .ll が生成される % llc ... # .o から .s が生成される (-march=... でターゲットを変更できる) % opt -std-compile-opts ... # bitcode での最適化をする
- llvm-gcc は内部的に GIMPLE から LLVM IR を生成しているため、llvm-gcj のような他の言語の frontend も比較的容易にできそう。
- binutils 的なツールも LLVM 用のものを自前で持っている。
- リンク時最適化のため?
- 実行時プロファイルをフィードバックする機能は未実装。
- 「ゆりかごから墓場まで」を謳っているのだから、将来的には実装するはず。
- C へ書き戻すと、今まで人が目で見てやっていた最適化さえも自動化できそう。
iPhone のファームが LLVM で生成された a.out で、iPhone 上でプロファイルを採取して、iTunes 側で LLVM が接続時にプロファイル情報を元にファームを最適化とかしたら便利なのか?とか妄想した。
Adding LLVM JIT facility to your program
- JIT のメモリ管理 (emitted code を置く領域) もユーザが設定できる。
- という割りに資源管理が緩いってどういう意味?
- メモリが足りないとすぐに落ちるとかセキュアな API になっていないという意味。
- The Pure Programming Language が参考になる。
Partial evaluation with LLVM
LLVM first steps
- IEEE754 では正確に表現することができない値を含むコードは llvm-asm ではコンパイルエラーを出す。
An LLVM benchmark
py2llvm: Python to LLVM translator
- ターゲットはシェーダ。
バイナリだけが出力じゃない
- Function での最適化が CSE とかいわゆる命令レベルでの最適化、Module での最適化はインライン展開などの IPO と理解しておけば良いのかな?
- phi はよく assert にかかるらしい。
- bitcode は「人間が書くものじゃない」
質問タイム (と懇親会)
- C のラッパーがあるらしい。
- frontend はあるけど、pass (最適化部) はないみたい。
- 新命令追加などでセキュアな機構を導入する流れがある。
- HPC 分野への応用例とかある?
- 中に Cray の人がいるので、backend があるかもしれない。
- pass の add に追加した順番で最適化機能は呼ばれる。
- あらかじめ必要な情報 (def-use とか支配木の情報のこと?) の依存があるため、順番を気にする必要がある。(あればそのまま、なければ生成するような機構にするべきだと思うけど。)