рдЧреЛ рджреГрд╖реНрдЯреАрдХреЛрдирд╛рддреВрди LLVM

рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдгреЗ рд╣реЗ рдЦреВрдк рдХрдареАрдг рдХрд╛рдо рдЖрд╣реЗ. рдкрд░рдВрддреБ, рд╕реБрджреИрд╡рд╛рдиреЗ, LLVM рд╕рд╛рд░рдЦреНрдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдВрдЪреНрдпрд╛ рд╡рд┐рдХрд╛рд╕рд╛рдореБрд│реЗ, рдпрд╛ рд╕рдорд╕реНрдпреЗрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рд╕реЛрдкреЗ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗ, рдЬреНрдпрд╛рдореБрд│реЗ рдПрдХрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░рд▓рд╛ рдПрдХ рдирд╡реАрди рднрд╛рд╖рд╛ рддрдпрд╛рд░ рдХрд░рддрд╛ рдпреЗрддреЗ рдЬреА C рдЪреНрдпрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрдЪреНрдпрд╛ рдЕрдЧрджреА рдЬрд╡рд│ рдЖрд╣реЗ. рд╕рд┐рд╕реНрдЯреАрдо рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рдХреЛрдбрджреНрд╡рд╛рд░реЗ рджрд░реНрд╢рд╡рд┐рд▓реЗ рдЬрд╛рддреЗ, рдереЛрдбреНрдпрд╛ рджрд╕реНрддрдРрд╡рдЬрд╛рдВрд╕рд╣ рд╕реБрд╕рдЬреНрдЬ рдЖрд╣реЗ. рд╣реА рдЙрдгреАрд╡ рджреВрд░ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рд╕рд╛рд╣рд┐рддреНрдпрд╛рдЪрд╛ рд▓реЗрдЦрдХ, рдЬреНрдпрд╛рдЪрд╛ рдЕрдиреБрд╡рд╛рдж рдЖрдореНрд╣реА рдЖрдЬ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдд рдЖрд╣реЛрдд, Go рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реНрдпрд╛ рдХреЛрдбрдЪреА рдЙрджрд╛рд╣рд░рдгреЗ рджрд╛рдЦрд╡рдгрд╛рд░ рдЖрд╣реЗ рдЖрдгрд┐ рддреЗ рдкреНрд░рдердо рднрд╛рд╖рд╛рдВрддрд░рд┐рдд рдХрд╕реЗ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рд╣реЗ рджрд╛рдЦрд╡рдгрд╛рд░ рдЖрд╣реЗ. SSA рдЬрд╛, рдЖрдгрд┐ рдирдВрддрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд╛рдкрд░реВрди LLVM IR рдордзреНрдпреЗ рдЯрд┐рдирд┐рдЧреЛ. Go SSA рдЖрдгрд┐ LLVM IR рдХреЛрдб рдпреЗрдереЗ рджрд┐рд▓реЗрд▓реНрдпрд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгрд╛рдВрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдирд╕рд▓реЗрд▓реНрдпрд╛ рдЧреЛрд╖реНрдЯреА рдХрд╛рдвреВрди рдЯрд╛рдХрдгреНрдпрд╛рд╕рд╛рдареА рдереЛрдбреЗрд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗ, рдЬреЗрдгреЗрдХрд░реВрди рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдЕрдзрд┐рдХ рд╕рдордЬрдгреНрдпрд╛рдпреЛрдЧреНрдп рд╣реЛрдИрд▓.

рдЧреЛ рджреГрд╖реНрдЯреАрдХреЛрдирд╛рддреВрди LLVM

рдкрд╣рд┐рд▓реЗ рдЙрджрд╛рд╣рд░рдг

рдореА рдпреЗрдереЗ рдкрд╣рд┐рд▓реЗ рдлрдВрдХреНрд╢рди рдкрд╛рд╣рдгрд╛рд░ рдЖрд╣реЗ рддреА рд╕рдВрдЦреНрдпрд╛ рдЬреЛрдбрдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд╕рд╛рдзреА рдпрдВрддреНрд░рдгрд╛ рдЖрд╣реЗ:

func myAdd(a, b int) int{
    return a + b
}

рд╣реЗ рдХрд╛рд░реНрдп рдЕрдЧрджреА рд╕реЛрдкреЗ рдЖрд╣реЗ, рдЖрдгрд┐, рдХрджрд╛рдЪрд┐рдд, рдХрд╛рд╣реАрд╣реА рд╕реЛрдкреЗ рдЕрд╕реВ рд╢рдХрдд рдирд╛рд╣реА. рд╣реЗ рдЦрд╛рд▓реАрд▓ Go SSA рдХреЛрдбрдордзреНрдпреЗ рднрд╛рд╖рд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ:

func myAdd(a int, b int) int:
entry:
    t0 = a + b                                                    int
    return t0

рдпрд╛ рджреГрд╢реНрдпрд╛рд╕рд╣, рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдЗрд╢рд╛рд░реЗ рдЙрдЬрд╡реАрдХрдбреЗ рдареЗрд╡рд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд рдЖрдгрд┐ рдмрд░реНтАНрдпрд╛рдЪ рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ рддреНрдпрд╛рдХрдбреЗ рджреБрд░реНрд▓рдХреНрд╖ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ.

рд╣реЗ рдЫреЛрдЯреЗ рдЙрджрд╛рд╣рд░рдг рддреБрдореНрд╣рд╛рд▓рд╛ SSA рдЪреНрдпрд╛ рдПрдХрд╛ рдкреИрд▓реВрдЪреЗ рд╕рд╛рд░ рдкрд╛рд╣рдгреНрдпрд╛рдЪреА рдЕрдиреБрдорддреА рджреЗрддреЗ. рдЕрд░реНрдерд╛рдд, рдХреЛрдбрд▓рд╛ SSA рдлреЙрд░реНрдордордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛рдирд╛, рдкреНрд░рддреНрдпреЗрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддреА рд╕рд░реНрд╡рд╛рдд рдкреНрд░рд╛рдердорд┐рдХ рднрд╛рдЧрд╛рдВрдордзреНрдпреЗ рдореЛрдбрд▓реА рдЬрд╛рддреЗ рдЬреНрдпрд╛рдордзреНрдпреЗ рддреЗ рдмрдирд▓реЗрд▓реЗ рдЖрд╣реЗ. рдЖрдордЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рдЖрджреЗрд╢ return a + b, рдЦрд░рдВ рддрд░, рджреЛрди рдСрдкрд░реЗрд╢рдиреНрд╕ рджрд░реНрд╢рд╡рддреЗ: рджреЛрди рд╕рдВрдЦреНрдпрд╛ рдЬреЛрдбрдгреЗ рдЖрдгрд┐ рдкрд░рд┐рдгрд╛рдо рдкрд░рдд рдХрд░рдгреЗ.

рдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рдпреЗрдереЗ рдЖрдкрдг рдкреНрд░реЛрдЧреНрд░рд╛рдордЪреЗ рдореВрд▓рднреВрдд рдмреНрд▓реЙрдХреНрд╕ рдкрд╛рд╣реВ рд╢рдХрддрд╛; рдпрд╛ рдХреЛрдбрдордзреНрдпреЗ рдлрдХреНрдд рдПрдХ рдмреНрд▓реЙрдХ рдЖрд╣реЗ - рдПрдВрдЯреНрд░реА рдмреНрд▓реЙрдХ. рдЖрдореНрд╣реА рдЦрд╛рд▓реА рдмреНрд▓реЙрдХреНрд╕рдмрджреНрджрд▓ рдЕрдзрд┐рдХ рдмреЛрд▓реВ.

Go SSA рдХреЛрдб рд╕рд╣рдЬрдкрдгреЗ LLVM IR рдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рд╣реЛрддреЛ:

define i64 @myAdd(i64 %a, i64 %b) {
entry:
  %0 = add i64 %a, %b
  ret i64 %0
}

рддреБрдореНтАНрд╣рд╛рд▓рд╛ рд▓рдХреНрд╖рд╛рдд рдпреЗрдИрд▓ рдХреА, рдЬрд░реА рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╕рд┐рдВрдЯреЕрдХреНрдЯрд┐рдХ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕рдЪрд╛ рд╡рд╛рдкрд░ рдХреЗрд▓рд╛ рдЬрд╛рдд рдЕрд╕рд▓рд╛ рддрд░реА рдлрдВрдХреНрд╢рдирдЪреА рд░рдЪрдирд╛ рдореБрд│рд╛рдд рдмрджрд▓рд▓реЗрд▓реА рдирд╛рд╣реА. LLVM IR рдХреЛрдб рд╣рд╛ Go SSA рдХреЛрдб рдкреЗрдХреНрд╖рд╛ рдереЛрдбрд╛ рдЕрдзрд┐рдХ рдордЬрдмреВрдд рдЖрд╣реЗ, C рд╕рд╛рд░рдЦрд╛рдЪ. рдпреЗрдереЗ, рдлрдВрдХреНрд╢рди рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рдирдордзреНрдпреЗ, рдкреНрд░рдердо рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░рд╛рдЪреЗ рд╡рд░реНрдгрди рдЖрд╣реЗ рдЬреЛ рддреЛ рдкрд░рдд рдХрд░рддреЛ, рд╡рд┐рддрд░реНрдХ рдкреНрд░рдХрд╛рд░ рд╡рд┐рддрд░реНрдХ рдирд╛рд╡рд╛рдкреВрд░реНрд╡реА рджрд░реНрд╢рд╡рд┐рд▓рд╛ рдЬрд╛рддреЛ. рдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, IR рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╕реБрд▓рдн рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЬрд╛рдЧрддрд┐рдХ рд╕рдВрд╕реНрдерд╛рдВрдЪреА рдирд╛рд╡реЗ рдЪрд┐рдиреНрд╣рд╛рдЪреНрдпрд╛ рдЖрдзреА рд▓рд╛рд╡рд▓реА рдЬрд╛рддрд╛рдд @, рдЖрдгрд┐ рд╕реНрдерд╛рдирд┐рдХ рдирд╛рд╡рд╛рдВрдкреВрд░реНрд╡реА рдПрдХ рдЪрд┐рдиреНрд╣ рдЖрд╣реЗ % (рдлрдВрдХреНрд╢рдирд▓рд╛ рдЬрд╛рдЧрддрд┐рдХ рдЕрд╕реНрддрд┐рддреНрд╡ рджреЗрдЦреАрд▓ рдорд╛рдирд▓реЗ рдЬрд╛рддреЗ).

рдпрд╛ рдХреЛрдбрдмрджреНрджрд▓ рдПрдХ рдЧреЛрд╖реНрдЯ рд▓рдХреНрд╖рд╛рдд рдШреЗрдгреНрдпрд╛рд╕рд╛рд░рдЦреА рдЖрд╣реЗ рдХреА Go рдкреНрд░рдХрд╛рд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡рд╛рдЪрд╛ рдирд┐рд░реНрдгрдп int, рдЬреЗ 32-рдмрд┐рдЯ рдХрд┐рдВрд╡рд╛ 64-рдмрд┐рдЯ рдореВрд▓реНрдп рдореНрд╣рдгреВрди рдкреНрд░рд╕реНрддреБрдд рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ, рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрдгрд┐ рд╕рдВрдХрд▓рдирд╛рдЪреЗ рд▓рдХреНрд╖реНрдп рдпрд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди, рдЬреЗрд╡реНрд╣рд╛ LLVM IR рдХреЛрдб рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░рддреЗ рддреЗрд╡реНрд╣рд╛ рд╕реНрд╡реАрдХрд╛рд░рд▓реЗ рдЬрд╛рддреЗ. LLVM IR рдХреЛрдб рдкреНрд▓реЕрдЯрдлреЙрд░реНрдо рд╕реНрд╡рддрдВрддреНрд░ рдирд╕рд▓реНрдпрд╛рдЪреНрдпрд╛ рдЕрдиреЗрдХ рдХрд╛рд░рдгрд╛рдВрдкреИрдХреА рд╣реЗ рдПрдХ рдЖрд╣реЗ. рдПрдХрд╛ рдкреНрд▓реЕрдЯрдлреЙрд░реНрдорд╕рд╛рдареА рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓рд╛ рдЕрд╕рд╛ рдХреЛрдб рджреБрд╕рд░реНтАНрдпрд╛ рдкреНрд▓реЕрдЯрдлреЙрд░реНрдорд╕рд╛рдареА рдШреЗрддрд▓рд╛ рдЬрд╛рдК рд╢рдХрдд рдирд╛рд╣реА рдЖрдгрд┐ рд╕рдВрдХрд▓рд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрдд рдирд╛рд╣реА (рдЬреЛрдкрд░реНрдпрдВрдд рддреБрдореНрд╣реА рд╣реА рд╕рдорд╕реНрдпрд╛ рд╕реЛрдбрд╡рдгреНрдпрд╛рд╕рд╛рдареА рдпреЛрдЧреНрдп рдирд╕рд╛рд▓. рдЕрддреНрдпрдВрдд рд╕рд╛рд╡рдзрдЧрд┐рд░реАрдиреЗ).

рдЖрдгрдЦреА рдПрдХ рдордиреЛрд░рдВрдЬрдХ рдореБрджреНрджрд╛ рд▓рдХреНрд╖рд╛рдд рдШреЗрдгреНрдпрд╛рд╕рд╛рд░рдЦрд╛ рдЖрд╣реЗ рддреЛ рдкреНрд░рдХрд╛рд░ i64 рдПрдХ рд╕реНрд╡рд╛рдХреНрд╖рд░реА рдкреВрд░реНрдгрд╛рдВрдХ рдирд╛рд╣реА: рд╕рдВрдЦреНрдпреЗрдЪреНрдпрд╛ рдЪрд┐рдиреНрд╣рд╛рдЪреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рджреГрд╖реНрдЯреАрдиреЗ рддреЗ рддрдЯрд╕реНрде рдЖрд╣реЗ. рд╕реВрдЪрдирд╛рдВрд╡рд░ рдЕрд╡рд▓рдВрдмреВрди, рддреЗ рд╕реНрд╡рд╛рдХреНрд╖рд░реА рдХреЗрд▓реЗрд▓реЗ рдЖрдгрд┐ рд╕реНрд╡рд╛рдХреНрд╖рд░реА рди рдХреЗрд▓реЗрд▓реЗ рджреЛрдиреНрд╣реА рдХреНрд░рдорд╛рдВрдХ рджрд░реНрд╢рд╡реВ рд╢рдХрддрд╛рдд. рдЬреЛрдбрдгреАрдЪреНрдпрд╛ рдСрдкрд░реЗрд╢рдирдЪреНрдпрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡рд╛рдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рд╣реЗ рдХрд╛рд╣реА рдлрд░рдХ рдкрдбрдд рдирд╛рд╣реА, рдореНрд╣рдгреВрди рд╕реНрд╡рд╛рдХреНрд╖рд░реА рдХреЗрд▓реЗрд▓реНрдпрд╛ рдХрд┐рдВрд╡рд╛ рд╕реНрд╡рд╛рдХреНрд╖рд░реА рди рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╕рдВрдЦреНрдпрд╛рдВрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рдд рдХрд╛рд╣реА рдлрд░рдХ рдирд╛рд╣реА. рдпреЗрдереЗ рдореА рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдШреЗрдК рдЗрдЪреНрдЫрд┐рддреЛ рдХреА C рднрд╛рд╖реЗрдд, рдЪрд┐рдиреНрд╣рд╛рдВрдХрд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рдУрд╡реНрд╣рд░рдлреНрд▓реЛ рдХреЗрд▓реНрдпрд╛рдиреЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд░реНрддрди рд╣реЛрддреЗ, рдореНрд╣рдгреВрди рдХреНрд▓реЕрдВрдЧ рдлреНрд░рдВрдЯрдПрдВрдб рдСрдкрд░реЗрд╢рдирдордзреНрдпреЗ рдзреНрд╡рдЬ рдЬреЛрдбрддреЛ nsw (рдХреЛрдгрддреЗрд╣реА рд╕реНрд╡рд╛рдХреНрд╖рд░реА рдХреЗрд▓реЗрд▓реЗ рдЖрд╡рд░рдг рдирд╛рд╣реА), рдЬреЗ LLVM рд▓рд╛ рд╕рд╛рдВрдЧрддреЗ рдХреА рддреЗ рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░реВ рд╢рдХрддреЗ рдХреА рдЬреЛрдб рдХрдзреАрд╣реА рдУрд╡реНрд╣рд░рдлреНрд▓реЛ рд╣реЛрдд рдирд╛рд╣реА.

рдХрд╛рд╣реА рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рдирд╕рд╛рдареА рд╣реЗ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЕрд╕реВ рд╢рдХрддреЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рджреЛрди рдореВрд▓реНрдпреЗ рдЬреЛрдбрдгреЗ i16 32-рдмрд┐рдЯ рдкреНрд▓реЕрдЯрдлреЙрд░реНрдорд╡рд░ (32-рдмрд┐рдЯ рдиреЛрдВрджрдгреАрд╕рд╣) рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рд╢реНрд░реЗрдгреАрдд рд░рд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рдЪрд┐рдиреНрд╣ рд╡рд┐рд╕реНрддрд╛рд░ рдСрдкрд░реЗрд╢рди рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ i16. рдпрд╛рдореБрд│реЗ, рдорд╢реАрди рд░рдЬрд┐рд╕реНрдЯрд░рдЪреНрдпрд╛ рдЖрдХрд╛рд░рд╛рдВрд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рдСрдкрд░реЗрд╢рдиреНрд╕ рдХрд░рдгреЗ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдо рдЕрд╕рддреЗ.

рдпрд╛ IR рдХреЛрдбрдЪреЗ рдкреБрдвреЗ рдХрд╛рдп рд╣реЛрддреЗ рд╣реЗ рдЖрддрд╛ рдЖрдордЪреНрдпрд╛рд╕рд╛рдареА рд╡рд┐рд╢реЗрд╖ рд░реВрдЪреА рдирд╛рд╣реА. рдХреЛрдб рдСрдкреНрдЯрд┐рдорд╛рдЗрдЭ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ (рдкрд░рдВрддреБ рдЖрдордЪреНрдпрд╛рд╕рд╛рд░рдЦреНрдпрд╛ рд╕рд╛рдзреНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рдХрд╛рд╣реАрд╣реА рдСрдкреНрдЯрд┐рдорд╛рдЗрдЭ рдХреЗрд▓реЗрд▓реЗ рдирд╛рд╣реА) рдЖрдгрд┐ рдирдВрддрд░ рдорд╢реАрди рдХреЛрдбрдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ.

рджреБрд╕рд░реЗ рдЙрджрд╛рд╣рд░рдг

рдкреБрдврдЪреЗ рдЙрджрд╛рд╣рд░рдг рдЖрдкрдг рдкрд╛рд╣рдгрд╛рд░ рдЖрд╣реЛрдд рддреЗ рдереЛрдбреЗ рдЕрдзрд┐рдХ рдХреНрд▓рд┐рд╖реНрдЯ рдЕрд╕реЗрд▓. рдЕрд░реНрдерд╛рдд, рдЖрдореНрд╣реА рдПрдХрд╛ рдлрдВрдХреНрд╢рдирдмрджреНрджрд▓ рдмреЛрд▓рдд рдЖрд╣реЛрдд рдЬреНрдпрд╛рдордзреНрдпреЗ рдкреВрд░реНрдгрд╛рдВрдХрд╛рдВрдЪрд╛ рддреБрдХрдбрд╛ рдЖрд╣реЗ:

func sum(numbers []int) int {
    n := 0
    for i := 0; i < len(numbers); i++ {
        n += numbers[i]
    }
    return n
}

рд╣рд╛ рдХреЛрдб рдЦрд╛рд▓реАрд▓ Go SSA рдХреЛрдбрдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рд╣реЛрддреЛ:

func sum(numbers []int) int:
entry:
    jump for.loop
for.loop:
    t0 = phi [entry: 0:int, for.body: t6] #n                       int
    t1 = phi [entry: 0:int, for.body: t7] #i                       int
    t2 = len(numbers)                                              int
    t3 = t1 < t2                                                  bool
    if t3 goto for.body else for.done
for.body:
    t4 = &numbers[t1]                                             *int
    t5 = *t4                                                       int
    t6 = t0 + t5                                                   int
    t7 = t1 + 1:int                                                int
    jump for.loop
for.done:
    return t0

рдпреЗрдереЗ рддреБрдореНрд╣реА SSA рдлреЙрд░реНрдордордзреНрдпреЗ рдХреЛрдбрдЪреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрдкреВрд░реНрдг рдЕрдзрд┐рдХ рдмрд╛рдВрдзрдХрд╛рдореЗ рдЖрдзреАрдЪ рдкрд╛рд╣реВ рд╢рдХрддрд╛. рдХрджрд╛рдЪрд┐рдд рдпрд╛ рдХреЛрдбрдЪреЗ рд╕рд░реНрд╡рд╛рдд рд╕реНрдкрд╖реНрдЯ рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рдореНрд╣рдгрдЬреЗ рдХреЛрдгрддреЗрд╣реА рд╕рдВрд░рдЪрд┐рдд рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг рдЖрджреЗрд╢ рдирд╛рд╣реАрдд. рдЧрдгрдиреЗрдЪреНрдпрд╛ рдкреНрд░рд╡рд╛рд╣рд╛рд╡рд░ рдирд┐рдпрдВрддреНрд░рдг рдареЗрд╡рдгреНрдпрд╛рд╕рд╛рдареА, рдлрдХреНрдд рд╕рд╢рд░реНрдд рдЖрдгрд┐ рдмрд┐рдирд╢рд░реНрдд рдЙрдбреА рдЖрд╣реЗрдд рдЖрдгрд┐, рдЬрд░ рдЖрдкрдг рдпрд╛ рдЖрджреЗрд╢рд╛рдЪрд╛ рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрдорд╛рдВрдб рдореНрд╣рдгреВрди рд╡рд┐рдЪрд╛рд░ рдХреЗрд▓рд╛ рддрд░, рд░рд┐рдЯрд░реНрди рдХрдорд╛рдВрдб.

рдЦрд░рдВ рддрд░, рдпреЗрдереЗ рдЖрдкрдг рдпрд╛ рд╡рд╕реНрддреБрд╕реНрдерд┐рддреАрдХрдбреЗ рд▓рдХреНрд╖ рджреЗрдК рд╢рдХрддрд╛ рдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреБрд░рд│реЗ рдмреНрд░реЗрд╕реЗрд╕ (рднрд╛рд╖рд╛рдВрдЪреНрдпрд╛ C рдХреБрдЯреБрдВрдмрд╛рдкреНрд░рдорд╛рдгреЗ) рд╡рд╛рдкрд░реВрди рдмреНрд▓реЙрдХрдордзреНрдпреЗ рд╡рд┐рднрд╛рдЧрд▓реЗрд▓рд╛ рдирд╛рд╣реА. рд╣реЗ рд▓реЗрдмрд▓рд╛рдВрджреНрд╡рд╛рд░реЗ рд╡рд┐рднрд╛рдЧрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗ, рд╡рд┐рдзрд╛рдирд╕рднрд╛ рднрд╛рд╖рд╛рдВрдЪреА рдЖрдард╡рдг рдХрд░реВрди рджреЗрддреЗ рдЖрдгрд┐ рдореВрд▓рднреВрдд рдмреНрд▓реЙрдХреНрд╕рдЪреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рд╕рд╛рджрд░ рдХреЗрд▓реЗ рдЬрд╛рддреЗ. SSA рдордзреНрдпреЗ, рдореВрд▓рднреВрдд рдмреНрд▓реЙрдХреНрд╕ рд╣реЗ рд▓реЗрдмрд▓рдкрд╛рд╕реВрди рд╕реБрд░реВ рд╣реЛрдгрд╛рд░реЗ рдЖрдгрд┐ рдореВрд▓рднреВрдд рдмреНрд▓реЙрдХ рдкреВрд░реНрдг рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рд╕реВрдЪрдирд╛рдВрд╕рд╣ рд╕рдорд╛рдкреНрдд рд╣реЛрдгрд╛рд░реЗ рдХреЛрдбрдЪреЗ рд╕рд▓рдЧ рдЕрдиреБрдХреНрд░рдо рдореНрд╣рдгреВрди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд, рдЬрд╕реЗ рдХреА тИТ return ╨╕ jump.

рдпрд╛ рдХреЛрдбрдЪрд╛ рдЖрдгрдЦреА рдПрдХ рдордиреЛрд░рдВрдЬрдХ рддрдкрд╢реАрд▓ рд╕реВрдЪрдирд╛рдВрджреНрд╡рд╛рд░реЗ рджрд░реНрд╢рд╡рд┐рд▓рд╛ рдЬрд╛рддреЛ phi. рд╕реВрдЪрдирд╛ рдЕрддрд┐рд╢рдп рдЕрд╕рд╛рдорд╛рдиреНрдп рдЖрд╣реЗрдд рдЖрдгрд┐ рд╕рдордЬрдгреНрдпрд╛рд╕ рдереЛрдбрд╛ рд╡реЗрд│ рд▓рд╛рдЧреВ рд╢рдХрддреЛ. рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛, рддреЗ рдПрд╕рдПрд╕рдП рд╕реНрдЯреЕрдЯрд┐рдХ рд╕рд┐рдВрдЧрд▓ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯрд╕рд╛рдареА рд▓рд╣рд╛рди рдЖрд╣реЗ. рд╣реЗ рдХрдВрдкрд╛рдЗрд▓рд░реНрд╕рджреНрд╡рд╛рд░реЗ рд╡рд╛рдкрд░рд▓реНрдпрд╛ рдЬрд╛рдгрд╛рд░реНтАНрдпрд╛ рдХреЛрдбрдЪреЗ рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЖрд╣реЗ, рдЬреНрдпрд╛рдордзреНрдпреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рд▓рд╛ рдлрдХреНрдд рдПрдХрджрд╛рдЪ рдореВрд▓реНрдп рдирд┐рдпреБрдХреНрдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ. рдЖрдордЪреНрдпрд╛ рдлрдВрдХреНрд╢рдирд╕рд╛рд░рдЦреНрдпрд╛ рд╕рд╛рдзреНрдпрд╛ рдлрдВрдХреНрд╢рдиреНрд╕ рд╡реНрдпрдХреНрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╣реЗ рдЙрддреНрддрдо рдЖрд╣реЗ myAddрд╡рд░ рджрд░реНрд╢рд╡рд┐рд▓реЗ рдЖрд╣реЗ, рдкрд░рдВрддреБ рдпрд╛ рд╡рд┐рднрд╛рдЧрд╛рдд рдЪрд░реНрдЪрд╛ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдХрд╛рд░реНрдпрд╛рд╕рд╛рд░рдЦреНрдпрд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпрд╛рдВрд╕рд╛рдареА рдпреЛрдЧреНрдп рдирд╛рд╣реА sum. рд╡рд┐рд╢реЗрд╖рддрдГ, рд▓реВрдкрдЪреНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрджрд░рдореНрдпрд╛рди рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рдмрджрд▓рддрд╛рдд i ╨╕ n.

SSA рдПрдХрджрд╛ рддрдерд╛рдХрдерд┐рдд рд╕реВрдЪрдирд╛ рд╡рд╛рдкрд░реВрди рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рд╡реНрд╣реЕрд▓реНрдпреВ рдирд┐рдпреБрдХреНрдд рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдирд┐рд░реНрдмрдВрдзрд╛рд▓рд╛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рддреЗ phi (рддреНрдпрд╛рдЪреЗ рдирд╛рд╡ рдЧреНрд░реАрдХ рд╡рд░реНрдгрдорд╛рд▓рд╛рд╡рд░реВрди рдШреЗрддрд▓реЗ рдЖрд╣реЗ). рд╡рд╕реНрддреБрд╕реНрдерд┐рддреА рдЕрд╢реА рдЖрд╣реЗ рдХреА рд╕реА рд╕рд╛рд░рдЦреНрдпрд╛ рднрд╛рд╖рд╛рдВрд╕рд╛рдареА рдХреЛрдбрдЪреЗ SSA рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рд╣реА рдпреБрдХреНрддреНрдпрд╛ рд╡рд╛рдкрд░рд╛рд╡реНрдпрд╛ рд▓рд╛рдЧрддреАрд▓. рд╣реА рд╕реВрдЪрдирд╛ рдХреЙрд▓ рдХреЗрд▓реНрдпрд╛рдЪреЗ рдкрд░рд┐рдгрд╛рдо рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рдЪреЗ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдЖрд╣реЗ (i рдХрд┐рдВрд╡рд╛ n), рдЖрдгрд┐ рдореВрд▓рднреВрдд рдмреНрд▓реЙрдХреНрд╕рдЪреА рд╕реВрдЪреА рддреНрдпрд╛рдЪреЗ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдореНрд╣рдгреВрди рд╡рд╛рдкрд░рд▓реА рдЬрд╛рддреЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдпрд╛ рд╕реВрдЪрдирд╛рдВрдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░рд╛:

t0 = phi [entry: 0:int, for.body: t6] #n

рддреНрдпрд╛рдЪрд╛ рдЕрд░реНрде рдЦрд╛рд▓реАрд▓рдкреНрд░рдорд╛рдгреЗ рдЖрд╣реЗ: рдЬрд░ рдорд╛рдЧреАрд▓ рдореВрд▓рднреВрдд рдмреНрд▓реЙрдХ рдмреНрд▓реЙрдХ рдЕрд╕реЗрд▓ рддрд░ entry (рдЗрдирдкреБрдЯ), рдирдВрддрд░ t0 рдПрдХ рд╕реНрдерд┐рд░ рдЖрд╣реЗ 0, рдЖрдгрд┐ рдЬрд░ рдорд╛рдЧреАрд▓ рдореВрд▓рднреВрдд рдмреНрд▓реЙрдХ рд╣реЛрддрд╛ for.body, рдирдВрддрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдореВрд▓реНрдп рдШреЗрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ t6 рдпрд╛ рдмреНрд▓реЙрдХрдордзреВрди. рд╣реЗ рд╕рд░реНрд╡ рдЕрдЧрджреА рдЧреВрдв рд╡рд╛рдЯреВ рд╢рдХрддреЗ, рдкрд░рдВрддреБ рд╣реА рдпрдВрддреНрд░рдгрд╛ SSA рдХрд╛рд░реНрдп рдХрд░рддреЗ. рдорд╛рдирд╡реА рджреГрд╖реНрдЯреАрдХреЛрдирд╛рддреВрди, рд╣реЗ рд╕рд░реНрд╡ рдХреЛрдб рд╕рдордЬрдгреЗ рдХрдареАрдг рдмрдирд╡рддреЗ, рдкрд░рдВрддреБ рдкреНрд░рддреНрдпреЗрдХ рдореВрд▓реНрдп рдПрдХрджрд╛рдЪ рдирд┐рдпреБрдХреНрдд рдХреЗрд▓реЗ рдЖрд╣реЗ рд╣реЗ рддрдереНрдп рдЕрдиреЗрдХ рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рди рдЕрдзрд┐рдХ рд╕реЛрдкреЗ рдХрд░рддреЗ.

рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ рдХреА рддреБрдореНрд╣реА рддреБрдордЪреЗ рд╕реНрд╡рддрдГрдЪреЗ рдХрдВрдкрд╛рдЗрд▓рд░ рд▓рд┐рд╣рд┐рд▓реНрдпрд╛рд╕, рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рд╣рд╕рд╛ рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ рдЧреЛрд╖реНрдЯреАрдВрдЪрд╛ рд╕рд╛рдордирд╛ рдХрд░рд╛рд╡рд╛ рд▓рд╛рдЧрдгрд╛рд░ рдирд╛рд╣реА. рдЕрдЧрджреА Clang рдпрд╛ рд╕рд░реНрд╡ рд╕реВрдЪрдирд╛ рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░рдд рдирд╛рд╣реА phi, рддреЗ рдПрдХ рдпрдВрддреНрд░рдгрд╛ рд╡рд╛рдкрд░рддреЗ alloca (рд╣реЗ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд╛рдирд┐рдХ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдЖрд╣реЗ). рддреНрдпрд╛рдирдВрддрд░, LLVM рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рди рдкрд╛рд╕ рдЪрд╛рд▓рд╡рддрд╛рдирд╛ рдХреЙрд▓ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ mem2reg, рд╕реВрдЪрдирд╛ alloca SSA рдлреЙрд░реНрдордордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХреЗрд▓реЗ. TinyGo, рддрдерд╛рдкрд┐, Go SSA рдХрдбреВрди рдЗрдирдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ, рдЬреЗ, рд╕реЛрдпреАрд╕реНрдХрд░рдкрдгреЗ, рдЖрдзреАрдкрд╛рд╕реВрдирдЪ SSA рдлреЙрд░реНрдордордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдЭрд╛рд▓реЗ рдЖрд╣реЗ.

рд╡рд┐рдЪрд╛рд░рд╛рдзреАрди рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рдХреЛрдбрдЪреНрдпрд╛ рддреБрдХрдбреНрдпрд╛рдЪрд╛ рдЖрдгрдЦреА рдПрдХ рдирд╛рд╡реАрдиреНрдп рдореНрд╣рдгрдЬреЗ рдЗрдВрдбреЗрдХреНрд╕рджреНрд╡рд╛рд░реЗ рд╕реНрд▓рд╛рдЗрд╕ рдПрд▓рд┐рдореЗрдВрдЯреНрд╕рдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдкрддреНрддреНрдпрд╛рдЪреА рдЧрдгрдирд╛ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдСрдкрд░реЗрд╢рдирдЪреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рдЖрдгрд┐ рдкрд░рд┐рдгрд╛рдореА рдкреЙрдЗрдВрдЯрд░рдЪрд╛ рд╕рдВрджрд░реНрдн рдШреЗрдгреНрдпрд╛рдЪреНрдпрд╛ рдСрдкрд░реЗрд╢рдирдЪреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рджрд░реНрд╢рд╡рд┐рд▓рд╛ рдЬрд╛рддреЛ. рдпреЗрдереЗ рддреБрдореНрд╣реА IR рдХреЛрдбрдордзреНрдпреЗ рд╕реНрдерд┐рд░рд╛рдВрдХрд╛рдВрдЪреА рдереЗрдЯ рдЬреЛрдб рдкрд╛рд╣реВ рд╢рдХрддрд╛ (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде - 1:int). рдлрдВрдХреНрд╢рдирд╕рд╣ рдЙрджрд╛рд╣рд░рдгрд╛рдордзреНрдпреЗ myAdd рд╣реЗ рд╡рд╛рдкрд░рд▓реЗ рдЧреЗрд▓реЗ рдирд╛рд╣реА. рдЖрддрд╛ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рддреА рд╡реИрд╢рд┐рд╖реНтАНрдЯреНрдпреЗ рд╕рдВрдкреБрд╖реНрдЯрд╛рдд рдЖрд▓реА рдЖрд╣реЗрдд, LLVM IR рдлреЙрд░реНрдордордзреНтАНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХреЗрд▓реНтАНрдпрд╛рд╡рд░ рд╣рд╛ рдХреЛрдб рдХрд╛рдп рдмрдирддреЛ рддреЗ рдкрд╛рд╣реВ рдпрд╛:

define i64 @sum(i64* %ptr, i64 %len, i64 %cap) {
entry:
  br label %for.loop

for.loop:                                         ; preds = %for.body, %entry
  %0 = phi i64 [ 0, %entry ], [ %5, %deref.next ]
  %1 = phi i64 [ 0, %entry ], [ %6, %deref.next ]
  %2 = icmp slt i64 %1, %len
  br i1 %2, label %for.body, label %for.done

for.body:                                         ; preds = %for.loop
  %3 = getelementptr i64, i64* %ptr, i64 %1
  %4 = load i64, i64* %3
  %5 = add i64 %0, %4
  %6 = add i64 %1, 1
  br label %for.loop

for.done:                                         ; preds = %for.loop
  ret i64 %0
}

рдпреЗрдереЗ, рдкреВрд░реНрд╡реАрдкреНрд░рдорд╛рдгреЗ, рдЖрдкрдг рд╕рдорд╛рди рд░рдЪрдирд╛ рдкрд╛рд╣реВ рд╢рдХрддреЛ, рдЬреНрдпрд╛рдордзреНрдпреЗ рдЗрддрд░ рд╡рд╛рдХреНрдпрд░рдЪрдирд╛ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗрдд. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдХреЙрд▓рдордзреНрдпреЗ phi рдореВрд▓реНрдпреЗ рдЖрдгрд┐ рд▓реЗрдмрд▓реЗ рдмрджрд▓рд▓реА. рддрдерд╛рдкрд┐, рдпреЗрдереЗ рдЕрд╕реЗ рдХрд╛рд╣реАрддрд░реА рдЖрд╣реЗ рдЬреНрдпрд╛рдХрдбреЗ рд╡рд┐рд╢реЗрд╖ рд▓рдХреНрд╖ рджреЗрдгреЗ рдпреЛрдЧреНрдп рдЖрд╣реЗ.

рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛, рдпреЗрдереЗ рддреБрдореНрд╣реА рдкреВрд░реНрдгрдкрдгреЗ рднрд┐рдиреНрди рдлрдВрдХреНрд╢рди рд╕реНрд╡рд╛рдХреНрд╖рд░реА рдкрд╛рд╣реВ рд╢рдХрддрд╛. LLVM рд╕реНрд▓рд╛рдЗрд╕реЗрд╕рд▓рд╛ рд╕рдкреЛрд░реНрдЯ рдХрд░рдд рдирд╛рд╣реА рдЖрдгрд┐ рдкрд░рд┐рдгрд╛рдореА, рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рди рдореНрд╣рдгреВрди, рд╣рд╛ рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рдХреЛрдб рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░рдгрд╛рд░рд╛ TinyGo рдХрдВрдкрд╛рдЗрд▓рд░ рдпрд╛ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рдХреНрдЪрд░рдЪреЗ рд╡рд░реНрдгрди рднрд╛рдЧрд╛рдВрдордзреНрдпреЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЛ. рд╣реЗ рддреАрди рд╕реНрд▓рд╛рдЗрд╕ рдШрдЯрдХрд╛рдВрдЪреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реВ рд╢рдХрддреЗ (ptr, len ╨╕ cap) рдПрдХ рд░рдЪрдирд╛ (рд╕реНрдЯреНрд░рдХреНрдЪрд░) рдореНрд╣рдгреВрди, рдкрд░рдВрддреБ рддреНрдпрд╛рдВрдирд╛ рддреАрди рд╕реНрд╡рддрдВрддреНрд░ рд╕рдВрд╕реНрдерд╛ рдореНрд╣рдгреВрди рдкреНрд░рд╕реНрддреБрдд рдХреЗрд▓реНрдпрд╛рдиреЗ рдХрд╛рд╣реА рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рдирдЪреА рдЕрдиреБрдорддреА рдорд┐рд│рддреЗ. рдЯрд╛рд░реНрдЧреЗрдЯ рдкреНрд▓реЕрдЯрдлреЙрд░реНрдордЪреНрдпрд╛ рдлрдВрдХреНрд╢рдиреНрд╕рдЪреНрдпрд╛ рдХреЙрд▓рд┐рдВрдЧ рдХрдиреНрд╡реНрд╣реЗрдиреНрд╢рдиреНрд╕рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЗрддрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реНрд▓рд╛рдЗрд╕рдЪреЗ рдЗрддрд░ рдорд╛рд░реНрдЧрд╛рдВрдиреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реВ рд╢рдХрддрд╛рдд.

рдпрд╛ рдХреЛрдбрдЪреЗ рдЖрдгрдЦреА рдПрдХ рдордиреЛрд░рдВрдЬрдХ рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рдореНрд╣рдгрдЬреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдЪрд╛ рд╡рд╛рдкрд░ getelementptr (рдЕрдиреЗрдХрджрд╛ GEP рдореНрд╣рдгреВрди рд╕рдВрдХреНрд╖рд┐рдкреНрдд).

рд╣реА рд╕реВрдЪрдирд╛ рдкреЙрдЗрдВрдЯрд░рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рддреЗ рдЖрдгрд┐ рд╕реНрд▓рд╛рдЗрд╕ рдШрдЯрдХрд╛рд╕рд╛рдареА рдкреЙрдЗрдВрдЯрд░ рдорд┐рд│рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реА рдЬрд╛рддреЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, C рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реНрдпрд╛ рдЦрд╛рд▓реАрд▓ рдХреЛрдбрд╢реА рддреНрдпрд╛рдЪреА рддреБрд▓рдирд╛ рдХрд░реВрдпрд╛:

int* sliceptr(int *ptr, int index) {
    return &ptr[index];
}

рдХрд┐рдВрд╡рд╛ рдпрд╛рдЪреНрдпрд╛ рд╕рдорддреБрд▓реНрдп рдЦрд╛рд▓реАрд▓ рд╕рд╣:

int* sliceptr(int *ptr, int index) {
    return ptr + index;
}

рдпреЗрдереЗ рд╕рд░реНрд╡рд╛рдд рдорд╣рддреНрд╡рд╛рдЪреА рдЧреЛрд╖реНрдЯ рдореНрд╣рдгрдЬреЗ рд╕реВрдЪрдирд╛ getelementptr рдбреАрд░реЗрдлрд░рдиреНрд╕рд┐рдВрдЧ рдСрдкрд░реЗрд╢рдиреНрд╕ рдХрд░рдд рдирд╛рд╣реА. рд╣реЗ рдлрдХреНрдд рд╡рд┐рджреНрдпрдорд╛рди рдПрдХрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдирд╡реАрди рдкреЙрдЗрдВрдЯрд░рдЪреА рдЧрдгрдирд╛ рдХрд░рддреЗ. рддреЗ рд╕реВрдЪрдирд╛ рдореНрд╣рдгреВрди рдШреЗрддрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ mul ╨╕ add рд╣рд╛рд░реНрдбрд╡реЗрдЕрд░ рд╕реНрддрд░рд╛рд╡рд░. рддреБрдореНрд╣реА GEP рд╕реВрдЪрдирд╛рдВрдмрджреНрджрд▓ рдЕрдзрд┐рдХ рд╡рд╛рдЪреВ рд╢рдХрддрд╛ рдпреЗрдереЗ.

рдпрд╛ рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рдХреЛрдбрдЪреЗ рдЖрдгрдЦреА рдПрдХ рдордиреЛрд░рдВрдЬрдХ рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рдореНрд╣рдгрдЬреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдЪрд╛ рд╡рд╛рдкрд░ icmp. рдкреВрд░реНрдгрд╛рдВрдХ рддреБрд▓рдирд╛ рдЕрдВрдорд▓рд╛рдд рдЖрдгрдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реА рдЬрд╛рдгрд╛рд░реА рд╣реА рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрджреНрджреЗрд╢ рд╕реВрдЪрдирд╛ рдЖрд╣реЗ. рдпрд╛ рд╕реВрдЪрдиреЗрдЪрд╛ рдкрд░рд┐рдгрд╛рдо рдиреЗрд╣рдореА рдкреНрд░рдХрд╛рд░рд╛рдЪреЗ рдореВрд▓реНрдп рдЕрд╕рддреЛ i1 - рддрд╛рд░реНрдХрд┐рдХ рдореВрд▓реНрдп. рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рдХреАрд╡рд░реНрдб рд╡рд╛рдкрд░реВрди рддреБрд▓рдирд╛ рдХреЗрд▓реА рдЬрд╛рддреЗ slt (рдкреЗрдХреНрд╖рд╛ рдХрдореА рд╕реНрд╡рд╛рдХреНрд╖рд░реА рдХреЗрд▓реЗрд▓реЗ), рдХрд╛рд░рдг рдЖрдореНрд╣реА рдкреВрд░реНрд╡реА рдкреНрд░рдХрд╛рд░рд╛рджреНрд╡рд╛рд░реЗ рджрд░реНрд╢рд╡рд┐рд▓реЗрд▓реНрдпрд╛ рджреЛрди рд╕рдВрдЦреНрдпрд╛рдВрдЪреА рддреБрд▓рдирд╛ рдХрд░рдд рдЖрд╣реЛрдд int. рдЬрд░ рдЖрдкрдг рджреЛрди рд╕реНрд╡рд╛рдХреНрд╖рд░реА рдирд╕рд▓реЗрд▓реНрдпрд╛ рдкреВрд░реНрдгрд╛рдВрдХрд╛рдВрдЪреА рддреБрд▓рдирд╛ рдХрд░рдд рдЕрд╕рд╛рд▓, рддрд░ рдЖрдкрдг рд╡рд╛рдкрд░реВ icmp, рдЖрдгрд┐ рддреБрд▓рдирд╛ рдХрд░рддрд╛рдирд╛ рд╡рд╛рдкрд░рд▓реЗрд▓рд╛ рдХреАрд╡рд░реНрдб рдЕрд╕реЗрд▓ ult. рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рд╕рдВрдЦреНрдпрд╛рдВрдЪреА рддреБрд▓рдирд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рджреБрд╕рд░реА рд╕реВрдЪрдирд╛ рд╡рд╛рдкрд░рд▓реА рдЬрд╛рддреЗ, fcmp, рдЬреЗ рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ.

рдкрд░рд┐рдгрд╛рдо

рдорд╛рдЭрд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдЖрд╣реЗ рдХреА рдпрд╛ рд╕рд╛рдордЧреНрд░реАрдордзреНрдпреЗ рдореА LLVM IR рдЪреА рд╕рд░реНрд╡рд╛рдд рдорд╣рддреНрд╡рд╛рдЪреА рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХреЗрд▓реА рдЖрд╣реЗрдд. рдЕрд░реНрдерд╛рдд, рдЗрдереЗ рдмрд░реЗрдЪ рдХрд╛рд╣реА рдЖрд╣реЗ. рд╡рд┐рд╢реЗрд╖рддрдГ, рдХреЛрдбрдЪреНрдпрд╛ рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡рд╛рдордзреНрдпреЗ рдЕрдиреЗрдХ рднрд╛рд╖реНрдпреЗ рдЕрд╕реВ рд╢рдХрддрд╛рдд рдЬреА рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рди рдкрд╛рд╕рд▓рд╛ рдХрдВрдкрд╛рдЗрд▓рд░рд▓рд╛ рдЬреНрдЮрд╛рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдХреЛрдбрдЪреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ рд╡рд┐рдЪрд╛рд░рд╛рдд рдШреЗрдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддрд╛рдд рдЬреА рдЕрдиреНрдпрдерд╛ IR рдордзреНрдпреЗ рд╡реНрдпрдХреНрдд рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрдд рдирд╛рд╣реАрдд. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╣рд╛ рдзреНрд╡рдЬ рдЖрд╣реЗ inbounds GEP рд╕реВрдЪрдирд╛ рдХрд┐рдВрд╡рд╛ рдзреНрд╡рдЬ nsw ╨╕ nuw, рдЬреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдордзреНрдпреЗ рдЬреЛрдбрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ add. рдХреАрд╡рд░реНрдбрд╕рд╛рдареАрд╣реА рддреЗрдЪ рдЖрд╣реЗ private, рдСрдкреНрдЯрд┐рдорд╛рдпрдЭрд░рд▓рд╛ рд╕реВрдЪрд┐рдд рдХрд░рддреЗ рдХреА рддреЗ рдЪрд┐рдиреНрд╣рд╛рдВрдХрд┐рдд рдХреЗрд▓реЗрд▓реЗ рдХрд╛рд░реНрдп рд╡рд░реНрддрдорд╛рди рд╕рдВрдХрд▓рди рдпреБрдирд┐рдЯрдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░реВрди рд╕рдВрджрд░реНрднрд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдгрд╛рд░ рдирд╛рд╣реА. рд╣реЗ рди рд╡рд╛рдкрд░рд▓реЗрд▓реЗ рдпреБрдХреНрддрд┐рд╡рд╛рдж рдХрд╛рдвреВрди рдЯрд╛рдХрдгреНрдпрд╛рд╕рд╛рд░рдЦреНрдпрд╛ рдмрд░реНрдпрд╛рдЪ рдордиреЛрд░рдВрдЬрдХ рдЗрдВрдЯрд░рдкреНрд░реЛрд╕реЗрдЬреНрдпреБрд░рд▓ рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рдирд╕рд╛рдареА рдЕрдиреБрдорддреА рджреЗрддреЗ.

рддреБрдореНрд╣реА LLVM рдмрджреНрджрд▓ рдЕрдзрд┐рдХ рд╡рд╛рдЪреВ рд╢рдХрддрд╛ рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг, рдЬреНрдпрд╛рдЪрд╛ рддреБрдореНрд╣реА рддреБрдордЪрд╛ рд╕реНрд╡рддрдГрдЪрд╛ LLVM-рдЖрдзрд╛рд░рд┐рдд рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддрд╛рдирд╛ рдЕрдиреЗрдХрджрд╛ рд╕рдВрджрд░реНрдн рдШреНрдпрд╛рд▓. рдпреЗрдереЗ рдиреЗрддреГрддреНрд╡, рдЬреЗ рдЕрддрд┐рд╢рдп рд╕реЛрдкреНрдпрд╛ рднрд╛рд╖реЗрд╕рд╛рдареА рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдгреНрдпрд╛рдХрдбреЗ рд▓рдХреНрд╖ рджреЗрддреЗ. рддреБрдордЪрд╛ рд╕реНрд╡рддрдГрдЪрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рддрдпрд╛рд░ рдХрд░рддрд╛рдирд╛ рдорд╛рд╣рд┐рддреАрдЪреЗ рд╣реЗ рджреЛрдиреНрд╣реА рд╕реНрд░реЛрдд рддреБрдореНрд╣рд╛рд▓рд╛ рдЙрдкрдпреЛрдЧреА рдкрдбрддреАрд▓.

рдкреНрд░рд┐рдп рд╡рд╛рдЪрдХ! рддреБрдореНрд╣реА LLVM рд╡рд╛рдкрд░рддрд╛ рдХрд╛?

рдЧреЛ рджреГрд╖реНрдЯреАрдХреЛрдирд╛рддреВрди LLVM

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛