Submit Search
LLVM overview 20110122
•
Download as ODP, PDF
•
8 likes
•
2,823 views
N
nothingcosmos
Follow
第三回LLVM勉強会のLLVM概要資料
Read less
Read more
1 of 32
Download now
Downloaded 88 times
More Related Content
LLVM overview 20110122
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
強化 ) LLVM 2.8
65.
SSA ベースの最適化
66.
枠だけある。未実装
67.
実装中。 Polly
68.
ある
69.
実装中。 Polly
70.
ある
71.
ある
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 !"test001.c", metadata !"/home/elise/language/llvm/work/metadata", 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 !"int", metadata !26} !26 = metadata !{metadata !"an example type tree"} !30 = metadata !{metadata !"readonly,restrict,"} 手書きで追加 llvm-as/llvm-dis/opt をパス 最適化後もちゃんと残ってる
114.
BitCodeの拡張 最適化では 極力スルー/メンテ
されて情報が残る 必要な最適化で情報を参照 言語依存の最適化を実施
115.
BitCodeの拡張 最適化では 極力スルー
/ メンテ されて情報が残る 必要な最適化で情報を参照 言語依存の最適化を実施 llvm-2.7 で 新設された機能なので、 今後どうなるのか不明 注意 実際はこんな簡単に いきません
116.
以上になります。 ご清聴ありがとうございました。
Download