Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
hito-ga-oshieru-llvm
Search
Kmotiko
March 22, 2014
Programming
5.4k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
hito-ga-oshieru-llvm
Kmotiko
March 22, 2014
Other Decks in Programming
See All in Programming
AIが無かった頃の素敵な出会いの話
codmoninc
1
200
The Bowling Game- From Imperative to Functional Programming - Part 1
philipschwarz
PRO
0
340
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
160
どこまでゆるくて許されるのか
tk3fftk
0
520
「正の参照」と 「負の導出」で組む ハーネスエンジニアリング
cottpan
1
150
作るコストが小さくなった時代 幸せに働くために改めて考えたいこと 〜エンジニアとして価値を出し続けるために注視している二分野〜
yuppeeng
0
120
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.3k
Android CLI
fornewid
0
120
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
2
900
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
110
SLOをサービス品質の共通言語にするために 取り組んできたこと
wakana0222
0
540
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
280
Featured
See All Featured
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
Discover your Explorer Soul
emna__ayadi
2
1.2k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.4k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.5k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
620
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
200
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
410
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
880
Transcript
ヒトがおしえる!LLVM 2014/3/21 柏木餅子
自己紹介 柏木餅子(♂) サークルMotiPizzaで活動中 「きつねさんでもわかる!LLVM」 達人出版会様&インプレスジャパン様から
LLVM本ではフロントエンド側担当 LLVM本の弱い方 金髪幼女の方 お仕事はソフトウェア開発色々 LLVMを使う機会は無いです 外で発表するのは初めてなので。。。 2
アジェンダ LLVMとは? コンパイラの処理 LLVMのイメージ LLVM-IR
LLVM-IRの特徴 LLVM-IRの例 Pass Passの概念 Passの種類 おまけ 3
アジェンダ LLVMとは? コンパイラの処理 LLVMのイメージ LLVM-IR
LLVM-IRの特徴 LLVM-IRの例 Pass Passの概念 Passの種類 おまけ 4
LLVMとは? コンパイラ基盤だよ? 5
LLVMとは? コンパイラ基盤って何!? 6
コンパイラの処理 C/C++ X86 Java ARM Haskell PowerPC 中間表現 7
コンパイラの処理 C/C++ X86 Java ARM Haskell PowerPC 中間表現 フロントエンド (解析・変換)
8
コンパイラの処理 C/C++ X86 Java ARM Haskell PowerPC 中間表現 フロントエンド (解析・変換)
ミドルエンド (解析・最適化) 9
コンパイラの処理 C/C++ X86 Java ARM Haskell PowerPC 中間表現 フロントエンド (解析・変換)
ミドルエンド (解析・最適化) バックエンド (コード生成) 10
コンパイラの処理 C/C++ X86 Java ARM Haskell PowerPC 中間表現 フロントエンド (解析・変換)
ミドルエンド (解析・最適化) バックエンド (コード生成) ・中間表現の規定 ・中間表現の生成・解析/最適化 ・中間表現から各種ターゲットのコード生成 ⇒各種モジュールが整理されて再利用できると嬉しいよね 11
LLVMのイメージ C/C++ X86 Java ARM Haskell PowerPC 中間表現 (LLVM-IR) 変換前
LLVM-IR Pass A Pass B Backend Pass LLVM バックエンド 処理 変換後 LLVM-IR 解析・最適化 Pass=中間表現(LLVM-IR)の解析や 最適化を行うモジュール 12
LLVMとは? コンパイラ基盤だよ? 中間表現(LLVM-IR)と最適化・コード生成等のモジュール 13
LLVMとは? コンパイラ基盤だよ? 中間表現(LLVM-IR)と最適化・コード生成等のモジュール 正しくは、LLVM=Clangとかを含むプロジェクトの総称 どちらを指しているかは文脈による 14
LLVMとは? コンパイラ基盤だよ? 中間表現(LLVM-IR)と最適化・コード生成等のモジュール 正しくは、LLVM=Clangとかを含むプロジェクトの総称 どちらを指しているかは文脈による
最近人気なようですね? 15
LLVMとは? コンパイラ基盤だよ? 中間表現(LLVM-IR)と最適化・コード生成等のモジュール 正しくは、LLVM=Clangとかを含むプロジェクトの総称 どちらを指しているかは文脈による
最近人気なようですね? BSDライクの比較的緩いライセンス モジュール化されていて再利用しやすい 読みやすい(読める) 16
アジェンダ LLVMとは? コンパイラの処理 LLVMのイメージ LLVM-IR
LLVM-IRの特徴 LLVM-IRの例 Pass Passの概念 Passの種類 おまけ 17
LLVM IRの特徴 18
LLVM IRの特徴 LLVM IR=LLVMの中間表現 言語非依存 19
LLVM IRの特徴 LLVM IR=LLVMの中間表現 言語非依存 レジスタマシンがターゲット
i32,floatなどの型があります 20
LLVM IRの特徴 LLVM IR=LLVMの中間表現 言語非依存 レジスタマシンがターゲット
i32,floatなどの型があります 静的単一代入形式(SSA) 変数への代入は一度だけ def-useが追いやすい 21
LLVM IRの特徴 LLVM IR=LLVMの中間表現 言語非依存 レジスタマシンがターゲット
i32,floatなどの型があります 静的単一代入形式(SSA) 変数への代入は一度だけ def-useが追いやすい 3種類あるけど全て等価 メモリ上のIR シリアライズされたビットコード 人間が読めるアセンブリ形式 詳細はLLVMのドキュメントに・・・ LLVM Language Reference Manual 22
LLVM IRの例 例えば↑のソースコードをclang v3.4でコンパイルすると・・・ clang –emit-llvm –S HelloWorld.c
#include<stdio.h> int main() { printf("Hello World!\n"); return 0; } 23
LLVM IRの例 ; ModuleID = 'HelloWorld.cpp' target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:
0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" @.str = private unnamed_addr constant [14 x i8] c"Hello World!\0A\00", align 1 ; Function Attrs: uwtable define i32 @main() #0 { entry: %retval = alloca i32, align 4 store i32 0, i32* %retval %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str, i32 0, i32 0)) ret i32 0 } declare i32 @printf(i8*, ...) #1 attributes #0 = { 省略 } attributes #1 = { 省略 } !llvm.ident = !{!0} !0 = metadata !{metadata !"clang version 3.4 (tags/RELEASE_34/final 204003)"} 24
LLVM IRの例 ; ModuleID = 'HelloWorld.cpp' target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:
0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" @.str = private unnamed_addr constant [14 x i8] c"Hello World!\0A\00", align 1 ; Function Attrs: uwtable define i32 @main() #0 { entry: %retval = alloca i32, align 4 store i32 0, i32* %retval %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str, i32 0, i32 0)) ret i32 0 } declare i32 @printf(i8*, ...) #1 attributes #0 = { 省略 } attributes #1 = { 省略 } !llvm.ident = !{!0} !0 = metadata !{metadata !"clang version 3.4 (tags/RELEASE_34/final 204003)"} Module 25
LLVM IRの例 ; ModuleID = 'HelloWorld.cpp' target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:
0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" @.str = private unnamed_addr constant [14 x i8] c"Hello World!\0A\00", align 1 ; Function Attrs: uwtable define i32 @main() #0 { entry: %retval = alloca i32, align 4 store i32 0, i32* %retval %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str, i32 0, i32 0)) ret i32 0 } declare i32 @printf(i8*, ...) #1 attributes #0 = { 省略 } attributes #1 = { 省略 } !llvm.ident = !{!0} !0 = metadata !{metadata !"clang version 3.4 (tags/RELEASE_34/final 204003)"} Module Grobal Variable 26
LLVM IRの例 ; ModuleID = 'HelloWorld.cpp' target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:
0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" @.str = private unnamed_addr constant [14 x i8] c"Hello World!\0A\00", align 1 ; Function Attrs: uwtable define i32 @main() #0 { entry: %retval = alloca i32, align 4 store i32 0, i32* %retval %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str, i32 0, i32 0)) ret i32 0 } declare i32 @printf(i8*, ...) #1 attributes #0 = { 省略 } attributes #1 = { 省略 } !llvm.ident = !{!0} !0 = metadata !{metadata !"clang version 3.4 (tags/RELEASE_34/final 204003)"} Module Grobal Variable 27 Function
LLVM IRの例 ; ModuleID = 'HelloWorld.cpp' target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:
0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" @.str = private unnamed_addr constant [14 x i8] c"Hello World!\0A\00", align 1 ; Function Attrs: uwtable define i32 @main() #0 { entry: %retval = alloca i32, align 4 store i32 0, i32* %retval %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str, i32 0, i32 0)) ret i32 0 } declare i32 @printf(i8*, ...) #1 attributes #0 = { 省略 } attributes #1 = { 省略 } !llvm.ident = !{!0} !0 = metadata !{metadata !"clang version 3.4 (tags/RELEASE_34/final 204003)"} Module Grobal Variable 28 Function BasicBlock
LLVM IRの例 ; ModuleID = 'HelloWorld.cpp' target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:
0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" @.str = private unnamed_addr constant [14 x i8] c"Hello World!\0A\00", align 1 ; Function Attrs: uwtable define i32 @main() #0 { entry: %retval = alloca i32, align 4 store i32 0, i32* %retval %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str, i32 0, i32 0)) ret i32 0 } declare i32 @printf(i8*, ...) #1 attributes #0 = { 省略 } attributes #1 = { 省略 } !llvm.ident = !{!0} !0 = metadata !{metadata !"clang version 3.4 (tags/RELEASE_34/final 204003)"} Module Grobal Variable 29 Function BasicBlock Instruction
LLVM IRの例 ; ModuleID = 'HelloWorld.cpp' target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:
0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" @.str = private unnamed_addr constant [14 x i8] c"Hello World!\0A\00", align 1 ; Function Attrs: uwtable define i32 @main() #0 { entry: %retval = alloca i32, align 4 store i32 0, i32* %retval %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str, i32 0, i32 0)) ret i32 0 } declare i32 @printf(i8*, ...) #1 attributes #0 = { 省略 } attributes #1 = { 省略 } !llvm.ident = !{!0} !0 = metadata !{metadata !"clang version 3.4 (tags/RELEASE_34/final 204003)"} Module Grobal Variable 30 Function BasicBlock Instruction Metadata
アジェンダ LLVMとは? コンパイラの処理 LLVMのイメージ LLVM-IR
LLVM-IRの特徴 LLVM-IRの例 Pass Passの概念 Passの種類 おまけ 31
Passの概念 LLVMの解析や最適化を担う重要な要素 LLVMの各種解析/最適化は全てPass optコマンドで任意のPassを適用することも可能 • opt -pass-name
XX.ll 32
Passの種類 以下の基底クラスを目的に応じて継承 ImmutablePass ModulePass FunctionPass
LoopPass RegionPass BasicBlockPass MachineFunctionPass どのようなPassがあるかは公式ドキュメントを・・・ LLVM’s Analysis and Transform Passes 33
Passの種類 以下の基底クラスを目的に応じて継承 ImmutablePass ModulePass FunctionPass
LoopPass RegionPass BasicBlockPass MachineFunctionPass どのようなPassがあるかは公式ドキュメントを・・・ LLVM’s Analysis and Transform Passes 34 ART内のGPCExpander はFunctionPassを継承
アジェンダ LLVMとは? コンパイラの処理 LLVMのイメージ LLVM-IR
LLVM-IRの特徴 LLVM-IRの例 Pass Passの概念 Passの種類 おまけ 35
おまけ 36 折角なのでARTの話を少し
おまけ:ARTにおけるLLVM Android4.4に含まれる新しいruntime 開発者向け ARTのソースコードを少し眺めてみた とりあえずart/compiler配下だけ
ぐーぐる先生に「LLVM ART」と聞くと良いエントリがありますよ! 37
おまけ:ARTにおけるLLVM ARTの処理系も幾つか種類があるらしい Quick Portable SeaIR
インタプリタ? 38
おまけ:ARTにおけるLLVM ARTの処理系も幾つか種類があるらしい Quick Portable SeaIR
インタプリタ? 39 LLVMが関係してくるのはここ
おまけ:ARTにおけるLLVM ARTの処理系も幾つか種類があるらしい Quick Portable SeaIR
インタプリタ? 今回はPortableまわりで読んだところを少しだけ Dexを入力としてコード生成する 40 LLVMが関係してくるのはここ
おまけ:ARTにおけるLLVM Portableの場合 Dex2Oat::CreateOatFile art/dex2oat/dex2oat.cc 一番下にmainがあるのでそこから読んでみる 41
おまけ:ARTにおけるLLVM Portableの場合 Dex2Oat::CreateOatFile art/dex2oat/dex2oat.cc 一番下にmainがあるのでそこから読んでみる
CompilerDriver::CompileAll art/compiler/llvm/compiler_driver.cc CompilerLLVM::CompileDexFile等を経由しCompilerLLVM::CompileDexMethodへ? 42
おまけ:ARTにおけるLLVM Portableの場合 Dex2Oat::CreateOatFile art/dex2oat/dex2oat.cc 一番下にmainがあるのでそこから読んでみる
CompilerDriver::CompileAll art/compiler/llvm/compiler_driver.cc CompilerLLVM::CompileDexFile等を経由しCompilerLLVM::CompileDexMethodへ? CompilerLLVM::CompileDexMethod art/compiler/llvm/compiler_llvm.cc CompileOneMethod,LLVMCompilationUnit::Materialize 43
おまけ:ARTにおけるLLVM Portableの場合 Dex2Oat::CreateOatFile art/dex2oat/dex2oat.cc 一番下にmainがあるのでそこから読んでみる
CompilerDriver::CompileAll art/compiler/llvm/compiler_driver.cc CompilerLLVM::CompileDexFile等を経由しCompilerLLVM::CompileDexMethodへ? CompilerLLVM::CompileDexMethod art/compiler/llvm/compiler_llvm.cc CompileOneMethod,LLVMCompilationUnit::Materialize CompileOneMethod frontend.ccのCompileMethodへ MIRの最適化とLLVMIRへの変換(PortableじゃなければArm/MIPS/X86CodeGenerator) 44
おまけ:ARTにおけるLLVM Portableの場合 Dex2Oat::CreateOatFile art/dex2oat/dex2oat.cc 一番下にmainがあるのでそこから読んでみる
CompilerDriver::CompileAll art/compiler/llvm/compiler_driver.cc CompilerLLVM::CompileDexFile等を経由しCompilerLLVM::CompileDexMethodへ? CompilerLLVM::CompileDexMethod art/compiler/llvm/compiler_llvm.cc CompileOneMethod,LLVMCompilationUnit::Materialize CompileOneMethod frontend.ccのCompileMethodへ MIRの最適化とLLVMIRへの変換(PortableじゃなければArm/MIPS/X86CodeGenerator) LLVMCompilationUnit::Materialize GBCExpanderの適用とPassManagerBuilderを利用してO3最適化 PassManagerはnothingcosmosさんのwikiとエントリがわかりやすいよ! 45
おまけ:ARTにおけるLLVM 今回読んだところ PortableはDex⇒MIR⇒MIR最適化⇒LLVMIR⇒GBCExpander⇒O3最適化⇒コード生成 SeaIRはDex⇒SeaGraph⇒LLVMIR⇒O3最適化⇒コード生成という感じ? 残念ながらPortableは動いていない?らしい 46
まとめ LLVMはコンパイラ基盤 コンパイラ基盤=中間表現とその操作セット Passを用いて解析や最適化 optコマンドで任意のPassを適用可能
自分で実装する場合は目的に応じて基底クラスを継承 Android4.4のARTでもLLVMが! PortableではDex⇒MIR⇒MIR最適化⇒LLVMIR⇒GBCExpander⇒O3最適化⇒コード生成 47
ありがとうございました 48