LLVM 3.3 リリースノートの訳

半年に一回がんばる日が来ました。例によってLLVMのリリースノートの訳です。
直訳がほとんどなので気になる人は原文を読みましょう。

大きな変更点としてはLoop Vectorizerの改良やAMD GPUのサポートなどがよく言われているようです。
個人的に訳していて気になったのはLDCで、全力で褒めている感じがしました。

このリリースノートを読んでLLVMが気になった人はぜひきつねさんでもわかるLLVMを読みましょう!

イントロダクション(Instroduction)

このドキュメントはLLVMコンパイラ・インフラストラクチャのリリース3.3に関するリリースノートです。前回のリリースからの大きな改善点, サブプロジェクトの改善点, コードの利用者などを含むLLVMの状況を記しています。LLVMリリースの全てはLLVMリリースサイト からダウンロードできます。

LLVMについての最新情報などの詳細はLLVMメインサイト を参照して下さい。疑問や感想などがありましたらLLVM開発者メーリングリスト に投稿して下さい。

SubversionチェックアウトもしくはメインLLVMウェブページからこのファイルを読んでいるなら、このドキュメントには現在のリリースではなく次のリリースが適用されることに注意して下さい。特定のリリースのリリースノートをみたい場合、リリースページ を見て下さい。

本リリースの包括的では無い変更点リスト(Non-comprehensive list of changes in this release)

  • CellCPUポートが削除されました。古いバージョンには含まれたままです。
  • IRレベルの拡張リンカAPI(ビットコードファイルをアーカイブとしてリンクするためなど)が削除されました。これらの機能を使っている既存クライアントは統合LTOサポートを持つリンカを使用するように移行すべきです。
  • LLVMとClangのドキュメントが記述しやすいreStructuredTextを用いるSphinx ドキュメント生成システムに移行しました。詳細な情報はllvm/docs/README.txtを参照して下さい。
  • TargetTransformInfo(TTI)がIRレベルのパスで命令コストなどのターゲット特有の情報を取得するために使われる新しいインタフェースになります。LSRのような"Lowering"パスとvectorizerのみがTTIインフラを使うことを許可されています。
  • X86とARMのコストモデルを改善しました。
  • Attributesクラスを完全に書き直して拡張しました。列挙型やアラインメントだけでなくコード生成へ情報を渡す際に有用な文字列型属性もサポートしています。詳細はHow To Use Attributes を参照して下さい。
  • instruction selectionパターンのためのTableGenの構文が簡略化されました。レジスタクラスを用いて間接的に型を明示するかわりに、入力パターンの中で直接型を明示すべきです。新しい構文の例としてSparcInstrInfo.tdを参照して下さい。レジスタクラスを使う古い構文は依然動作しますが、未来のLLVMリリースで削除されます。
  • MCJITが例外処理をサポートしました。古いJIT(old jit)でのサポートは3.4リリースで削除されます。
  • コマンドラインオプションが -help の出力で表示されるカテゴリにグループ化できるようになりました。Grouping options into categories を参照してください。
  • LLVMコマンドラインサポートライブラリを使用しているライブラリとリンクすることで継承されている -help でのコマンドラインオプションの見え方が実行時に修正できるようになりました。cl::getRegisteredOptions functionを参照して下さい。
AArch64 target

ARMの64ビットアーキテクチャのAArch64のサポートを追加しました。
開発はまだほとんど初期段階であるが、以下の状況でコンパイルが成功することを期待しています。

  • ClangでC99とC++03の標準規格に準拠するものをコンパイルすること
  • ターゲットプラットフォームとしてLinuxを使用すること
  • コードと静的データが4GBを超えないこと(ヒープに割り当てられるデータには制限はありません)

いくつかの追加機能も実装されています。特に注目なのは、DWARFデバッグGNUスタイルのスレッドローカルストレージそしてインラインアセンブリです。

Hexagon Target

今は使われていない古いhexagonv2およびhexagonv3プロセッサアーキテクチャのサポートを廃止しました。現在サポートしているアーキテクチャはhexagonv4とhexagonv5です。

Mips target

新しい機能と改善点は以下の通りです。

  • Clangドライバ
    • Sourcery CodeBench Mips toolchain directories treeのサポート
    • 次の新しいコマンドラインオプションをサポート
      • -mxgot / -mno-xgot
      • -EL /-EB
      • -mmic romips / -mno-micromips
      • -msingle-float / -mdouble-float
      • -mabi=32 (o32 abi) と -mabi=64 (n64 abi)
    • 以前は-mips16, -mmicromips, -mdsp そして -mdspr2 のようなオプションはアセンブラには渡されなかったが、この問題は修正されました。
  • DSP-ASEコード生成の品質を改善するためにいくつかの変更が行われました。
    • 乗算命令と積和演算命令が4つのアキュムレータ全てを使うようになりました。
    • DSP命令がビルトインを使う必要無く出力されるようにInstruction selectionパターンが追加されました。
  • 遅延スロットを埋める命令のために遅延スロットフィルタパスが後続ブロックを検索できるようになりました。(-disable-mips-df-succbb-search=false オプションを使って下さい)
PowerPC Target

新しい機能と改善点は以下の通りです。

  • PowerPCアセンブリパーサをサポートしました。
  • スレッドローカルストレートのサポートが追加されました。 64ビットELFサブターゲットのみです。
  • mediumとlargeのコードモデル(-mcmodel=medium,large)のサポートが追加されました。現在はmediumコードモデルがデフォルトです。64ビットELFサブターゲットのみです。
  • レジスタ割り当て(より少ない予約レジスタ)を改善しました。
  • 64ビットのアトミックなロートとストアがサポートされました。
  • スカラ型のアラインされていないメモリアクセスのためのコード生成を改善しました。
  • -ffast-mathを利用した場合の浮動小数点数型の除算と平方根命令の性能を改善しました。
  • predicated returnをサポートしました。
  • 比較のためのコード生成を改善しました。
  • インラインのsetjmpとlongjmpのサポートが追加されました。
  • PowerISA 2.04, 2.05 そして 2.06 で導入された多くの命令のサポートが追加されました。
  • ベクトル型レジスタのためのスピルコードを改善しました。
  • -mno-altivecのサポートを追加しました。
  • 複素数型パラメータ, 128ビット整数型パラメータ, そしてvarargs関数のためのABI互換性が修正されました。 64ビットELFサブターゲットのみです。
Loop Vectorizer

ループベクトル化(Loop Vectorizer)の開発を続けています。ループベクトル化は現在次の機能を持っています。

  • 未知の繰り返し回数(trip count)のループ
  • ポインタの実行時チェック
  • リダクションとインダクション
  • 整数型のMin/Maxリダクション
  • If変換
  • ポインタ帰納変数
  • リバースイテレータ
  • 混合型のベクトル化
  • 関数呼び出しのベクトル化
  • ベクトル化の部分的アンローリング

ループベクトル化は-O3でデフォルトで有効化されます。

SLP Vectorizer

現在LLVMは新しくSLPベクトル化を持っています。この新しいSLPベクトル化はデフォルトでは有効になりませんが、clangのフラグとして-fslp-vectorizeを利用することで有効になります。BBベクトル化はコマンドラインフラグの-fslp-vectorize-aggressiveを利用することで有効になります。。

R600 Backend

R600バックエンドがこのリリースで追加されました。これはAMD GPU(HD2XXX-HD7XXX)をサポートします。このバックエンドはMesa3D プロジェクトの一部として開発されているAMDオープンソースグラフィック/コンピュートドライバの中で使われています。

SystemZ/s390x Backend

LLVMとclangはIBMの z/Architectreをサポートします。現在、このサポートはGNU/Linux(GNU triplet s390x-linux-gnu)に限定され、z10かそれ以上を必要とします。

Sub-project Status Update

コアとなるLLVM 3.3のプロダクション品質のコンパイラ・インフラストラクチャのディストリビューションに加えて、LLVMプロジェクトはLLVMコアを利用し同じライセンス共有するをサブプロジェクトを含みます。このセクションではこれらのサブプロジェクトの変更点を提供します。

DragonEgg: GCC front-ends, LLVM back-end

DragonEggGCCの最適化機構とコード生成をLLVMのものと置き換えたGCCプラグイン です。gcc-4.5, 4.6, 4.7そして4.8で動作し、x86-32/x86-64とARMプロセッサファミリーをターゲットにできます。Darwin, FreeBSD, KFreeBSD, LinuxそしてOpenBSDプラットフォームで使われています。Ada, C, C++そしてFortranを完全にサポートしています。Go, Java, Obj-CそしてObj-C++は部分的サポートです。gcc-4.6が最もサポートされたバージョンであり、特にgcc-4.7以降ではAdaがうまく動作しないことを注意しておきます。

3.3のリリース は次の注目すべき変更点があります。

  • gcc-4.8(gcc-4.8.1以降が必要)のサポート
  • オブジェクトファイルをLLVMの統合アセンブラで直接書き換えることが可能
  • より健全な(saner)デバッグ情報の生成
  • ビットフィールドが任意のスカラ型を含むことができます(Adaで有用)
LLDB: Low Level Debugger

LLDB はコマンドラインデバッガそしてスクリプトと他のアプリケーションか利用できるデバッガAPIのゼロから実装です。
LLDBは最新の言語機能とターゲットサポートのためにLLVMコアディストリビューションの次のコンポーネントを利用します。

3.3のリリース は次の注目すべき変更点があります。

Linuxでの機能

Linuxでの改善点

  • マルチスレッドプログラムのデバッグ
  • i386プログラムのデバッグ
  • プロセスリスト、アタッチ、フォーク
  • 式評価

External Open Source Projects Using LLVM 3.3

LLVMの興味深い点は多くの他の言語やツールプロジェクトのためのイネーブル技術として使われることです。このセクションではLLVM3.3で動作するよう更新されたいくつかのプロジェクトをリストアップします。

Portable Computing Language (pocl)

容易にポータブルなオープンソースOpenCL実装を生成することに加えて、pocl のもう一つの主な目的はコンパイラの最適化を利用したOpenCLプログラムの性能ポータビリティを改善することとターゲット依存の手動最適化の必要性を減らすことです。poclの重要な部分は、ワークグループバリアの存在の中でさえカーネルコンパイラを用いて静的に多数のワークアイテムを並列化するLLVMパスの∩であることです。これによって複数の方法でワークグループの静的な細流度並列化が可能になる。

TTA-based Co-design Environment (TCE)

TCE はTransport triggered architecture(TTA)基にした新しいプロセッサを設計するためのツールセットです。これはC/C++プログラムから合成可能なVHDL/Verilogそして並列プログラムバイナリまでの完全な協調設計フローを提供する。プロセッサの設定可能な項目としてはレジスタファイル、機能ユニット、サポート操作、そして相互接続ネットワークが含まれる。

TCEはC/C++/OpenCL Cの言語サポート、ターゲット非依存の最適化、そして一部のコード生成のためにClangとLLVMを利用する。これはコンパイラツールチェインの大部分をターゲット毎に再コンパイルすることを避けるために、デザインされたTTAプロセッサ向けの新しいLLVMベースのコード生成器を"オンザフライ"で生成し、それらを実行時ライブラリとしてコンパイラバックエンドにロードする。

Just-in-time Adaptive Decoder Engine (Jade)

Jade(Just-in-time Adaptive Decoder Engine)はビデオデコーダ設定のJITコンパイルのためにLLVMを利用した汎用的なビデオデコーダエンジンです。それらの設定はMPEG Reconfigurable Video Coding(RVC)委員会によって設計されている。MPEG RVCスタンダードはデコーダのストリームベースのデータフロー表現に基づいている。それはRVC-CAL言語で書かれたコーディングツールの標準ライブラリとデコーダのデータフロー設定(ブロック図)から構成される。

JadeプロジェクトはOpen RVC-CAL Compiler(Orcc)の一部としてホストされ、ビデオコーディングツールのRVC-CAL標準ライブラリをLLVMアセンブリコードへ変換することを要求する。

LDC - the LLVM-based D compiler

D はCライクの構文と静的型付きを持つ言語です。これは効率、制御、そしてモデリング力を安全性とプログラマの生産性に実際的に結びつける。D言語はコンパイル時関数実行(CTFE)とテンプレートメタプログラミングのような強力なコンセプトをサポートし、そして並列性への革新的なアプローチと多くの古典的なパラダイムを提供する。

効率的なネイティブコードを生成するために、LLVMと結合したリファレンスコンパイラをバックエンドとして、LDC はそのフロントエンドを使用する。LDCLinuxOS X、そしてWindowsのようなx86/x86_64システムとLinux/PPC64をターゲットとする。ARMのような他のアーテキテクチャへのポートは進行中です。

Additional Information

LLVMウェブページ 、特にドキュメントでは様々な追加情報が利用できます。ウェブページにはSubversionにあるソースコードにあわせて更新されているAPIドキュメントもあります。LLVMツリーの "llvm/docs" ディレクトリに行くと特定のリリースに対するドキュメントが取得可能です。

LLVMに関する質問やコメント等がありましたらメーリングリスト を通してお気軽にご連絡下さい。