LLVM Go-แƒก แƒžแƒ”แƒ แƒกแƒžแƒ”แƒฅแƒขแƒ˜แƒ•แƒ˜แƒ“แƒแƒœ

แƒจแƒ”แƒ›แƒ“แƒ’แƒ”แƒœแƒ”แƒšแƒ˜แƒก แƒจแƒ”แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ แƒซแƒแƒšแƒ˜แƒแƒœ แƒ แƒ—แƒฃแƒšแƒ˜ แƒแƒ›แƒแƒชแƒแƒœแƒแƒ. แƒ›แƒแƒ’แƒ แƒแƒ›, แƒกแƒแƒ‘แƒ”แƒ“แƒœแƒ˜แƒ”แƒ แƒแƒ“, LLVM-แƒ˜แƒก แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒ˜แƒ—, แƒแƒ› แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ˜แƒก แƒ’แƒแƒ“แƒแƒฌแƒงแƒ•แƒ”แƒขแƒ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒœแƒแƒ“ แƒ’แƒแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ, แƒ แƒแƒช แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒแƒซแƒšแƒ”แƒ•แƒก แƒ”แƒ แƒ— แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒกแƒขแƒกแƒแƒช แƒ™แƒ˜ แƒจแƒ”แƒฅแƒ›แƒœแƒแƒก แƒแƒฎแƒแƒšแƒ˜ แƒ”แƒœแƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒ— แƒแƒฎแƒšแƒแƒกแƒแƒ C-แƒกแƒ—แƒแƒœ. LLVM-แƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ แƒ’แƒแƒ แƒ—แƒฃแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ˜แƒ›แƒ˜แƒ—, แƒ แƒแƒ› แƒ”แƒก แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ แƒฌแƒแƒ แƒ›แƒแƒ“แƒ’แƒ”แƒœแƒ˜แƒšแƒ˜แƒ แƒ“แƒ˜แƒ“แƒ˜ แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ˜แƒ— แƒ™แƒแƒ“แƒ˜แƒ—, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒฆแƒญแƒฃแƒ แƒ•แƒ˜แƒšแƒ˜แƒ แƒ›แƒชแƒ˜แƒ แƒ” แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ˜แƒ—. แƒแƒ› แƒฎแƒแƒ แƒ•แƒ”แƒ–แƒ˜แƒก แƒ’แƒแƒ›แƒแƒกแƒฌแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒ–แƒœแƒ˜แƒ—, แƒ›แƒแƒกแƒแƒšแƒ˜แƒก แƒแƒ•แƒขแƒแƒ แƒ˜, แƒ แƒแƒ›แƒšแƒ˜แƒก แƒ—แƒแƒ แƒ’แƒ›แƒแƒœแƒกแƒแƒช แƒ“แƒฆแƒ”แƒก แƒ•แƒแƒฅแƒ•แƒ”แƒงแƒœแƒ”แƒ‘แƒ—, แƒแƒžแƒ˜แƒ แƒ”แƒ‘แƒก แƒแƒฉแƒ•แƒ”แƒœแƒแƒก Go-แƒจแƒ˜ แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ แƒ™แƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒแƒฉแƒ•แƒ”แƒœแƒแƒก, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒ˜แƒ—แƒแƒ แƒ’แƒ›แƒœแƒ”แƒ‘แƒ แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒแƒ“ แƒฌแƒแƒ“แƒ˜ SSAแƒ“แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ LLVM IR-แƒจแƒ˜ แƒจแƒ”แƒ›แƒ“แƒ’แƒ”แƒœแƒ”แƒšแƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— แƒ—แƒ˜แƒœแƒ˜แƒ’แƒ. Go SSA แƒ“แƒ LLVM IR แƒ™แƒแƒ“แƒ˜ แƒแƒ“แƒœแƒแƒ• แƒ แƒ”แƒ“แƒแƒฅแƒขแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ, แƒ แƒแƒ—แƒ แƒฌแƒแƒจแƒแƒšแƒแƒก แƒ˜แƒก, แƒ แƒแƒช แƒแƒ  แƒแƒ แƒ˜แƒก แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒ˜ แƒแƒฅ แƒ›แƒแƒชแƒ”แƒ›แƒฃแƒš แƒแƒฎแƒกแƒœแƒ-แƒ’แƒแƒœแƒ›แƒแƒ แƒขแƒ”แƒ‘แƒ”แƒ‘แƒ—แƒแƒœ, แƒ แƒแƒ—แƒ แƒแƒฎแƒกแƒœแƒ แƒฃแƒคแƒ แƒ แƒ’แƒแƒกแƒแƒ’แƒ”แƒ‘แƒ˜ แƒ’แƒแƒฎแƒ“แƒ”แƒก.

LLVM Go-แƒก แƒžแƒ”แƒ แƒกแƒžแƒ”แƒฅแƒขแƒ˜แƒ•แƒ˜แƒ“แƒแƒœ

แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜

แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒแƒฅ แƒ•แƒแƒžแƒ˜แƒ แƒ”แƒ‘, แƒแƒ แƒ˜แƒก แƒ แƒ˜แƒชแƒฎแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ˜:

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 แƒ”แƒœแƒแƒจแƒ˜, แƒฎแƒ”แƒšแƒ›แƒแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ แƒ›แƒ—แƒ”แƒšแƒ˜ แƒ แƒ˜แƒชแƒฎแƒ•แƒ˜แƒก แƒชแƒ•แƒšแƒแƒ“แƒ˜แƒก แƒ’แƒแƒ“แƒแƒญแƒแƒ แƒ‘แƒ”แƒ‘แƒ แƒ˜แƒฌแƒ•แƒ”แƒ•แƒก แƒ’แƒแƒœแƒฃแƒกแƒแƒ–แƒฆแƒ•แƒ แƒ”แƒš แƒฅแƒชแƒ”แƒ•แƒแƒก, แƒแƒ›แƒ˜แƒขแƒแƒ› Clang แƒฌแƒ˜แƒœแƒ แƒœแƒแƒฌแƒ˜แƒšแƒ˜ แƒแƒ›แƒแƒขแƒ”แƒ‘แƒก แƒ“แƒ แƒแƒจแƒแƒก แƒแƒžแƒ”แƒ แƒแƒชแƒ˜แƒแƒก. 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. แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒฃแƒฉแƒ•แƒ”แƒฃแƒšแƒแƒ แƒ“แƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒšแƒ˜ แƒ“แƒ แƒ แƒ“แƒแƒกแƒญแƒ˜แƒ แƒ“แƒ”แƒก แƒ›แƒ˜แƒก แƒ’แƒแƒ’แƒ”แƒ‘แƒแƒก. แƒ’แƒ•แƒแƒฎแƒกแƒแƒ•แƒ“แƒ”แƒก, แƒ แƒแƒ› SSA แƒแƒ แƒ˜แƒก แƒจแƒ”แƒ›แƒแƒ™แƒšแƒ”แƒ‘แƒ Static Single Assignment. แƒ”แƒก แƒแƒ แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ’แƒ”แƒœแƒšแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ™แƒแƒ“แƒ˜แƒก แƒจแƒฃแƒแƒšแƒ”แƒ“แƒฃแƒ แƒ˜ แƒฌแƒแƒ แƒ›แƒแƒ“แƒ’แƒ”แƒœแƒ, แƒ แƒแƒ›แƒ”แƒšแƒจแƒ˜แƒช แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒš แƒชแƒ•แƒšแƒแƒ“แƒก แƒ”แƒœแƒ˜แƒญแƒ”แƒ‘แƒ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ”แƒ แƒ—แƒฎแƒ”แƒš. แƒ”แƒก แƒจแƒ”แƒกแƒแƒœแƒ˜แƒจแƒœแƒแƒ•แƒ˜แƒ แƒฉแƒ•แƒ”แƒœแƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒฎแƒแƒขแƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก 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-แƒก แƒ›แƒฃแƒจแƒแƒแƒ‘แƒแƒก. แƒแƒ“แƒแƒ›แƒ˜แƒแƒœแƒ˜แƒก แƒžแƒ”แƒ แƒกแƒžแƒ”แƒฅแƒขแƒ˜แƒ•แƒ˜แƒ“แƒแƒœ แƒ”แƒก แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒแƒ แƒ—แƒฃแƒšแƒ”แƒ‘แƒก แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒ’แƒ”แƒ‘แƒแƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ˜แƒก แƒคแƒแƒฅแƒขแƒ˜, แƒ แƒแƒ› แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ”แƒ แƒ—แƒฎแƒ”แƒš แƒแƒ แƒ˜แƒก แƒ›แƒ˜แƒœแƒ˜แƒญแƒ”แƒ‘แƒฃแƒšแƒ˜, แƒ‘แƒ”แƒ•แƒ  แƒแƒžแƒขแƒ˜แƒ›แƒ˜แƒ–แƒแƒชแƒ˜แƒแƒก แƒ‘แƒ”แƒ•แƒ แƒแƒ“ แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒก.

แƒ’แƒแƒ˜แƒ—แƒ•แƒแƒšแƒ˜แƒกแƒฌแƒ˜แƒœแƒ”แƒ—, แƒ แƒแƒ› แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒ“แƒแƒฌแƒ”แƒ แƒ— แƒกแƒแƒ™แƒฃแƒ—แƒแƒ  แƒจแƒ”แƒ›แƒ“แƒ’แƒ”แƒœแƒ”แƒšแƒก, แƒฉแƒ•แƒ”แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ•, แƒแƒ  แƒ›แƒแƒ’แƒ˜แƒฌแƒ”แƒ•แƒ— แƒกแƒแƒฅแƒ›แƒ” แƒแƒ› แƒขแƒ˜แƒžแƒ˜แƒก แƒกแƒแƒ™แƒ˜แƒ—แƒฎแƒ”แƒ‘แƒ—แƒแƒœ. แƒ™แƒšแƒแƒœแƒ’แƒ˜แƒช แƒ™แƒ˜ แƒแƒ  แƒฅแƒ›แƒœแƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒแƒ› แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒแƒก 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 แƒแƒ  แƒฃแƒญแƒ”แƒ แƒก แƒ›แƒฎแƒแƒ แƒก slices-แƒก แƒ“แƒ แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“, แƒ แƒแƒ’แƒแƒ แƒช แƒแƒžแƒขแƒ˜แƒ›แƒ˜แƒ–แƒแƒชแƒ˜แƒ, 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 Go-แƒก แƒžแƒ”แƒ แƒกแƒžแƒ”แƒฅแƒขแƒ˜แƒ•แƒ˜แƒ“แƒแƒœ

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ