LLVM概要 URL: Outline 1.概要 2.他コンパイラとの比較 3.コンパイラフレームワーク 4.活用・拡張のポイント 5. BitCodeの拡張
自己紹介 <ul><li>mail : [email_address]
twitter:nothingcosmos
LLVM wiki デバッグやダンプオプションの紹介
http://nothingcosmos.wiki.fc2.com/
最近の趣味
LLVMを観察すること </li></ul>
Outline 1. 概要 2.他コンパイラとの比較 3.コンパイラフレームワーク 4.活用・拡張のポイント 5. BitCodeの拡張
LLVMとは <ul><li>コンパイラ基盤
コンパイラに必要な機能がモジュール化され、
各機能を統合するドライバから構成
JVMよりGCCに近い
Better GNU GCCというアプローチ
日本発のCOINSに近い。ほぼ同時期に始まった
イリノイ大学発。開発者の50%はApple所属 </li></ul>
LLVMの特徴 <ul><li>UIUC BSD-Style License
企業、大学、研究機関、FreeBSD等
幅広い採用実績(GNUライセンスを嫌って、、)
開発が非常に活発。2.8が最新
2.9が201104にでる?3.0が2011年中にでる?
頻繁な仕様変更
前verとのBitcode互換性なし
外部APIも頻繁に変更 </li></ul>
Clangの特徴 <ul><li>C/C++/Obj-C/Obj-C++用フロントエンド
LLVM用のC言語系フロントエンド
Clang-2.8でC++2003のサポート完了
LLVM/Clang/CMake/Boost/Qtをビルド可能
clang-2.9からC++0x対応
最近になってドキュメントが充実してきた
詳細はClangのWEBページへ </li></ul>
LLVM概要 Outline 1.概要 2. 他コンパイラとの比較 3.コンパイラフレームワーク 4.活用・拡張のポイント 5. BitCodeの拡張
COINSとの比較 <ul>低水準中間表現に特化したのがLLVM </ul>
Upcoming SlideShare
Loading in...5
×

LLVM overview 20110122

4,886

Published on

第三回LLVM勉強会のLLVM概要資料

Published in: Technology
0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
4,886
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
84
Comments
0
Likes
8
Embeds 0
No embeds

No notes for slide

LLVM overview 20110122

  1. 1. LLVM概要 URL: Outline 1.概要 2.他コンパイラとの比較 3.コンパイラフレームワーク 4.活用・拡張のポイント 5. BitCodeの拡張
  2. 2. 自己紹介 <ul><li>mail : [email_address]
  3. 3. twitter:nothingcosmos
  4. 4. LLVM wiki デバッグやダンプオプションの紹介
  5. 5. http://nothingcosmos.wiki.fc2.com/
  6. 6. 最近の趣味
  7. 7. LLVMを観察すること </li></ul>
  8. 8. Outline 1. 概要 2.他コンパイラとの比較 3.コンパイラフレームワーク 4.活用・拡張のポイント 5. BitCodeの拡張
  9. 9. LLVMとは <ul><li>コンパイラ基盤
  10. 10. コンパイラに必要な機能がモジュール化され、
  11. 11. 各機能を統合するドライバから構成
  12. 12. JVMよりGCCに近い
  13. 13. Better GNU GCCというアプローチ
  14. 14. 日本発のCOINSに近い。ほぼ同時期に始まった
  15. 15. イリノイ大学発。開発者の50%はApple所属 </li></ul>
  16. 16. LLVMの特徴 <ul><li>UIUC BSD-Style License
  17. 17. 企業、大学、研究機関、FreeBSD等
  18. 18. 幅広い採用実績(GNUライセンスを嫌って、、)
  19. 19. 開発が非常に活発。2.8が最新
  20. 20. 2.9が201104にでる?3.0が2011年中にでる?
  21. 21. 頻繁な仕様変更
  22. 22. 前verとのBitcode互換性なし
  23. 23. 外部APIも頻繁に変更 </li></ul>
  24. 24. Clangの特徴 <ul><li>C/C++/Obj-C/Obj-C++用フロントエンド
  25. 25. LLVM用のC言語系フロントエンド
  26. 26. Clang-2.8でC++2003のサポート完了
  27. 27. LLVM/Clang/CMake/Boost/Qtをビルド可能
  28. 28. clang-2.9からC++0x対応
  29. 29. 最近になってドキュメントが充実してきた
  30. 30. 詳細はClangのWEBページへ </li></ul>
  31. 31. LLVM概要 Outline 1.概要 2. 他コンパイラとの比較 3.コンパイラフレームワーク 4.活用・拡張のポイント 5. BitCodeの拡張
  32. 32. COINSとの比較 <ul>低水準中間表現に特化したのがLLVM </ul>
  33. 33. GCCとの比較 <ul><li>GCC 4.6
  34. 34. C/C++/Obj-C/Fortran/Java/Ada...
  35. 35. x86/ARM/MIPS/PowerPC/... たくさん
  36. 36. tool 群 (ld as) </li></ul><ul><li>LLVM 2.8
  37. 37. C/C++/Obj-C( 静的コード解析付き )
  38. 38. gcc より少ない c/c++/PTX
  39. 39. 実装中
  40. 40. BSD-Style License
  41. 41. 関連 / 連携プロジェクトが多い
  42. 42. JIT/Interpreter
  43. 43. 充実したドキュメント
  44. 44. 頻繁な仕様変更 </li></ul>
  45. 45. GCCとの比較 <ul><li>GCC 4.6
  46. 46. C/C++/Obj-C/Fortran/Java/Ada...
  47. 47. x86/ARM/MIPS/PowerPC/... たくさん
  48. 48. tool 群 (ld as) </li></ul><ul><li>LLVM 2.8
  49. 49. C/C++/Obj-C( 静的コード解析付き )
  50. 50. gcc より少ない c/c++/PTX
  51. 51. 実装中
  52. 52. BSD-Style License
  53. 53. 関連 / 連携プロジェクトが多い
  54. 54. JIT/Interpreter
  55. 55. 充実したドキュメント
  56. 56. 頻繁な仕様変更 </li></ul>LLVM 本が出ない 理由その1 LLVM 本がでない 理由その2
  57. 57. GCCとの比較(最適化) <ul><li>GCC 4.6
  58. 58. gcc-4.0(tree-ssa)
  59. 59. gcc-4.1(profile guide optimization)
  60. 60. gcc-4.2(vectorize OpenMP)
  61. 61. gcc-4.3(IPO)
  62. 62. gcc-4.4(Graphite)
  63. 63. gcc-4.5(LinkTimeOptimization)
  64. 64. gcc-4.6(IPO 、 LTO 強化 ) </li></ul><ul><li>LLVM 2.8
  65. 65. SSA ベースの最適化
  66. 66. 枠だけある。未実装
  67. 67. 実装中。 Polly
  68. 68. ある
  69. 69. 実装中。 Polly
  70. 70. ある
  71. 71. ある </li></ul>
  72. 72. GCCとの比較(性能 CoreMark) <ul><li>Pen4 3.0GHz Ubentu オプション: Os O3 fast
  73. 73. 棒グラフ:スコア 折線:バイナリサイズ [kbyte] </li></ul>
  74. 74. GCCとの比較(性能 SPEC) <ul><li>SPECInt2000でGCC4.5が5~10%上
  75. 75. SPECFP2000でGCC4.5が10~20%上
  76. 76. LLVMは変数ループ展開やcloningを行わない。
  77. 77. O3以上ではGCCに性能で負ける
  78. 78. コードサイズの増加しないOsではGCCより速い
  79. 79. 基本的な部分の最適化は優れている
  80. 80. llvm-2.8-fast は、 iic-12-Os と比較して性能がほぼ同じ。サイズは llvm が小さい。
  81. 81. iic は x86 向けだから、コードサイズを優先するインセンティブにかける?? </li></ul>
  82. 82. LLVM概要 Outline 1.概要 2.他コンパイラとの比較 3. コンパイラフレームワーク 4.活用・拡張のポイント 5. BitCodeの拡張
  83. 83. コンパイラフレームワーク
  84. 84. コンパイラフレームワーク
  85. 85. コンパイラフレームワーク(clang)
  86. 86. コンパイラフレームワーク(Optimizer)
  87. 87. コンパイラフレームワーク(CodeGenerator)
  88. 88. 中間言語の特徴 <ul><li>AST
  89. 89. Serialize/Deserialize 可能  Tree 形式 プログラミング言語固有
  90. 90. BitCode(opt前)
  91. 91. Serialize/Deserialize 可能  SSA 形式 メモリアクセスを多用するスタイル
  92. 92. BitCode(opt後)
  93. 93. Serialize/Deserialize 可能  SSA 形式 無限レジスタを活用するスタイル
  94. 94. SDNode
  95. 95. Serialize/Deserialize 不可  DAG( 無閉路有向グラフ ) 形式
  96. 96. MachineInstr
  97. 97. Serialize/Deserialize 不可  3 番地コード形式 </li></ul>
  98. 98. 中間言語の遷移 define i32 @max(i32 %x, i32 %y) nounwind readnone { %1 = icmp sgt i32 %x, %y %.0 = select i1 %1, i32 %x, i32 %y ret i32 %.0 } Function Live Ins: %R0 in reg%16384, %R1 in reg%16385 Function Live Outs: %R0 BB#0: derived from LLVM BB %0 Live Ins: %R0 %R1 CMPrr %R0, %R1, pred:14, pred:%reg0, %CPSR<imp-def> %R1<def> = MOVCCr %R1, %R0<kill>, pred:12, pred:%CPSR<kill> %R0<def> = MOVr %R1<kill>, pred:14, pred:%reg0, opt:%reg0 BX_RET pred:14, pred:%reg0, %R0<imp-use> Function Live Ins: %R0 in reg%16384, %R1 in reg%16385 Function Live Outs: %R0 BB#0: derived from LLVM BB %0 Live Ins: %R0 %R1 %reg16385<def> = COPY %R1; GPR:%reg16385 %reg16384<def> = COPY %R0; GPR:%reg16384 CMPrr %reg16384, %reg16385, pred:14, pred:%reg0, %CPSR<imp-def>;      ;GPR:%reg16384,16385 %reg16386<def> = MOVCCr %reg16385, %reg16384, pred:12, pred:%CPSR;      ;GPR:%reg16386,16385,16384 %R0<def> = COPY %reg16386; GPR:%reg16386 BX_RET pred:14, pred:%reg0 define i32 @max(i32 %x, i32 %y) nounwind { %1 = alloca i32, align 4 %2 = alloca i32, align 4 %3 = alloca i32, align 4 store i32 %x, i32* %2, align 4 store i32 %y, i32* %3, align 4 %4 = load i32* %2, align 4 %5 = load i32* %3, align 4 %6 = icmp sgt i32 %4, %5 br i1 %6, label %7, label %9 ; <label>:7 ; preds = %0 %8 = load i32* %2, align 4 store i32 %8, i32* %1 br label %11 ; <label>:9 ; preds = %0 %10 = load i32* %3, align 4 store i32 %10, i32* %1 br label %11 ; <label>:11 ; preds = %9, %7 %12 = load i32* %1 ret i32 %12 }
  99. 99. LLVM概要 Outline 1.概要 2.他コンパイラとの比較 3.コンパイラフレームワーク 4. 活用・拡張のポイント 5. BitCodeの拡張
  100. 100. 活用・拡張のポイント
  101. 101. 活用・拡張のポイント おれおれ アーキテクチャを追加 おれおれ言語から BitCodeへの変換器 他処理系からの 変換器 他言語への 変換器追加 他処理系への変換器 最適化や解析器の 研究・実装 命令選択、命令スケジューリング レジスタアロケーションの 研究・実装 IDEとの連携、組み込み 静的解析器の研究、実装 BitCodeを拡張 BitCode-to-xxx-to-BitCodeの追加 C/C++/Obj-Cのパーサー EDGとかcosyいらなくね? おれおれコンパイラへの 変換器
  102. 102. 活用・拡張のポイント FPGA 用 GPGPU 用 既存言語 Haskell-to 新規言語 Clay-to Crack-to OpenCL 処理系 to EDG-to To-JavaScript To-ByteCode To-CLI To-PTX StrengthReduction Profile-gen/use AliasAnalysis regaloc=Pazzle|Graph ObjectCodeEmitter Xcode Eclipse OpenCL コンパイラへ Polly
  103. 103. LLVM概要 Outline 1.概要 2.他コンパイラとの比較 3.コンパイラフレームワーク 4.活用・拡張のポイント 5. BitCode の拡張
  104. 104. BitCodeの拡張 <ul><li>BitCodeは言語独立、機種独立に抽象化
  105. 105. Metadataを使えば、Instructionに情報を追加可能
  106. 106. 各種解析や最適化をパスする
  107. 107. 実装例) デバッグ情報、言語規格の型情報
  108. 108. 用途)
  109. 109. 言語依存の付加情報。ソースコード上の構造
  110. 110. ターゲット依存の付加情報。LLVMへの強制命令
  111. 111. メモリ階層。メッセージ。pragma指示。 </li></ul>
  112. 112. BitCodeの拡張(参照関係)
  113. 113. BitCodeの拡張 Metadataのサンプル %call = call i32 (...)* @max(i32* %tmp4, i32* %tmp5), !dbg !22, !tbaa !25, !message !30 !1 = metadata !{i32 524329, metadata !&quot;test001.c&quot;, metadata !&quot;/home/elise/language/llvm/work/metadata&quot;, metadata !2} !22 = metadata !{i32 8, i32 5, metadata !23, null} !23 = metadata !{i32 524299, metadata !24, i32 7, i32 23, metadata !1, i32 2} !25 = metadata !{metadata !&quot;int&quot;, metadata !26} !26 = metadata !{metadata !&quot;an example type tree&quot;} !30 = metadata !{metadata !&quot;readonly,restrict,&quot;} 手書きで追加 llvm-as/llvm-dis/opt をパス 最適化後もちゃんと残ってる
  114. 114. BitCodeの拡張 最適化では 極力スルー/メンテ されて情報が残る 必要な最適化で情報を参照 言語依存の最適化を実施
  115. 115. BitCodeの拡張 最適化では 極力スルー / メンテ されて情報が残る 必要な最適化で情報を参照 言語依存の最適化を実施 llvm-2.7 で 新設された機能なので、 今後どうなるのか不明 注意 実際はこんな簡単に いきません
  116. 116. 以上になります。 ご清聴ありがとうございました。
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×