Your SlideShare is downloading. ×

LLVM overview 20110122

4,772

Published on

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

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

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

No Downloads
Views
Total Views
4,772
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
83
Comments
0
Likes
8
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. LLVM概要 URL: Outline 1.概要 2.他コンパイラとの比較 3.コンパイラフレームワーク 4.活用・拡張のポイント 5. BitCodeの拡張
  • 2. 自己紹介
    • mail : [email_address]
    • 3. twitter:nothingcosmos
    • 4. LLVM wiki デバッグやダンプオプションの紹介
    • 5. http://nothingcosmos.wiki.fc2.com/
    • 6. 最近の趣味
    • 7. LLVMを観察すること
  • 8. Outline 1. 概要 2.他コンパイラとの比較 3.コンパイラフレームワーク 4.活用・拡張のポイント 5. BitCodeの拡張
  • 9. LLVMとは
    • コンパイラ基盤
    • 10. コンパイラに必要な機能がモジュール化され、
    • 11. 各機能を統合するドライバから構成
    • 12. JVMよりGCCに近い
    • 13. Better GNU GCCというアプローチ
    • 14. 日本発のCOINSに近い。ほぼ同時期に始まった
    • 15. イリノイ大学発。開発者の50%はApple所属
  • 16. LLVMの特徴
    • UIUC BSD-Style License
    • 17. 企業、大学、研究機関、FreeBSD等
    • 18. 幅広い採用実績(GNUライセンスを嫌って、、)
    • 19. 開発が非常に活発。2.8が最新
    • 20. 2.9が201104にでる?3.0が2011年中にでる?
    • 21. 頻繁な仕様変更
    • 22. 前verとのBitcode互換性なし
    • 23. 外部APIも頻繁に変更
  • 24. Clangの特徴
    • C/C++/Obj-C/Obj-C++用フロントエンド
    • 25. LLVM用のC言語系フロントエンド
    • 26. Clang-2.8でC++2003のサポート完了
    • 27. LLVM/Clang/CMake/Boost/Qtをビルド可能
    • 28. clang-2.9からC++0x対応
    • 29. 最近になってドキュメントが充実してきた
    • 30. 詳細はClangのWEBページへ
  • 31. LLVM概要 Outline 1.概要 2. 他コンパイラとの比較 3.コンパイラフレームワーク 4.活用・拡張のポイント 5. BitCodeの拡張
  • 32. COINSとの比較
      低水準中間表現に特化したのがLLVM
  • 33. GCCとの比較
    • GCC 4.6
    • 34. C/C++/Obj-C/Fortran/Java/Ada...
    • 35. x86/ARM/MIPS/PowerPC/... たくさん
    • 36. tool 群 (ld as)
    • LLVM 2.8
    • 37. C/C++/Obj-C( 静的コード解析付き )
    • 38. gcc より少ない c/c++/PTX
    • 39. 実装中
    • 40. BSD-Style License
    • 41. 関連 / 連携プロジェクトが多い
    • 42. JIT/Interpreter
    • 43. 充実したドキュメント
    • 44. 頻繁な仕様変更
  • 45. GCCとの比較
    • GCC 4.6
    • 46. C/C++/Obj-C/Fortran/Java/Ada...
    • 47. x86/ARM/MIPS/PowerPC/... たくさん
    • 48. tool 群 (ld as)
    • LLVM 2.8
    • 49. C/C++/Obj-C( 静的コード解析付き )
    • 50. gcc より少ない c/c++/PTX
    • 51. 実装中
    • 52. BSD-Style License
    • 53. 関連 / 連携プロジェクトが多い
    • 54. JIT/Interpreter
    • 55. 充実したドキュメント
    • 56. 頻繁な仕様変更
    LLVM 本が出ない 理由その1 LLVM 本がでない 理由その2
  • 57. GCCとの比較(最適化)
    • GCC 4.6
    • 58. gcc-4.0(tree-ssa)
    • 59. gcc-4.1(profile guide optimization)
    • 60. gcc-4.2(vectorize OpenMP)
    • 61. gcc-4.3(IPO)
    • 62. gcc-4.4(Graphite)
    • 63. gcc-4.5(LinkTimeOptimization)
    • 64. gcc-4.6(IPO 、 LTO 強化 )
  • 72. GCCとの比較(性能 CoreMark)
    • Pen4 3.0GHz Ubentu オプション: Os O3 fast
    • 73. 棒グラフ:スコア 折線:バイナリサイズ [kbyte]
  • 74. GCCとの比較(性能 SPEC)
    • SPECInt2000でGCC4.5が5~10%上
    • 75. SPECFP2000でGCC4.5が10~20%上
    • 76. LLVMは変数ループ展開やcloningを行わない。
    • 77. O3以上ではGCCに性能で負ける
    • 78. コードサイズの増加しないOsではGCCより速い
    • 79. 基本的な部分の最適化は優れている
    • 80. llvm-2.8-fast は、 iic-12-Os と比較して性能がほぼ同じ。サイズは llvm が小さい。
    • 81. iic は x86 向けだから、コードサイズを優先するインセンティブにかける??
  • 82. LLVM概要 Outline 1.概要 2.他コンパイラとの比較 3. コンパイラフレームワーク 4.活用・拡張のポイント 5. BitCodeの拡張
  • 83. コンパイラフレームワーク
  • 84. コンパイラフレームワーク
  • 85. コンパイラフレームワーク(clang)
  • 86. コンパイラフレームワーク(Optimizer)
  • 87. コンパイラフレームワーク(CodeGenerator)
  • 88. 中間言語の特徴
    • AST
    • 89. Serialize/Deserialize 可能  Tree 形式 プログラミング言語固有
    • 90. BitCode(opt前)
    • 91. Serialize/Deserialize 可能  SSA 形式 メモリアクセスを多用するスタイル
    • 92. BitCode(opt後)
    • 93. Serialize/Deserialize 可能  SSA 形式 無限レジスタを活用するスタイル
    • 94. SDNode
    • 95. Serialize/Deserialize 不可  DAG( 無閉路有向グラフ ) 形式
    • 96. MachineInstr
    • 97. Serialize/Deserialize 不可  3 番地コード形式
  • 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. LLVM概要 Outline 1.概要 2.他コンパイラとの比較 3.コンパイラフレームワーク 4. 活用・拡張のポイント 5. BitCodeの拡張
  • 100. 活用・拡張のポイント
  • 101. 活用・拡張のポイント おれおれ アーキテクチャを追加 おれおれ言語から BitCodeへの変換器 他処理系からの 変換器 他言語への 変換器追加 他処理系への変換器 最適化や解析器の 研究・実装 命令選択、命令スケジューリング レジスタアロケーションの 研究・実装 IDEとの連携、組み込み 静的解析器の研究、実装 BitCodeを拡張 BitCode-to-xxx-to-BitCodeの追加 C/C++/Obj-Cのパーサー EDGとかcosyいらなくね? おれおれコンパイラへの 変換器
  • 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. LLVM概要 Outline 1.概要 2.他コンパイラとの比較 3.コンパイラフレームワーク 4.活用・拡張のポイント 5. BitCode の拡張
  • 104. BitCodeの拡張
    • BitCodeは言語独立、機種独立に抽象化
    • 105. Metadataを使えば、Instructionに情報を追加可能
    • 106. 各種解析や最適化をパスする
    • 107. 実装例) デバッグ情報、言語規格の型情報
    • 108. 用途)
    • 109. 言語依存の付加情報。ソースコード上の構造
    • 110. ターゲット依存の付加情報。LLVMへの強制命令
    • 111. メモリ階層。メッセージ。pragma指示。
  • 112. BitCodeの拡張(参照関係)
  • 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. BitCodeの拡張 最適化では 極力スルー/メンテ されて情報が残る 必要な最適化で情報を参照 言語依存の最適化を実施
  • 115. BitCodeの拡張 最適化では 極力スルー / メンテ されて情報が残る 必要な最適化で情報を参照 言語依存の最適化を実施 llvm-2.7 で 新設された機能なので、 今後どうなるのか不明 注意 実際はこんな簡単に いきません
  • 116. 以上になります。 ご清聴ありがとうございました。

×