KEMBAR78
SIL for First Time Learners | PDF
Hi, I'm Yusuke
@kitasuke
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Why SIL? 
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Why SIL?
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Why SIL?
→ Better idea of Swift type system !
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Why SIL?
→ Better idea of Swift type system !
→ Optimizations magic "✨
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Why SIL?
→ Better idea of Swift type system !
→ Optimizations magic "✨
→ For fun and profit $
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
SIL  
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Swift
Intermediate
LanguageSIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
SIL is a language specific
Intermediate
Representation
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Swift 
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Swift Compiler
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Swift Compiler
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Swift Compiler
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
raw SIL
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
canonical SIL
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Objective-C 
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Clang   
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Clang
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
SIL  
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
How SIL works?
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
sample.swift
func number() -> Int {
let x: Int
x = 1
return x
}
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Emit SIL
$swiftc -emit-sil sample.swift > sample.sil
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
sample.sil
sil hidden @_T06sample6numberSiyF : $@convention(thin) () -> Int {
bb0:
%0 = alloc_stack $Int, let, name "x"
%1 = integer_literal $Builtin.Int64, 1
%2 = struct $Int (%1 : $Builtin.Int64)
store %2 to %0 : $*Int
dealloc_stack %0 : $*Int
return %2 : $Int
}
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
sample.sil
sil hidden @_T06sample6numberSiyF : $@convention(thin) () -> Int {
bb0:
%0 = alloc_stack $Int, let, name "x"
%1 = integer_literal $Builtin.Int64, 1
%2 = struct $Int (%1 : $Builtin.Int64)
store %2 to %0 : $*Int
dealloc_stack %0 : $*Int
return %2 : $Int
}
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
sample.sil
sil hidden @_T06sample6numberSiyF : $@convention(thin) () -> Int {
bb0:
%0 = alloc_stack $Int, let, name "x"
%1 = integer_literal $Builtin.Int64, 1
%2 = struct $Int (%1 : $Builtin.Int64)
store %2 to %0 : $*Int
dealloc_stack %0 : $*Int
return %2 : $Int
}
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
sample.sil
sil hidden @_T06sample6numberSiyF : $@convention(thin) () -> Int {
bb0:
%0 = alloc_stack $Int, let, name "x"
%1 = integer_literal $Builtin.Int64, 1
%2 = struct $Int (%1 : $Builtin.Int64)
store %2 to %0 : $*Int
dealloc_stack %0 : $*Int
return %2 : $Int
}
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
sample.sil
sil hidden @_T06sample6numberSiyF : $@convention(thin) () -> Int {
bb0:
%0 = alloc_stack $Int, let, name "x"
%1 = integer_literal $Builtin.Int64, 1
%2 = struct $Int (%1 : $Builtin.Int64)
store %2 to %0 : $*Int
dealloc_stack %0 : $*Int
return %2 : $Int
}
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
sample.sil
sil hidden @_T06sample6numberSiyF : $@convention(thin) () -> Int {
bb0:
%0 = alloc_stack $Int, let, name "x"
%1 = integer_literal $Builtin.Int64, 1
%2 = struct $Int (%1 : $Builtin.Int64)
store %2 to %0 : $*Int
dealloc_stack %0 : $*Int
return %2 : $Int
}
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
sample.sil
sil hidden @_T06sample6numberSiyF : $@convention(thin) () -> Int {
bb0:
%0 = alloc_stack $Int, let, name "x"
%1 = integer_literal $Builtin.Int64, 1
%2 = struct $Int (%1 : $Builtin.Int64)
store %2 to %0 : $*Int
dealloc_stack %0 : $*Int
return %2 : $Int
}
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
sample.sil
sil hidden @_T06sample6numberSiyF : $@convention(thin) () -> Int {
bb0:
%0 = alloc_stack $Int, let, name "x"
%1 = integer_literal $Builtin.Int64, 1
%2 = struct $Int (%1 : $Builtin.Int64)
store %2 to %0 : $*Int
dealloc_stack %0 : $*Int
return %2 : $Int
}
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
sample.sil
sil hidden @_T06sample6numberSiyF : $@convention(thin) () -> Int {
bb0:
%0 = alloc_stack $Int, let, name "x"
%1 = integer_literal $Builtin.Int64, 1
%2 = struct $Int (%1 : $Builtin.Int64)
store %2 to %0 : $*Int
dealloc_stack %0 : $*Int
return %2 : $Int
}
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Emit SIL with optimizations
$swiftc -emit-sil -O sample.swift > sample.sil
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
sample.sil with optimizations
sil hidden @_T06sample6numberSiyF : $@convention(thin) () -> Int {
bb0:
%0 = integer_literal $Builtin.Int64, 1
%1 = struct $Int (%0 : $Builtin.Int64)
return %1 : $Int
}
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
sample.sil with optimizations
sil hidden @_T06sample6numberSiyF : $@convention(thin) () -> Int {
bb0:
%0 = integer_literal $Builtin.Int64, 1
%1 = struct $Int (%0 : $Builtin.Int64)
return %1 : $Int
}
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
sample.sil with optimizations
sil hidden @_T06sample6numberSiyF : $@convention(thin) () -> Int {
bb0:
%0 = integer_literal $Builtin.Int64, 1
%1 = struct $Int (%0 : $Builtin.Int64)
return %1 : $Int
}
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
sample.sil with optimizations
sil hidden @_T06sample6numberSiyF : $@convention(thin) () -> Int {
bb0:
%0 = integer_literal $Builtin.Int64, 1
%1 = struct $Int (%0 : $Builtin.Int64)
return %1 : $Int
}
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
sample.sil with optimizations
sil hidden @_T06sample6numberSiyF : $@convention(thin) () -> Int {
bb0:
%0 = integer_literal $Builtin.Int64, 1
%1 = struct $Int (%0 : $Builtin.Int64)
return %1 : $Int
}
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
sample.sil with optimizations
sil hidden @_T06sample6numberSiyF : $@convention(thin) () -> Int {
bb0:
%0 = integer_literal $Builtin.Int64, 1
%1 = struct $Int (%0 : $Builtin.Int64)
return %1 : $Int
}
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Diff
sil hidden @_T06sample6numberSiyF : $@convention(thin) () -> Int {
bb0:
%0 = alloc_stack $Int, let, name "x"
%1 = integer_literal $Builtin.Int64, 1
%2 = struct $Int (%1 : $Builtin.Int64)
store %2 to %0 : $*Int
dealloc_stack %0 : $*Int
return %2 : $Int
}
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
sample.swift
func number() -> Int {
let x: Int
x = 1
return x
}
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
sample.swift with optimizations
func number() -> Int {
return 1
}
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Mem2Reg
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Register Promotion of
Stack Allocations
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Optimizations !✨
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Optimization flags
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Optimization flags
→ -Onone
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Optimization flags
→ -Onone
→ -O
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Optimization flags
→ -Onone
→ -O
→ -Ounchecked
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Optimization flags
→ -Onone
→ -O
→ -Ounchecked
→ -Osize
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Tips for debug
→ -Xllvm -sil-print-all
→ -Xllvm -sil-print-only-functions
→ -Xllvm -sil-print-before/after/around
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Summary
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Summary
→ Optimize, optimize and optimize !
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Summary
→ Optimize, optimize and optimize !
→ Better idea of how Swift Compiler works "
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Summary
→ Optimize, optimize and optimize !
→ Better idea of how Swift Compiler works "
→ Definitely worth learning #
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
References
→ Swift type in SIL
→ swift/docs/SIL.rst
→ Debugging the Swift Compiler
→ Swift's High-Level IR: A Case Study of
Complementing LLVM IR with Language-Specific
Optimization
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
Thank you!
SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018

SIL for First Time Learners

  • 2.
    Hi, I'm Yusuke @kitasuke SILfor First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 3.
    Why SIL?  SIL forFirst Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 4.
    Why SIL? SIL forFirst Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 5.
    Why SIL? → Betteridea of Swift type system ! SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 6.
    Why SIL? → Betteridea of Swift type system ! → Optimizations magic "✨ SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 7.
    Why SIL? → Betteridea of Swift type system ! → Optimizations magic "✨ → For fun and profit $ SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 8.
    SIL   SIL for FirstTime Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 9.
    Swift Intermediate LanguageSIL for FirstTime Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 10.
    SIL is alanguage specific Intermediate Representation SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 11.
    Swift  SIL for FirstTime Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 12.
    Swift Compiler SIL forFirst Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 13.
    Swift Compiler SIL forFirst Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 14.
    Swift Compiler SIL forFirst Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 15.
    raw SIL SIL forFirst Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 16.
    canonical SIL SIL forFirst Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 17.
    Objective-C  SIL for FirstTime Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 18.
    Clang    SIL for FirstTime Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 19.
    Clang SIL for FirstTime Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 20.
    SIL   SIL for FirstTime Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 21.
    How SIL works? SILfor First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 22.
    sample.swift func number() ->Int { let x: Int x = 1 return x } SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 23.
    Emit SIL $swiftc -emit-silsample.swift > sample.sil SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 24.
    sample.sil sil hidden @_T06sample6numberSiyF: $@convention(thin) () -> Int { bb0: %0 = alloc_stack $Int, let, name "x" %1 = integer_literal $Builtin.Int64, 1 %2 = struct $Int (%1 : $Builtin.Int64) store %2 to %0 : $*Int dealloc_stack %0 : $*Int return %2 : $Int } SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 25.
    sample.sil sil hidden @_T06sample6numberSiyF: $@convention(thin) () -> Int { bb0: %0 = alloc_stack $Int, let, name "x" %1 = integer_literal $Builtin.Int64, 1 %2 = struct $Int (%1 : $Builtin.Int64) store %2 to %0 : $*Int dealloc_stack %0 : $*Int return %2 : $Int } SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 26.
    sample.sil sil hidden @_T06sample6numberSiyF: $@convention(thin) () -> Int { bb0: %0 = alloc_stack $Int, let, name "x" %1 = integer_literal $Builtin.Int64, 1 %2 = struct $Int (%1 : $Builtin.Int64) store %2 to %0 : $*Int dealloc_stack %0 : $*Int return %2 : $Int } SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 27.
    sample.sil sil hidden @_T06sample6numberSiyF: $@convention(thin) () -> Int { bb0: %0 = alloc_stack $Int, let, name "x" %1 = integer_literal $Builtin.Int64, 1 %2 = struct $Int (%1 : $Builtin.Int64) store %2 to %0 : $*Int dealloc_stack %0 : $*Int return %2 : $Int } SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 28.
    sample.sil sil hidden @_T06sample6numberSiyF: $@convention(thin) () -> Int { bb0: %0 = alloc_stack $Int, let, name "x" %1 = integer_literal $Builtin.Int64, 1 %2 = struct $Int (%1 : $Builtin.Int64) store %2 to %0 : $*Int dealloc_stack %0 : $*Int return %2 : $Int } SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 29.
    sample.sil sil hidden @_T06sample6numberSiyF: $@convention(thin) () -> Int { bb0: %0 = alloc_stack $Int, let, name "x" %1 = integer_literal $Builtin.Int64, 1 %2 = struct $Int (%1 : $Builtin.Int64) store %2 to %0 : $*Int dealloc_stack %0 : $*Int return %2 : $Int } SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 30.
    sample.sil sil hidden @_T06sample6numberSiyF: $@convention(thin) () -> Int { bb0: %0 = alloc_stack $Int, let, name "x" %1 = integer_literal $Builtin.Int64, 1 %2 = struct $Int (%1 : $Builtin.Int64) store %2 to %0 : $*Int dealloc_stack %0 : $*Int return %2 : $Int } SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 31.
    sample.sil sil hidden @_T06sample6numberSiyF: $@convention(thin) () -> Int { bb0: %0 = alloc_stack $Int, let, name "x" %1 = integer_literal $Builtin.Int64, 1 %2 = struct $Int (%1 : $Builtin.Int64) store %2 to %0 : $*Int dealloc_stack %0 : $*Int return %2 : $Int } SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 32.
    sample.sil sil hidden @_T06sample6numberSiyF: $@convention(thin) () -> Int { bb0: %0 = alloc_stack $Int, let, name "x" %1 = integer_literal $Builtin.Int64, 1 %2 = struct $Int (%1 : $Builtin.Int64) store %2 to %0 : $*Int dealloc_stack %0 : $*Int return %2 : $Int } SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 33.
    Emit SIL withoptimizations $swiftc -emit-sil -O sample.swift > sample.sil SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 34.
    sample.sil with optimizations silhidden @_T06sample6numberSiyF : $@convention(thin) () -> Int { bb0: %0 = integer_literal $Builtin.Int64, 1 %1 = struct $Int (%0 : $Builtin.Int64) return %1 : $Int } SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 35.
    sample.sil with optimizations silhidden @_T06sample6numberSiyF : $@convention(thin) () -> Int { bb0: %0 = integer_literal $Builtin.Int64, 1 %1 = struct $Int (%0 : $Builtin.Int64) return %1 : $Int } SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 36.
    sample.sil with optimizations silhidden @_T06sample6numberSiyF : $@convention(thin) () -> Int { bb0: %0 = integer_literal $Builtin.Int64, 1 %1 = struct $Int (%0 : $Builtin.Int64) return %1 : $Int } SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 37.
    sample.sil with optimizations silhidden @_T06sample6numberSiyF : $@convention(thin) () -> Int { bb0: %0 = integer_literal $Builtin.Int64, 1 %1 = struct $Int (%0 : $Builtin.Int64) return %1 : $Int } SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 38.
    sample.sil with optimizations silhidden @_T06sample6numberSiyF : $@convention(thin) () -> Int { bb0: %0 = integer_literal $Builtin.Int64, 1 %1 = struct $Int (%0 : $Builtin.Int64) return %1 : $Int } SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 39.
    sample.sil with optimizations silhidden @_T06sample6numberSiyF : $@convention(thin) () -> Int { bb0: %0 = integer_literal $Builtin.Int64, 1 %1 = struct $Int (%0 : $Builtin.Int64) return %1 : $Int } SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 40.
    Diff sil hidden @_T06sample6numberSiyF: $@convention(thin) () -> Int { bb0: %0 = alloc_stack $Int, let, name "x" %1 = integer_literal $Builtin.Int64, 1 %2 = struct $Int (%1 : $Builtin.Int64) store %2 to %0 : $*Int dealloc_stack %0 : $*Int return %2 : $Int } SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 41.
    sample.swift func number() ->Int { let x: Int x = 1 return x } SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 42.
    sample.swift with optimizations funcnumber() -> Int { return 1 } SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 43.
    Mem2Reg SIL for FirstTime Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 44.
    Register Promotion of StackAllocations SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 45.
    Optimizations !✨ SIL forFirst Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 46.
    Optimization flags SIL forFirst Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 47.
    Optimization flags → -Onone SILfor First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 48.
    Optimization flags → -Onone →-O SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 49.
    Optimization flags → -Onone →-O → -Ounchecked SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 50.
    Optimization flags → -Onone →-O → -Ounchecked → -Osize SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 51.
    Tips for debug →-Xllvm -sil-print-all → -Xllvm -sil-print-only-functions → -Xllvm -sil-print-before/after/around SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 52.
    Summary SIL for FirstTime Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 53.
    Summary → Optimize, optimizeand optimize ! SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 54.
    Summary → Optimize, optimizeand optimize ! → Better idea of how Swift Compiler works " SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 55.
    Summary → Optimize, optimizeand optimize ! → Better idea of how Swift Compiler works " → Definitely worth learning # SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 56.
    References → Swift typein SIL → swift/docs/SIL.rst → Debugging the Swift Compiler → Swift's High-Level IR: A Case Study of Complementing LLVM IR with Language-Specific Optimization SIL for First Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018
  • 57.
    Thank you! SIL forFirst Time Learners, Yusuke Kita (@kitasuke), /dev/world/2018