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.5k
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
新卒PdEのリアル
ryu1013
1
390
LLMは4年分のCompose移行を再現できるのか?実プロダクト279件のXMLで探る自動化の境界線
makun
0
380
Building an Out-of-Order CPU
latte72
0
670
KotlinConf Extended South Korea 2026 Keynote
l2hyunwoo
0
130
Go 1.27からのGODEBUG / Go 1.27 リリースパーティ #go127party
mazrean
0
300
ALB ログから Trace を気合で繋げる技術
fohte
7
870
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
560
Flow は今どうなっているか
mizdra
PRO
0
920
「AI時代、配布するPythonコードをどう守るか: 難読化の実験と判断軸」 #PyconJP2026
pkshadeck
PRO
2
160
コンパウンドプロダクト開発のためのローカルプロセスマネージャー再発明 #layerxgo
izumin5210
0
630
Discordを用いたラボオートメーション関連情報収集の自動化
noguhiro2002
0
500
From 6 People Classroom Meetup to 100 People Regional Conference / FOSS4G Hiroshima 2026
furukawayasuto
0
110
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
698
190k
Prompt Engineering for Job Search
mfonobong
0
440
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
Agile that works and the tools we love
rasmusluckow
331
22k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
230
From π to Pie charts
rasagy
0
350
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
Building the Perfect Custom Keyboard
takai
2
860
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
300
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
660
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
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