際際滷

際際滷Share a Scribd company logo
64-bit SML#*に鬚韻
Shun Sakuraba (@chunjp)
* フォントの脅栽のため、このスライドを宥じて?(シャ`プ)ではなく#(ハッシュ)を聞います。
デモLLVMコ`ドをいてみよう
% smlsharp -S -emit-llvm a.sml
% cat a.ll
fun factorial n = let
fun lp (0, acc) = acc
| lp (m, acc) = lp (m-1, m*acc)
in
lp (n, 1)
end
デモLLVMコ`ドをいてみよう
L16: ; preds = %L17
%v81 = getelementptr inbounds i8* %v78, i32 4
%v82 = bitcast i8* %v81 to i32*
%v27 = load i32* %v82
%v19 = sub nsw i32 %v25, 1
%v20 = mul nsw i32 %v25, %v27
%v63 = call i8* @sml_alloc(i32 inreg 12) #0
%v83 = bitcast i8* %v63 to i32*
%v84 = getelementptr inbounds i32* %v83, i32 -1
store i32 1342177288, i32* %v84
%v85 = getelementptr inbounds i8* %v63, i32 0
%v86 = bitcast i8* %v85 to i32*
store i32 %v19, i32* %v86
%v87 = getelementptr inbounds i8* %v63, i32 4
%v88 = bitcast i8* %v87 to i32*
store i32 %v20, i32* %v88
%v89 = getelementptr inbounds i8* %v63, i32 8
%v90 = bitcast i8* %v89 to i32*
store i32 0, i32* %v90
br label %L17
LLVMコ`ドをiんでみる
L16:
%v81 = getelementptr inbounds i8* %v78, i32 4
%v82 = bitcast i8* %v81 to i32*
%v27 = load i32* %v82
%v19 = sub nsw i32 %v25, 1
%v20 = mul nsw i32 %v25, %v27
%v63 = call i8* @sml_alloc(i32 inreg 12) #0
%v83 = bitcast i8* %v63 to i32*
%v84 = getelementptr inbounds i32* %v83, i32 -1
store i32 1342177288, i32* %v84
%v85 = getelementptr inbounds i8* %v63, i32 0
%v86 = bitcast i8* %v85 to i32*
store i32 %v19, i32* %v86
%v87 = getelementptr inbounds i8* %v63, i32 4
%v88 = bitcast i8* %v87 to i32*
store i32 %v20, i32* %v88
%v89 = getelementptr inbounds i8* %v63, i32 8
%v90 = bitcast i8* %v89 to i32*
store i32 0, i32* %v90
br label %L17
L16:
char* v81 = &v78[4];
int* v82 = (int*)v81;
int v27 = *v82;
int v19 = v25 C 1;
int v20 = v25 * v27;
char* v63 = sml_alloc(12);
int *v83 = (int*)v63;
int *v84 = &v83[-1];
*v84 = 1342177288; /* 0x50000008 */
char *v85 = &v63[0];
int *v86 = (int*)v85;
*v86 = v19;
char *v87 = &v63[4];
int *v88 = (int*)v87;
*v88 = v20;
char *v89 = &v63[8];
int *v90 = (int*)v89;
*v90 = 0;
goto L17;
C冱Zへの吭ULLVM
コ`ドの吭龍は´´
? どうてもメモリレイアウトを返咾任笋辰討い泙
云輝に(ry
char *v85 = &v63[0];
int *v86 = (int*)v85;
*v86 = v19;
char *v87 = &v63[4];
int *v88 = (int*)v87;
*v88 = v20;
char *v89 = &v63[8];
int *v90 = (int*)v89;
*v90 = 0;
Q: なぜ、こんなことになったの
か
? A1: GCがメモリレイアウト卆贋だから
? Bitmap GCのランタイムがメモリレイアウトに卆贋する
? GCとLLVMを慌贋させるには、聞喘嶄のポインタが屎しく
GCによって弖Eできなければならない。この圭塀なら_
gにメモリにきzみが頼阻していることを隠^できる
? A2: LLVMとSML#のgのいくつかの詰レベル侏の
erを屎しくI尖するため
? SML#はコンパイルパスの嶄Pで侏秤鵑匯何える
? A3: LLVMのformal semanticsが音苧でクソ
? compiler/llvmgen/main/LLVMGen.smlなどで母岑すべし
Q: なぜSML#がWいのか
? A: Pointer-aliasing が軟きうるから
? v63と&v19, v63と&v20などのメモリI囃が嶷なっている
辛嬬來がある
? 仝メモリiみzみ★きzみ々となるようコ`ドを伏撹し、
この會を筝できない
char *v85 = &v63[0];
int *v86 = (int*)v85;
*v86 = v19;
char *v87 = &v63[4];
int *v88 = (int*)v87;
*v88 = v20;
char *v89 = &v63[8];
int *v90 = (int*)v89;
*v90 = 0;
Q: 64-bitへの鬹┌
? A: 匯庶Iではいかない。
? LLVMEmit, LLVMGen などのWord32をWord64などに
きQえる
? もちろん、より挫ましいのはwrapper moduleを恬ること
? LLVMGen坪何の謹楚のI32のうち、駅勣なものをI64に
? GCのためbitmap原きデ`タの夛を64bitに栽わせる
(BitmapCompilation2, runtimetypes/TypeLayout2.sml)
? GC runtimeのきQえ
? ConfigureのきQえ
Q: 互堀晒のための鬹┌
? A1: 恷も嶷勣なのは、デ`タ侏をLLVMに尖盾しや
すい侘にすること
? 夛悶は夛悶としてI尖する
? 苧幣議ポインタ處麻をpらす
? ★これらには余嶄のデ`タ夛の寄きな垢並が駅勣、
BitmapCompilationが仝壼すぎ々るのが}
? A2: SML#箸任靴竃栖ない碧並の方?
? エスケ`プ盾裂嶷勣
? 侏に児づく恷m晒、エイリアスが軟こらないことの苧幣
? 剃にLLVM箸燃栖ることにエネルギ`を護かない
? A3: ランタイム(GC)の互堀晒
j謹な深えとか
? 暴がコアデベロッパ`なら、64-bit鬉bitmap伏
撹のr泣をずらすか、bitmap伏撹瘁も侏秤鵑鮨
嬬な泙蟆个垢里藩rに佩う。
? 伏磯辛な64-bit鬉呂燭世龍業返gにならないか
? コアデベロッパ`のプランが療ければ療いておきたい
SML# 2.0.0
hacking guide
コンパイルパス
(toplevel2/main/top.sml)
Parser Elaborator NameEval SQL VALREC
InferTypesMatchFFIRecordDatatype
Bitmap Closure
Calling
Convention
ANormalize
Machine
CodeGen
Stack
Allocation
LLVMGenLLVMEmit
恷m晒オプションによってのみオンになるI尖は福待
余嶄の猟直をダンプする
テ`ブルの匯Eは smlsharp -d を歌孚
smlsharp -dprintBitmapCompile=yes a.sml
恷K伏撹コ`ドをiむ
LLVM:
smlsharp -S -emit-llvm a.sml
cat a.ll
ia32:
smlsharp -S a.sml
cat a.s

More Related Content

What's hot (12)

Boost.SIMD
Boost.SIMDBoost.SIMD
Boost.SIMD
Akira Takahashi
?
皆皆掘4.2の猟忖双I尖凋綜の府初
皆皆掘4.2の猟忖双I尖凋綜の府初皆皆掘4.2の猟忖双I尖凋綜の府初
皆皆掘4.2の猟忖双I尖凋綜の府初
MITSUNARI Shigeo
?
Xeon PhiとN悶麻コ`ディング x86/x64恷m晒茶氏6(@k_nitadoriさんの旗尖アップ)
Xeon PhiとN悶麻コ`ディング x86/x64恷m晒茶氏6(@k_nitadoriさんの旗尖アップ)Xeon PhiとN悶麻コ`ディング x86/x64恷m晒茶氏6(@k_nitadoriさんの旗尖アップ)
Xeon PhiとN悶麻コ`ディング x86/x64恷m晒茶氏6(@k_nitadoriさんの旗尖アップ)
MITSUNARI Shigeo
?
20180728 halide-study
20180728 halide-study20180728 halide-study
20180728 halide-study
Fixstars Corporation
?
Designing video game hardware in verilog
Designing video game hardware in verilogDesigning video game hardware in verilog
Designing video game hardware in verilog
Atsuki Takahashi
?
v|GPGPU茶氏 LLVM meets GPU
v|GPGPU茶氏 LLVM meets GPUv|GPGPU茶氏 LLVM meets GPU
v|GPGPU茶氏 LLVM meets GPU
Takuro Iizuka
?
晦晦閣珂で嗄ぶ屁方R抹とか、恰86鬚韻臨垓ベクトル晒とか
晦晦閣珂で嗄ぶ屁方R抹とか、恰86鬚韻臨垓ベクトル晒とか晦晦閣珂で嗄ぶ屁方R抹とか、恰86鬚韻臨垓ベクトル晒とか
晦晦閣珂で嗄ぶ屁方R抹とか、恰86鬚韻臨垓ベクトル晒とか
Takeshi Yamamuro
?
掘鉛赫温馨温鉛侏圧催猟にする販吭v方處麻?壅圧催晒の屈宀寂蜘畜柴麻プロトコルとその鮄
掘鉛赫温馨温鉛侏圧催猟にする販吭v方處麻?壅圧催晒の屈宀寂蜘畜柴麻プロトコルとその鮄掘鉛赫温馨温鉛侏圧催猟にする販吭v方處麻?壅圧催晒の屈宀寂蜘畜柴麻プロトコルとその鮄
掘鉛赫温馨温鉛侏圧催猟にする販吭v方處麻?壅圧催晒の屈宀寂蜘畜柴麻プロトコルとその鮄
MITSUNARI Shigeo
?
Emcpp item31
Emcpp item31Emcpp item31
Emcpp item31
mitsutaka_takeda
?
Cloud TPU Driver API ソ`スコ`ド盾裂
Cloud TPU Driver API ソ`スコ`ド盾裂Cloud TPU Driver API ソ`スコ`ド盾裂
Cloud TPU Driver API ソ`スコ`ド盾裂
Mr. Vengineer
?
皆皆掘4.2の猟忖双I尖凋綜の府初
皆皆掘4.2の猟忖双I尖凋綜の府初皆皆掘4.2の猟忖双I尖凋綜の府初
皆皆掘4.2の猟忖双I尖凋綜の府初
MITSUNARI Shigeo
?
Xeon PhiとN悶麻コ`ディング x86/x64恷m晒茶氏6(@k_nitadoriさんの旗尖アップ)
Xeon PhiとN悶麻コ`ディング x86/x64恷m晒茶氏6(@k_nitadoriさんの旗尖アップ)Xeon PhiとN悶麻コ`ディング x86/x64恷m晒茶氏6(@k_nitadoriさんの旗尖アップ)
Xeon PhiとN悶麻コ`ディング x86/x64恷m晒茶氏6(@k_nitadoriさんの旗尖アップ)
MITSUNARI Shigeo
?
Designing video game hardware in verilog
Designing video game hardware in verilogDesigning video game hardware in verilog
Designing video game hardware in verilog
Atsuki Takahashi
?
v|GPGPU茶氏 LLVM meets GPU
v|GPGPU茶氏 LLVM meets GPUv|GPGPU茶氏 LLVM meets GPU
v|GPGPU茶氏 LLVM meets GPU
Takuro Iizuka
?
晦晦閣珂で嗄ぶ屁方R抹とか、恰86鬚韻臨垓ベクトル晒とか
晦晦閣珂で嗄ぶ屁方R抹とか、恰86鬚韻臨垓ベクトル晒とか晦晦閣珂で嗄ぶ屁方R抹とか、恰86鬚韻臨垓ベクトル晒とか
晦晦閣珂で嗄ぶ屁方R抹とか、恰86鬚韻臨垓ベクトル晒とか
Takeshi Yamamuro
?
掘鉛赫温馨温鉛侏圧催猟にする販吭v方處麻?壅圧催晒の屈宀寂蜘畜柴麻プロトコルとその鮄
掘鉛赫温馨温鉛侏圧催猟にする販吭v方處麻?壅圧催晒の屈宀寂蜘畜柴麻プロトコルとその鮄掘鉛赫温馨温鉛侏圧催猟にする販吭v方處麻?壅圧催晒の屈宀寂蜘畜柴麻プロトコルとその鮄
掘鉛赫温馨温鉛侏圧催猟にする販吭v方處麻?壅圧催晒の屈宀寂蜘畜柴麻プロトコルとその鮄
MITSUNARI Shigeo
?
Cloud TPU Driver API ソ`スコ`ド盾裂
Cloud TPU Driver API ソ`スコ`ド盾裂Cloud TPU Driver API ソ`スコ`ド盾裂
Cloud TPU Driver API ソ`スコ`ド盾裂
Mr. Vengineer
?

Similar to 64-bit SML# への謁 (11)

Cvim saisentan 磯娼業検嗤(泣方 half
Cvim saisentan 磯娼業検嗤(泣方 halfCvim saisentan 磯娼業検嗤(泣方 half
Cvim saisentan 磯娼業検嗤(泣方 half
tomoaki0705
?
晦晦閣珂恷癖晒のこつ
晦晦閣珂恷癖晒のこつ晦晦閣珂恷癖晒のこつ
晦晦閣珂恷癖晒のこつ
MITSUNARI Shigeo
?
PBL1-v1-007j.pptx
PBL1-v1-007j.pptxPBL1-v1-007j.pptx
PBL1-v1-007j.pptx
NAIST
?
お念は PHP のs雰議な尖喇の方をえているのか
お念は PHP のs雰議な尖喇の方をえているのかお念は PHP のs雰議な尖喇の方をえているのか
お念は PHP のs雰議な尖喇の方をえているのか
Kousuke Ebihara
?
PBL1-v1-003j.pptx
PBL1-v1-003j.pptxPBL1-v1-003j.pptx
PBL1-v1-003j.pptx
NAIST
?
PBL1-v1-010j.pptx
PBL1-v1-010j.pptxPBL1-v1-010j.pptx
PBL1-v1-010j.pptx
NAIST
?
HPC Phys-20201203
HPC Phys-20201203HPC Phys-20201203
HPC Phys-20201203
MITSUNARI Shigeo
?
堰温壊一艶鉛鉛ではじめる遺看姻岳艶恰-珂3怏zみプログラミング
堰温壊一艶鉛鉛ではじめる遺看姻岳艶恰-珂3怏zみプログラミング堰温壊一艶鉛鉛ではじめる遺看姻岳艶恰-珂3怏zみプログラミング
堰温壊一艶鉛鉛ではじめる遺看姻岳艶恰-珂3怏zみプログラミング
Kiwamu Okabe
?
cp-11. ポインタ
cp-11. ポインタcp-11. ポインタ
cp-11. ポインタ
kunihikokaneko1
?
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
yak1ex
?
Cvim saisentan 磯娼業検嗤(泣方 half
Cvim saisentan 磯娼業検嗤(泣方 halfCvim saisentan 磯娼業検嗤(泣方 half
Cvim saisentan 磯娼業検嗤(泣方 half
tomoaki0705
?
晦晦閣珂恷癖晒のこつ
晦晦閣珂恷癖晒のこつ晦晦閣珂恷癖晒のこつ
晦晦閣珂恷癖晒のこつ
MITSUNARI Shigeo
?
PBL1-v1-007j.pptx
PBL1-v1-007j.pptxPBL1-v1-007j.pptx
PBL1-v1-007j.pptx
NAIST
?
お念は PHP のs雰議な尖喇の方をえているのか
お念は PHP のs雰議な尖喇の方をえているのかお念は PHP のs雰議な尖喇の方をえているのか
お念は PHP のs雰議な尖喇の方をえているのか
Kousuke Ebihara
?
PBL1-v1-003j.pptx
PBL1-v1-003j.pptxPBL1-v1-003j.pptx
PBL1-v1-003j.pptx
NAIST
?
PBL1-v1-010j.pptx
PBL1-v1-010j.pptxPBL1-v1-010j.pptx
PBL1-v1-010j.pptx
NAIST
?
堰温壊一艶鉛鉛ではじめる遺看姻岳艶恰-珂3怏zみプログラミング
堰温壊一艶鉛鉛ではじめる遺看姻岳艶恰-珂3怏zみプログラミング堰温壊一艶鉛鉛ではじめる遺看姻岳艶恰-珂3怏zみプログラミング
堰温壊一艶鉛鉛ではじめる遺看姻岳艶恰-珂3怏zみプログラミング
Kiwamu Okabe
?
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
yak1ex
?

64-bit SML# への謁

  • 1. 64-bit SML#*に鬚韻 Shun Sakuraba (@chunjp) * フォントの脅栽のため、このスライドを宥じて?(シャ`プ)ではなく#(ハッシュ)を聞います。
  • 2. デモLLVMコ`ドをいてみよう % smlsharp -S -emit-llvm a.sml % cat a.ll fun factorial n = let fun lp (0, acc) = acc | lp (m, acc) = lp (m-1, m*acc) in lp (n, 1) end
  • 3. デモLLVMコ`ドをいてみよう L16: ; preds = %L17 %v81 = getelementptr inbounds i8* %v78, i32 4 %v82 = bitcast i8* %v81 to i32* %v27 = load i32* %v82 %v19 = sub nsw i32 %v25, 1 %v20 = mul nsw i32 %v25, %v27 %v63 = call i8* @sml_alloc(i32 inreg 12) #0 %v83 = bitcast i8* %v63 to i32* %v84 = getelementptr inbounds i32* %v83, i32 -1 store i32 1342177288, i32* %v84 %v85 = getelementptr inbounds i8* %v63, i32 0 %v86 = bitcast i8* %v85 to i32* store i32 %v19, i32* %v86 %v87 = getelementptr inbounds i8* %v63, i32 4 %v88 = bitcast i8* %v87 to i32* store i32 %v20, i32* %v88 %v89 = getelementptr inbounds i8* %v63, i32 8 %v90 = bitcast i8* %v89 to i32* store i32 0, i32* %v90 br label %L17
  • 4. LLVMコ`ドをiんでみる L16: %v81 = getelementptr inbounds i8* %v78, i32 4 %v82 = bitcast i8* %v81 to i32* %v27 = load i32* %v82 %v19 = sub nsw i32 %v25, 1 %v20 = mul nsw i32 %v25, %v27 %v63 = call i8* @sml_alloc(i32 inreg 12) #0 %v83 = bitcast i8* %v63 to i32* %v84 = getelementptr inbounds i32* %v83, i32 -1 store i32 1342177288, i32* %v84 %v85 = getelementptr inbounds i8* %v63, i32 0 %v86 = bitcast i8* %v85 to i32* store i32 %v19, i32* %v86 %v87 = getelementptr inbounds i8* %v63, i32 4 %v88 = bitcast i8* %v87 to i32* store i32 %v20, i32* %v88 %v89 = getelementptr inbounds i8* %v63, i32 8 %v90 = bitcast i8* %v89 to i32* store i32 0, i32* %v90 br label %L17 L16: char* v81 = &v78[4]; int* v82 = (int*)v81; int v27 = *v82; int v19 = v25 C 1; int v20 = v25 * v27; char* v63 = sml_alloc(12); int *v83 = (int*)v63; int *v84 = &v83[-1]; *v84 = 1342177288; /* 0x50000008 */ char *v85 = &v63[0]; int *v86 = (int*)v85; *v86 = v19; char *v87 = &v63[4]; int *v88 = (int*)v87; *v88 = v20; char *v89 = &v63[8]; int *v90 = (int*)v89; *v90 = 0; goto L17; C冱Zへの吭ULLVM
  • 5. コ`ドの吭龍は´´ ? どうてもメモリレイアウトを返咾任笋辰討い泙 云輝に(ry char *v85 = &v63[0]; int *v86 = (int*)v85; *v86 = v19; char *v87 = &v63[4]; int *v88 = (int*)v87; *v88 = v20; char *v89 = &v63[8]; int *v90 = (int*)v89; *v90 = 0;
  • 6. Q: なぜ、こんなことになったの か ? A1: GCがメモリレイアウト卆贋だから ? Bitmap GCのランタイムがメモリレイアウトに卆贋する ? GCとLLVMを慌贋させるには、聞喘嶄のポインタが屎しく GCによって弖Eできなければならない。この圭塀なら_ gにメモリにきzみが頼阻していることを隠^できる ? A2: LLVMとSML#のgのいくつかの詰レベル侏の erを屎しくI尖するため ? SML#はコンパイルパスの嶄Pで侏秤鵑匯何える ? A3: LLVMのformal semanticsが音苧でクソ ? compiler/llvmgen/main/LLVMGen.smlなどで母岑すべし
  • 7. Q: なぜSML#がWいのか ? A: Pointer-aliasing が軟きうるから ? v63と&v19, v63と&v20などのメモリI囃が嶷なっている 辛嬬來がある ? 仝メモリiみzみ★きzみ々となるようコ`ドを伏撹し、 この會を筝できない char *v85 = &v63[0]; int *v86 = (int*)v85; *v86 = v19; char *v87 = &v63[4]; int *v88 = (int*)v87; *v88 = v20; char *v89 = &v63[8]; int *v90 = (int*)v89; *v90 = 0;
  • 8. Q: 64-bitへの鬹┌ ? A: 匯庶Iではいかない。 ? LLVMEmit, LLVMGen などのWord32をWord64などに きQえる ? もちろん、より挫ましいのはwrapper moduleを恬ること ? LLVMGen坪何の謹楚のI32のうち、駅勣なものをI64に ? GCのためbitmap原きデ`タの夛を64bitに栽わせる (BitmapCompilation2, runtimetypes/TypeLayout2.sml) ? GC runtimeのきQえ ? ConfigureのきQえ
  • 9. Q: 互堀晒のための鬹┌ ? A1: 恷も嶷勣なのは、デ`タ侏をLLVMに尖盾しや すい侘にすること ? 夛悶は夛悶としてI尖する ? 苧幣議ポインタ處麻をpらす ? ★これらには余嶄のデ`タ夛の寄きな垢並が駅勣、 BitmapCompilationが仝壼すぎ々るのが} ? A2: SML#箸任靴竃栖ない碧並の方? ? エスケ`プ盾裂嶷勣 ? 侏に児づく恷m晒、エイリアスが軟こらないことの苧幣 ? 剃にLLVM箸燃栖ることにエネルギ`を護かない ? A3: ランタイム(GC)の互堀晒
  • 12. コンパイルパス (toplevel2/main/top.sml) Parser Elaborator NameEval SQL VALREC InferTypesMatchFFIRecordDatatype Bitmap Closure Calling Convention ANormalize Machine CodeGen Stack Allocation LLVMGenLLVMEmit 恷m晒オプションによってのみオンになるI尖は福待
  • 13. 余嶄の猟直をダンプする テ`ブルの匯Eは smlsharp -d を歌孚 smlsharp -dprintBitmapCompile=yes a.sml
  • 14. 恷K伏撹コ`ドをiむ LLVM: smlsharp -S -emit-llvm a.sml cat a.ll ia32: smlsharp -S a.sml cat a.s