読者です 読者をやめる 読者になる 読者になる

LLVM 3.4 リリースノートの訳

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

12月31日時点でLLVMのダウンロードページやドキュメントページへのリンクがありませんが、直接それっぽいURLにアクセスすると既に存在するようです。ただしClangはまだ無いようです。

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

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

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

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

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

  • これがC++98ツールチェインを使用してコンパイルするLLVMの最後のリリースなると期待されています。私たちはこのリリース後からC++11の機能をLLVMと他のサブプロジェクトで使い始めることを期待しています。とはいえ、全てのプラットフォーム上のホストコンパイラとして現代的なC++ツールチェインの合理的なセットをサポートすることを約束します。これには最低でもWindowsのVisual Studio 2012とMacおよびLinuxでのClang 3.1とGCC 4.7.xを含んでいます。最終的なコンパイラセットとそれらがサポートするC++11機能は確定してはいない。しかし、LLVMの利用者が次のリリースでホストツールチェインの要求における大きな変化を追従してくれることを望んでいます。
  • パイプライン上でのいかなるコマンドの失敗によっても回帰テストが失敗するようになります。あるディレクトリで無効にするにはconfig.pipefail = Falselit.local.cfgに追加して下さい。詳細はLitを参照して下さい。
  • 古いJITから例外ハンドリングのサポートが削除されました。EH(例外ハンドリング)のサポートが必要であればMCJITを利用して下さい。
  • R600バックエンドが実験的とはされなくなり、デフォルトでビルドされるようになりました。
  • APFloat::isNormal()APFloat::isFiniteNonZero()に、APFloat::isIEEENormal()APFloat::isNormal()にリネームされました。これはAPFloat::isNormal()がIEEE-754R-2008に準拠することを保証します。
  • ライブラリ呼び出し簡易化パス(library call simplification pass)が削除されました。その機能は命令結合器(instruction combiner)と関数属性マークパス(function attribute marking pass)に統合されました。
  • Visual Studio 2008を使用するビルドのサポートが廃止されました。VS2010かそれ以降を使用して下さい。詳細な情報はGetting Started using Visual Studioを参照して下さい。
  • 以前-O3で有効になっていたループベクトル化が-Os-O2で有効化されるようになりました。
  • SLPベクトル化がデフォルトで有効化されるようになりました。
  • llvm-arが新しいオブジェクトライブラリを使用してGNUフォーマットでアーカイブとシンボルテーブルを生成するようになりました。
  • FileCheckが複数回の-check-prefixの指定を許容するようになりました。これにより複数のRUN行を使うときに重複チェックを減らせるようになります。
  • bitcast命令が異なるアドレス空間を持つポインタ間のキャストをもはや許容しなくなりました。これを行う場合は、addrspacecast命令を使用して下さい。
  • 異なるアドレス空間のための異なるサイズのポインタが多くの場合動作するようになりました。これは主にGPUターゲットで役に立ちます。
  • OCamlバインディングがほとんど全てのLLVMライブラリをカバーするように拡張されました。

Mips Target

MIPS SIMDアーキテクチャ(MSA)のサポートが追加されました。MSAはインラインアセンブラ__builtin_msaのプリフィックスを持つをintrinsicsおよび通常のコード生成をサポートしています

(命令セットなどのドキュメントを含む)MSAに関する情報は、MIPS SIMD page at Imagination Technologiesを参照して下さい。

PowerPC Target

PowerPCバックエンドには以下の変更点を含みます:

  • fast-iselサポート(より高速な-O0のコード生成)
  • 組み込みアセンブラの多くの改善
  • アラインされていない(Altivec)ベクトル読み込みの生成のサポート
  • fcpsgn命令の生成のサポート
  • round()(nearbyint()rint())ではなく、fast-mathモード内でのみ行われる)のためのfrinの生成
  • (A2のような)組み込みコアのための命令スケジューリングの改善
  • (特に32bitモードにおける)prologue/epilogue生成の改善
  • 動的なスタックアラインメント(と大きなアラインメントを持つ動的なスタック割り当て)のサポート
  • counter-register-basedループの生成の改善
  • バグ修正

SPARC Target

SPARCバックエンドは多くの改善があります。それは、

  • 実験的なSPARC V9バックエンド
  • SPARCJITサポート
  • fp128サポート
  • 例外ハンドリング
  • TLSサポート
  • leaf functionの最適化
  • バグ修正

SystemZ/s390x Backend

LLVMとclangはzEnterprise z196とzEnterprise EC12ターゲットを最適化できるようになりました。clangではそれぞれ-march=z196-march=zEC12を使用することでこれらのターゲットが選択されます。

LLVM3.4を利用した外部オープンソースプロジェクト(External Open Source Projects Using LLVM 3.4)

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

DXR

DXRはFixfoxのような大きなプロジェクトを理解するためのMozillaのコード検索とナビゲーションツールです。"この関数の全ての呼び出し元を探し出せ"といった構造化クエリと同様な全文検索正規表現検索をサポートしています。浦ではtrigram indexやre2ライブラリそしてclangコンパイラプラグインによって収集された構造化データを使用しています。

LDC - the LLVM-based D compiler

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

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

LibBeauty

LibBeautyコンパイラリバースエンジニアリングツールは現在LLVM disassemblerとLLVM IR Builderを利用しています。このプロジェクトの現在の目標はx86_64バイナリ.oファイルを入力として受け取り、同様のLLVM IR.bcもしくは.llファイルを出力として生成することである。ARMバイナリ.oファイルの入力のサポートは後に追加されるでしょう。

Likely

Likelyは画像認識のためのオープンソースの領域特価型言語です。アルゴリズムはLLVMのMVJIT基盤を使用してjust-in-timeコンパイルされ、GPUが有効になったOpenCL SPIRやCUDAとシングルもしくはマルチスレッドCPU上で実行されます。Likelyは画像処理や統計的な学習カーネルが一般的に行列データ型を扱うように書く必要があり、実行時にはそれらが同じ型上で処理を繰り返す傾向があるという知見を活かしている。

Portable Computing Language (pocl)

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

Portable Native Client (PNaCl)

Portable Native Client (PNaCl)はアプリケーションのポータビリティやセキュリティの恩恵を犠牲にすることなく、ネイティブコードの性能と低レベル制御を現代のウェブブラウザにもたらすためのChrome主導のプロジェクトです。PNaClはネイティブのCとC++コードをLLVM clangコンパイラを使用して中間表現にコンパイルすることで動作する。この中間表現はポータブルな実行形式へとラップされたLLVMバイトコードのサブセットである。これは他のウェブサイト資源と同様にウェブサーバ上でホストされることができる。サイトがアクセスされると、Chromeがそのポータブルな実行形式を取得して下層デバイスに最適化されたアーキテクチャ依存のマシンコードへの翻訳する。PNaClは開発者に彼らのコードをどんなハードウェアプラットフォームでも動作するコンパイルさせ、下層のCPUやGPUの力を活用しながらそのPNaClアプリケーションをウェブサイト上に組み込ませる。

TTA-based Co-design Environment (TCE)

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

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

WebCL Validator

WebCL ValidatorはOpenCL ES 1.1のサブセットであるWebCL C言語のための検証を実装している。バリデータはWebCL Cの正確さを確認し、source-2-source変換としてメモリ保護を実装する。その変換によりWebCLはメモリ保護されたOpenCLへと変換される。保護されたOpenCLは割り当てられていないメモリ範囲へのアクセスができず、他のプログラムへ情報がリークしないようにそのメモリは常に初期化される。

Additional Information

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

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