いけむランド

はてダからやってきました

「第一回 LLVM 勉強会」に行ってきた

日本中のバイナリアンを虜にしてやまない (誇張あり) コンパイラ基盤技術である LLVM の記念すべき第一回勉強会に参加してきた。


いつものどおり気になったところだけまとめておく。

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 とか支配木の情報のこと?) の依存があるため、順番を気にする必要がある。(あればそのまま、なければ生成するような機構にするべきだと思うけど。)