рдЬрд╛рдиреЗ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдпрдмрд╛рдЯ LLVM

рдХрдореНрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд╛рд╕ рдЧрд░реНрдиреБ рдзреЗрд░реИ рдЧрд╛рд╣реНрд░реЛ рдХрд╛рдо рд╣реЛред рддрд░, рд╕реМрднрд╛рдЧреНрдпрд╡рд╢, LLVM рдЬрд╕реНрддрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдХреЛ рд╡рд┐рдХрд╛рд╕рдХреЛ рд╕рд╛рде, рдпрд╕ рд╕рдорд╕реНрдпрд╛рдХреЛ рд╕рдорд╛рдзрд╛рди рдзреЗрд░реИ рд╕рд░рд▓реАрдХреГрдд рднрдПрдХреЛ рдЫ, рдЬрд╕рд▓реЗ рдПрдХрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░рд▓рд╛рдИ рдкрдирд┐ C рд╕рдБрдЧ рдХрд╛рд░реНрдпрд╕рдореНрдкрд╛рджрдирдорд╛ рдирдЬрд┐рдХ рд░рд╣реЗрдХреЛ рдирдпрд╛рдБ рднрд╛рд╖рд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред LLVM рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреБ рдпреЛ рддрдереНрдпрджреНрд╡рд╛рд░рд╛ рдЬрдЯрд┐рд▓ рдЫред рдкреНрд░рдгрд╛рд▓реА рд╕рд╛рдиреЛ рдХрд╛рдЧрдЬрд╛рдд рд╕рдВрдЧ рд╕реБрд╕рдЬреНрдЬрд┐рдд рдХреЛрдб рдХреЛ рдПрдХ рдареВрд▓реЛ рдорд╛рддреНрд░рд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░рд┐рдПрдХреЛ рдЫред рдпрд╕ рдХрдордЬреЛрд░реАрд▓рд╛рдИ рд╕рдЪреНрдпрд╛рдЙрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╕рд╛рдордЧреНрд░реАрдХреЛ рд▓реЗрдЦрдХ, рдЬрд╕рдХреЛ рдЕрдиреБрд╡рд╛рдж рд╣рд╛рдореАрд▓реЗ рдЖрдЬ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЧрд░реНрджреИрдЫреМрдВ, Go рдорд╛ рд▓реЗрдЦрд┐рдПрдХрд╛ рдХреЛрдбрдХрд╛ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рджреЗрдЦрд╛рдЙрди рдЬрд╛рдБрджреИрдЫрдиреН рд░ рдЙрдиреАрд╣рд░реВрд▓рд╛рдИ рдкрд╣рд┐рд▓реЛ рдкрдЯрдХ рдХрд╕рд░реА рдЕрдиреБрд╡рд╛рдж рдЧрд░рд┐рдпреЛ рднрдиреЗрд░ рджреЗрдЦрд╛рдЙрдиреЗрдЫред SSA рдЬрд╛рдиреБрд╣реЛрд╕реН, рд░ рддреНрдпрд╕рдкрдЫрд┐ рдХрдореНрдкрд╛рдЗрд▓рд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ LLVM IR рдорд╛ tinyGOред 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-bit рд╡рд╛ 64-bit рдорд╛рдирдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рдХрдореНрдкрд╛рдЗрд▓рд░ рд░ рд╕рдВрдХрд▓рдирдХреЛ рд▓рдХреНрд╖реНрдпрдорд╛ рдирд┐рд░реНрднрд░ рдЧрд░реНрджреИ, LLVM рд▓реЗ IR рдХреЛрдб рдЙрддреНрдкрдиреНрди рдЧрд░реНрджрд╛ рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░рд┐рдиреНрдЫред рдпреЛ рдзреЗрд░реИ рдХрд╛рд░рдгрд╣рд░реВ рдордзреНрдпреЗ рдПрдХ рд╣реЛ рдЬреБрди LLVM IR рдХреЛрдб рд╣реЛрдЗрди, рдзреЗрд░реИ рдорд╛рдирд┐рд╕рд╣рд░реВрд▓реЗ рд╕реЛрдЪреНрдЫрдиреН, рдкреНрд▓реЗрдЯрдлрд░реНрдо рд╕реНрд╡рддрдиреНрддреНрд░ред рдПрдЙрдЯрд╛ рдкреНрд▓реЗрдЯрдлрд░реНрдордХреЛ рд▓рд╛рдЧрд┐ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдпрд╕реНрддреЛ рдХреЛрдб рдЕрд░реНрдХреЛ рдкреНрд▓реЗрдЯрдлрд░реНрдордХреЛ рд▓рд╛рдЧрд┐ рдорд╛рддреНрд░ рд▓рд┐рди рд░ рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░реНрди рд╕рдХрд┐рдБрджреИрди (рдЬрдмрд╕рдореНрдо рддрдкрд╛рдИрдВ рдпреЛ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рдЙрдкрдпреБрдХреНрдд рд╣реБрдиреБрд╣реБрдиреНрдиред рдЕрддреНрдпрдзрд┐рдХ рд╣реЗрд░рдЪрд╛рд╣ рд╕рдВрдЧ).

рдЕрд░реНрдХреЛ рдЪрд╛рдЦрд▓рд╛рдЧреНрджреЛ рдмрд┐рдиреНрджреБ рдзреНрдпрд╛рди рджрд┐рди рд▓рд╛рдпрдХ рдЫ рдХрд┐ рдкреНрд░рдХрд╛рд░ i64 рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЧрд░рд┐рдПрдХреЛ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реЛрдЗрди: рдпреЛ рд╕рдВрдЦреНрдпрд╛рдХреЛ рдЪрд┐рдиреНрд╣ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрдиреЗ рд╕рдиреНрджрд░реНрднрдорд╛ рддрдЯрд╕реНрде рдЫред рдирд┐рд░реНрджреЗрд╢рдирдорд╛ рдирд┐рд░реНрднрд░ рдЧрд░реНрджреИ, рдпрд╕рд▓реЗ рджреБрд╡реИ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд░ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдирдореНрдмрд░рд╣рд░реВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрди рд╕рдХреНрдЫред рдердк рдХрд╛рд░реНрдп рдХреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рдорд╛рдорд▓рд╛ рдорд╛, рдпреЛ рдХреЗрд╣рд┐ рдлрд░рдХ рдкрд░реНрджреИрди, рддреНрдпрд╕реИрд▓реЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╡рд╛ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд╕рдВрдЦреНрдпрд╛ рд╕рдВрдЧ рдХрд╛рдо рдорд╛ рдХреБрдиреИ рдлрд░рдХ рдЫреИрдиред рдпрд╣рд╛рдБ рдо рдиреЛрдЯ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБ рдХрд┐ C рднрд╛рд╖рд╛рдорд╛, рд╕рд╛рдЗрди рдЗрдиреНрдЯрд┐рдЬрд░ рдЪрд░ рдУрднрд░рдлреНрд▓реЛ рдЧрд░реНрджрд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реБрдиреНрдЫ, рддреНрдпрд╕реИрд▓реЗ рдХреНрд▓реНрдпрд╛рдЩреНрдЧ рдлреНрд░рдиреНрдЯрдПрдиреНрдбрд▓реЗ рд╕рдЮреНрдЪрд╛рд▓рдирдорд╛ рдЭрдгреНрдбрд╛ рдердкреНрдЫред nsw (рдХреБрдиреИ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд░реНтАНрдпрд╛рдк рдЫреИрди), рдЬрд╕рд▓реЗ LLVM рд▓рд╛рдИ рдмрддрд╛рдЙрдБрдЫ рдХрд┐ рдпрд╕рд▓реЗ рдЬреЛрдб рдХрд╣рд┐рд▓реНрдпреИ рдУрднрд░рдлреНрд▓реЛ рд╣реБрдБрджреИрди рднрдиреЗрд░ рдорд╛рдиреНрди рд╕рдХреНрдЫред

рдпреЛ рдХреЗрд╣рд┐ рдЕрдкреНрдЯрд┐рдорд╛рдЗрдЬреЗрд╕рдирд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рд╣реБрди рд╕рдХреНрдЫред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рджреБрдИ рдорд╛рдирд╣рд░реВ рдердкреНрджреИ i16 рейреи-рдмрд┐рдЯ рдкреНрд▓реЗрдЯрдлрд░реНрдордорд╛ (рейреи-рдмрд┐рдЯ рд░реЗрдЬрд┐рд╕реНрдЯрд░рд╣рд░реВ рд╕рд╣рд┐рдд) рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрджрдЫ, рдердк рдкрдЫрд┐, рджрд╛рдпрд░рд╛рдорд╛ рд░рд╣рдирдХреЛ рд▓рд╛рдЧрд┐ рд╕рд╛рдЗрди рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛рд░реНрдп 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 рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рд▓рд╛рдЧреА C рдЬрд╕реНрддреИ рднрд╛рд╖рд╛рд╣рд░реБ рдХреЛ рд▓рд╛рдЧреА рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рдХреЛ рд▓рд╛рдЧреА, рддрдкрд╛рдИрд▓реЗ рдХреЗрд╣рд┐ рдЪрд╛рд▓рд╣рд░реБ рдХреЛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдиреБ рдкрд░реНрдЫред рдпрд╕ рдирд┐рд░реНрджреЗрд╢рдирд▓рд╛рдИ рдХрд▓ рдЧрд░реНрдиреЗ рдкрд░рд┐рдгрд╛рдо рдЪрд░рдХреЛ рд╣рд╛рд▓рдХреЛ рдорд╛рди рд╣реЛ (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 dereferencing рдХрд╛рд░реНрдпрд╣рд░реВ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрджреИрдиред рдпреЛ рдХреЗрд╡рд▓ рдЕрд╡рд╕реНрдерд┐рдд рдПрдХ рдорд╛ рдЖрдзрд╛рд░рд┐рдд рдирдпрд╛рдБ рд╕реВрдЪрдХ рдЧрдгрдирд╛ рдЧрд░реНрджрдЫред рдпрд╕рд▓рд╛рдИ рдирд┐рд░реНрджреЗрд╢рдирдХреЛ рд░реВрдкрдорд╛ рд▓рд┐рди рд╕рдХрд┐рдиреНрдЫ 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди