
рд╣рдо рд╕реНрд╡рд┐рдлреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рд╕реНрд╡рд┐рдлреНрдЯ рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рднрд╛рд╖рд╛ рдХреЛ рд╕рдорд░реНрдкрд┐рдд рд╣реИред
рдпрджрд┐ рдЖрдкрдиреЗ рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдирд╣реАрдВ рджреЗрдЦреЗ рд╣реИрдВ, рддреЛ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рд▓рд┐рдВрдХ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░реЗрдВ рдФрд░ рдкрдврд╝реЗрдВ:
SILGen
рдЕрдЧрд▓рд╛ рдЪрд░рдг рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдПрдПрд╕рдЯреА рдХреЛ рдХрдЪреНрдЪреЗ рдПрд╕рдЖрдИрдПрд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рд╣реИред рд╕реНрд╡рд┐рдлреНрдЯ рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рднрд╛рд╖рд╛ (рдПрд╕рдЖрдИрдПрд▓) рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реНрд╡рд┐рдлреНрдЯ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рднреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдПрд╕рдЖрдИрдПрд▓ рдХрд╛ рдПрдХ рдПрд╕рдПрд╕рдП рд░реВрдк рд╣реИред рд╕реНрдЯреЗрдЯрд┐рдХ рд╕рд┐рдВрдЧрд▓ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ (рдПрд╕рдПрд╕рдП) - рдПрдХ рдХреЛрдб рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдПрдХ рдорд╛рди рд╕реМрдВрдкрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪрд░ рдЬреЛрдбрд╝рдХрд░ рдирд┐рдпрдорд┐рдд рдХреЛрдб рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рддреНрдпрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдмрд╛рдж рдПрдХ рдЪрд░ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдиреАрдЪреЗ рдЫрджреНрдо рдХреЛрдб рдкрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ:
a = 1 a = 2 b = a
рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╣реИред рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рдХреЛ рдкрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рдХреЛ рдЧреИрд░-рддреБрдЪреНрдЫ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдПрд╕рдПрд╕рдП рдХреЗ рд╕рд╛рде, рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдЕрдм, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рднреА, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ рдХрд┐ рдЪрд░ a1 рдХреЗ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд░реЗрдЦрд╛ рдирд┐рдореНрди рд╣реЛ рд╕рдХрддреА рд╣реИ:
a1 = 1 a2 = 2 b1 = a2
рдПрд╕рдЖрдИрдПрд▓ рдЖрдкрдХреЛ рд╕реНрд╡рд┐рдлреНрдЯ рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрдХреВрд▓рди рдФрд░ рдЬрд╛рдВрдЪ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдПрдПрд╕рдЯреА рдЪрд░рдг рдореЗрдВ рдкреВрд░рд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдпрд╛ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред
рдПрд╕рдЖрдИрдПрд▓ рдЬреЗрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
SIL рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, -emit-silgen рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
swiftc -emit-silgen main.swift
рдЖрджреЗрд╢ рдХрд╛ рдкрд░рд┐рдгрд╛рдо:
sil_stage raw import Builtin import Swift import SwiftShims let x: Int // x sil_global hidden [let] @$S4main1xSivp : $Int // main sil @main : $@convention(c) (Int32, UnsafeMutablePointer<Optional<UnsafeMutablePointer<Int8>>>) -> Int32 { bb0(%0 : $Int32, %1 : $UnsafeMutablePointer<Optional<UnsafeMutablePointer<Int8>>>): alloc_global @$S4main1xSivp // id: %2 %3 = global_addr @$S4main1xSivp : $*Int // user: %8 %4 = metatype $@thin Int.Type // user: %7 %5 = integer_literal $Builtin.Int2048, 16 // user: %7 // function_ref Int.init(_builtinIntegerLiteral:) %6 = function_ref @$SSi22_builtinIntegerLiteralSiBi2048__tcfC : $@convention(method) (Builtin.Int2048, @thin Int.Type) -> Int // user: %7 %7 = apply %6(%5, %4) : $@convention(method) (Builtin.Int2048, @thin Int.Type) -> Int // user: %8 store %7 to [trivial] %3 : $*Int // id: %8 %9 = integer_literal $Builtin.Int32, 0 // user: %10 %10 = struct $Int32 (%9 : $Builtin.Int32) // user: %11 return %10 : $Int32 // id: %11 } // end sil function 'main' // Int.init(_builtinIntegerLiteral:) sil [transparent] [serialized] @$SSi22_builtinIntegerLiteralSiBi2048__tcfC : $@convention(method) (Builtin.Int2048, @thin Int.Type) -> Int
рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХреА рддрд░рд╣ рдПрд╕рдЖрдИрдПрд▓ рдХреЛ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдЗрд╕рдореЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рд╕реНрддрд░ рдкрд░ рд╕реНрд╡рд┐рдлреНрдЯ рдореЙрдбреНрдпреВрд▓ рдмрд┐рд▓рд┐рди, рд╕реНрд╡рд┐рдлреНрдЯ рдФрд░ рд╕реНрд╡рд┐рдлреНрдЯрд╢рдореНрд╕ рдХреЗ рдЖрдпрд╛рдд рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд╕реНрд╡рд┐рдлреНрдЯ рдХреЛрдб рдХреЛ рд╕реАрдзреЗ рд╡реИрд╢реНрд╡рд┐рдХ рджрд╛рдпрд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рд┐рд▓реНрдЧрди рдореБрдЦреНрдп рдХрд╛рд░реНрдп - рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рд╕рднреА рдХреЛрдб рдЗрд╕рдХреЗ рдЕрдВрджрд░ рд╕реНрдерд┐рдд рдереЗ, рд╕рд┐рд╡рд╛рдп рдПрдХ рд╕реНрдерд┐рд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡реИрд╢реНрд╡рд┐рдХ рд╣реИ рдФрд░ рд╣рд░ рдЬрдЧрд╣ рд╕реБрд▓рдн рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд╕рдВрд░рдЪрдирд╛ рд╣реЛрддреА рд╣реИред рдмрд╛рдИрдВ рдУрд░ рдПрдХ рдЫрджреНрдо рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдЧрд▓рд╛ - рдирд┐рд░реНрджреЗрд╢ рд╕реНрд╡рдпрдВ рдФрд░ рдЙрд╕рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░, рдФрд░ рдЕрдВрдд рдореЗрдВ - рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬрд┐рд╕рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рд╕рдВрдХреЗрдд рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЗрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдк 2048 рдХрд╛ рдкреВрд░реНрдгрд╛рдВрдХ рд╢рд╛рдмреНрджрд┐рдХ рдФрд░ 16 рдХрд╛ рдорд╛рдиред рдЗрд╕ рд░реЗрдЦрд╛ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рд╢рд╛рдмреНрджрд┐рдХ рдкрд╛рдВрдЪрд╡реЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд╛рддрд╡реЗрдВ рдХреЗ рдорд╛рди рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
%5 = integer_literal $Builtin.Int2048, 16 // user: %7
рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд @ @ рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд╕рд╛рде рдирд╛рдо рд╣реИ, рд╕рдореНрдореЗрд▓рди, рдорд╛рдкрджрдВрдбреЛрдВ, рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ред Int.init initializer рдХреЗ рд▓рд┐рдП (_builtinIntegerLiteral :), рдпрд╣, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рд╕реЗ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВред рдПрдХ рдбреЙрд▓рд░ рдХрд╛ рд╕рдВрдХреЗрдд рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдХреЗрдд рдХреА рд╢реБрд░реБрдЖрдд рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ:
// Int.init(_builtinIntegerLiteral:) sil [transparent] [serialized] @$SSi22_builtinIntegerLiteralSiBi2048__tcfC : $@convention(method) (Builtin.Int2048, @thin Int.Type) -> Int
рдЕрдзрд┐рд╡реЗрд╢рди рдмреБрд▓рд╛рдирд╛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдареАрдХ рд╕реЗ рдХреИрд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВред рдпрд╣ рдорд╢реАрди рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрди рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИред
рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХрд╛ рдирд╛рдо, рд╕рд╛рде рд╣реА рд╕рдВрд░рдЪрдирд╛рдУрдВ, рд╡рд░реНрдЧреЛрдВ, рд╡рд┐рдзрд┐рдпреЛрдВ, рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдирд╛рдо рд╡рд┐рдХреГрдд рд╣реИрдВ (рдирд╛рдо рдореИрдиреНрдЧреНрд░рд┐рдВрдЧ)ред рдпрд╣ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдХрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдореЙрдбреНрдпреВрд▓ рдФрд░ рдиреЗрд╕реНрдЯреЗрдб рд╕рдВрд╕реНрдерд╛рдУрдВ рдореЗрдВ рд╕рдорд╛рди рдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реА рд╡рд┐рдзрд┐ fff рдХреЗ рд▓рд┐рдП , S4main3AAAV3fffSiyF рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдФрд░ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП, S4main3BBBV3fffSiyF рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ :
struct AAA { func fff() -> Int { return 8 } } struct BBB { func fff() -> Int { return 8 } }
рдПрд╕ рдХрд╛ рдорддрд▓рдм рд╣реИ рд╕реНрд╡рд┐рдлреНрдЯ, 4 рдореЙрдбреНрдпреВрд▓ рдирд╛рдо рдореЗрдВ рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдФрд░ 3 рд╡рд░реНрдЧ рдирд╛рдо рдореЗрдВ рд╣реИред рд╢рд╛рдмреНрджрд┐рдХ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдореЗрдВ, Si рдорд╛рдирдХ рдкреНрд░рдХрд╛рд░ Swift.Int рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред
рджреВрд╕рд░реЗ, рдирд╛рдо рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХреЛрдВ рдХреЗ рдирд╛рдо рдФрд░ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣ рдЕрдзрд┐рднрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП, S4main3AAAV3fff3iiiS2i_tF рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП - S4main3AAAV3fff3dddSiSd_tF :
struct AAA { func fff(iii internalName: Int) -> Int { return 8 } func fff(ddd internalName: Double) -> Int { return 8 } }
рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдореЛрдВ рдХреЗ рдмрд╛рдж, рд╡рд╛рдкрд╕реА рдорд╛рди рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рджред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрдирдХреЗ рдЖрдВрддрд░рд┐рдХ рдирд╛рдо рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╕реНрд╡рд┐рдлреНрдЯ рдореЗрдВ рдирд╛рдо рдХрд╛ рдХреЛрдИ рджрд╕реНрддрд╛рд╡реЗрдЬ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рд╕реА рднреА рд╕рдордп рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рдЗрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рдж рд╣реИред рдЗрд╕рдореЗрдВ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдмреБрдирд┐рдпрд╛рджреА рдмреНрд▓реЙрдХ рд╣реЛрддреЗ рд╣реИрдВред рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдмреНрд▓реЙрдХ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ, рдПрдХ рдирд┐рдХрд╛рд╕ рдмрд┐рдВрджреБ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рдЕрдиреБрдХреНрд░рдо рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдирд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╢рд╛рдЦрд╛ рдирд┐рд░реНрджреЗрд╢ рдпрд╛ рд╢рд░реНрддреЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВред
рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рдЖрдзрд╛рд░ рдЗрдХрд╛рдИ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рджрд┐рдП рдЧрдП рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреА рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рднреА рдХреЛрдб рд╣реЛрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╢рд╛рдЦрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВ:
bb0(%0 : $Int32, %1 : $UnsafeMutablePointer<Optional<UnsafeMutablePointer<Int8>>>):
рд╣рдо рдпрд╣ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рднрд╛рдЬрд┐рдд рдкреНрд░рддреНрдпреЗрдХ рдЧреБрдВрдЬрд╛рдЗрд╢ рдПрдХ рдЕрд▓рдЧ рдЖрдзрд╛рд░ рдЗрдХрд╛рдИ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдХреЛрдб рдореЗрдВ рдПрдХ рд╢рд╛рдЦрд╛ рд╣реИ:
// before if 2 > 5 { // true } else { // false } // after
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдХрдо рд╕реЗ рдХрдо 4 рдмреЗрд╕ рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рдЬрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
- рдмреНрд░рд╛рдВрдЪрд┐рдВрдЧ рд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдб,
- рдРрд╕реЗ рдорд╛рдорд▓реЗ рдЬрдм рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рд╣реА рд╣реИ
- рдРрд╕реЗ рдорд╛рдорд▓реЗ рдЬрдм рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЭреВрдареА рд╣реИ
- рдмреНрд░рд╛рдВрдЪрд┐рдВрдЧ рдХреЗ рдмрд╛рдж рдХреЛрдбред
cond_br - рд╕рд╢рд░реНрдд рдХреВрдж рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ред рдпрджрд┐ рдЫрджреНрдо-рд░рдЬрд┐рд╕реНрдЯрд░% 14 рдХрд╛ рдорд╛рди рд╕рддреНрдп рд╣реИ, рддреЛ bb1 рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд░рдордг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ bb2 рдореЗрдВ ред br - рдмрд┐рдирд╛ рд╢рд░реНрдд рдХреВрдж рдЬреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмреЗрд╕ рдмреНрд▓реЙрдХ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ:
// before cond_br %14, bb1, bb2 // id: %15 bb1: // true br bb3 // id: %21 bb2: // Preds: bb0 // false br bb3 // id: %27 bb3: // Preds: bb2 bb1 // after
рд╕реНрд░реЛрдд рдХреЛрдб:
рдЕрдВрддрд┐рдо рдЪрд░рдг рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рдХрдЪреНрдЪреЗ рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рд╢реБрджреНрдзрддрд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реНрд▓реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рд╣рд┐рдд рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЪрд┐рд╣реНрдирд┐рдд рдХрд╛рд░реНрдп рдкрд╛рд░рджрд░реНрд╢реА рдЗрдирд▓рд╛рдЗрди рд╣реЛрддреЗ рд╣реИрдВ (рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рдЗрд╕рдХреЗ рд╢рд░реАрд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рдирд┐рд░рдВрддрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рд╕рднреА рдХреЛрдб рд╢рд╛рдЦрд╛рдУрдВ рдФрд░ рдЗрддрдиреЗ рдкрд░ рдРрд╕рд╛ рдХрд░реЗрдВред
рдпреЗ рд░реВрдкрд╛рдВрддрд░рдг рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИрдВ рдФрд░ рдХреЛрдб рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдЕрдХреНрд╖рдо рд╣реЛрдиреЗ рдкрд░ рднреА рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдХреИрдирди рдПрд╕рдЖрдИ рдЬрдирд░реЗрд╢рди
рд╡рд┐рд╣рд┐рдд рдПрд╕рдЖрдИрдПрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, -рдорд┐рдЯ-рд╕рд╛рдЗрд▓ рдлреНрд▓реИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
swiftc -emit-sil main.swift
рдЖрджреЗрд╢ рдХрд╛ рдкрд░рд┐рдгрд╛рдо:
sil_stage canonical import Builtin import Swift import SwiftShims let x: Int // x sil_global hidden [let] @$S4main1xSivp : $Int // main sil @main : $@convention(c) (Int32, UnsafeMutablePointer<Optional<UnsafeMutablePointer<Int8>>>) -> Int32 { bb0(%0 : $Int32, %1 : $UnsafeMutablePointer<Optional<UnsafeMutablePointer<Int8>>>): alloc_global @$S4main1xSivp // id: %2 %3 = global_addr @$S4main1xSivp : $*Int // user: %6 %4 = integer_literal $Builtin.Int64, 16 // user: %5 %5 = struct $Int (%4 : $Builtin.Int64) // user: %6 store %5 to %3 : $*Int // id: %6 %7 = integer_literal $Builtin.Int32, 0 // user: %8 %8 = struct $Int32 (%7 : $Builtin.Int32) // user: %9 return %8 : $Int32 // id: %9 } // end sil function 'main' // Int.init(_builtinIntegerLiteral:) sil public_external [transparent] [serialized] @$SSi22_builtinIntegerLiteralSiBi2048__tcfC : $@convention(method) (Builtin.Int2048, @thin Int.Type) -> Int { // %0 // user: %2 bb0(%0 : $Builtin.Int2048, %1 : $@thin Int.Type): %2 = builtin "s_to_s_checked_trunc_Int2048_Int64"(%0 : $Builtin.Int2048) : $(Builtin.Int64, Builtin.Int1) // user: %3 %3 = tuple_extract %2 : $(Builtin.Int64, Builtin.Int1), 0 // user: %4 %4 = struct $Int (%3 : $Builtin.Int64) // user: %5 return %4 : $Int // id: %5 } // end sil function '$SSi22_builtinIntegerLiteralSiBi2048__tcfC'
рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреБрдЫ рдмрджрд▓рд╛рд╡ рд╣реИрдВред рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рдо рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЬреЛрдбрд╝реЗрдВ:
let x = 16 + 8
рдЙрдирдХреЗ рдХрдЪреНрдЪреЗ рдПрд╕рдЖрдИрдПрд▓ рдореЗрдВ, рдЖрдк рдЗрди рд╢рд╛рдмреНрджрд┐рдХ рдмрд╛рддреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
%13 = function_ref @$SSi1poiyS2i_SitFZ : $@convention(method) (Int, Int, @thin Int.Type) -> Int // user: %14 %14 = apply %13(%8, %12, %4) : $@convention(method) (Int, Int, @thin Int.Type) -> Int // user: %15
рд▓реЗрдХрд┐рди рд╡рд┐рд╣рд┐рдд рдореЗрдВ рдЕрдм рдпрд╣ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, 24 рдХрд╛ рдПрдХ рдирд┐рд░рдВрддрд░ рдореВрд▓реНрдп рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
%4 = integer_literal $Builtin.Int64, 24 // user: %5
рд╕реНрд░реЛрдд рдХреЛрдб:
рд╕рд┐рд▓ рдЕрдиреБрдХреВрд▓рди
рдпрджрд┐ рдЕрдиреБрдХреВрд▓рди рд╕рдХреНрд╖рдо рд╣реИ рддреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрд╡рд┐рдлреНрдЯ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрдирдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдХреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╣реИ (рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдХрд╛ рдЕрдиреБрдХреВрд▓рди), рд╡рд┐рдЪрд▓рди (рд╕реНрдереИрддрд┐рдХ рдХреЗ рд╕рд╛рде рдЧрддрд┐рд╢реАрд▓ рдХреЙрд▓ рдХреА рдЬрдЧрд╣), рдЗрдирд▓рд╛рдЗрдирд┐рдВрдЧ, рдПрдЖрд░рд╕реА рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди, рдФрд░ рдмрд╣реБрдд рдХреБрдЫред рдЗрди рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрддрд┐рд╡реГрджреНрдзрд┐ рд▓реЗрдЦ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рд╕реНрд░реЛрдд рдХреЛрдб:
рдЪреВрдВрдХрд┐ рдПрд╕рдЖрдИрдПрд▓ рдПрдХ рд╕реНрд╡рд┐рдлреНрдЯ рдлреАрдЪрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рдмрд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рджрд┐рдЦрд╛рдПред рд╣рдо рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдХреЛрд╖реНрдардХ рд╕рдВрдХрд▓рдХ рдкрд░ рд▓реМрдЯреЗрдВрдЧреЗ рдЬрдм рд╣рдо LLVM IR рдкреАрдврд╝реА рдореЗрдВ рд▓рдЧреЗ рд╣реЛрдВрдЧреЗред