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キャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
180
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.7k
関数型プログラミングのメリットって何だろう?
wanko_it
0
190
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
230
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
390
Built Our Own Background Agent at LayerX #aidevex_findy
layerx
PRO
8
3.1k
Claude Team Plan導入・ガイド
tk3fftk
0
220
作るコストが小さくなった時代 幸せに働くために改めて考えたいこと 〜エンジニアとして価値を出し続けるために注視している二分野〜
yuppeeng
0
120
言語を使う側から、作る側へ。 自作 Lisp で得た新たな気づき。
andpad
0
130
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
17
9.3k
数百円から始めるRuby電子工作
tarosay
0
100
act2-costs.pdf
sumedhbala
0
120
Featured
See All Featured
Embracing the Ebb and Flow
colly
88
5.1k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
620
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
370
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
590
Being A Developer After 40
akosma
91
590k
Un-Boring Meetings
codingconduct
0
350
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
240
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
390
How to Ace a Technical Interview
jacobian
281
24k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
970
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