LLVM ืคึฟื•ืŸ ืึท ื’ื™ื™ืŸ ืคึผืขืจืกืคึผืขืงื˜ื™ื•ื•

ื“ืขื•ื•ืขืœืึธืคึผื™ื ื’ ืึท ืงืึทืžืคึผื™ื™ืœืขืจ ืื™ื– ืึท ื–ื™ื™ืขืจ ืฉื•ื•ืขืจ ืึทืจื‘ืขื˜. ืึธื‘ืขืจ, ืฆื•ืž ื’ืœื™ืง, ืžื™ื˜ ื“ืขืจ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืคื•ืŸ ืคึผืจืึทื“ื–ืฉืขืงืก ื•ื•ื™ LLVM, ื“ื™ ืœื™ื™ื–ื•ื ื’ ืฆื• ื“ืขื ืคึผืจืึธื‘ืœืขื ืื™ื– ื–ื™ื™ืขืจ ืกื™ืžืคึผืœืึทืคื™ื™ื“, ื•ื•ืึธืก ืึทืœืึทื•ื– ืืคื™ืœื• ืึท ืื™ื™ืŸ ืคึผืจืึธื’ืจืึทืžื™ืกื˜ ืฆื• ืฉืึทืคึฟืŸ ืึท ื ื™ื™ึทืข ืฉืคึผืจืึทืš ื•ื•ืึธืก ืื™ื– ื ืึธืขื ื˜ ืื™ืŸ ืคืึธืจืฉื˜ืขืœื•ื ื’ ืฆื• C. ืืจื‘ืขื˜ืŸ ืžื™ื˜ LLVM ืื™ื– ืงืึธืžืคึผืœื™ืฆื™ืจื˜ ื“ื•ืจืš ื“ื™ ืคืึทืงื˜ ืึทื– ื“ืึธืก ืกื™ืกื˜ืขื ืื™ื– ืจืขืคึผืจื™ื–ืขื ื˜ื™ื“ ื“ื•ืจืš ืึท ืจื™ื–ื™ืง ืกื•ืžืข ืคื•ืŸ โ€‹โ€‹ืงืึธื“, ื™ืงื•ื•ื™ืคึผื˜ ืžื™ื˜ ืงืœื™ื™ืŸ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ. ื›ึผื“ื™ ืฆื• ืคึผืจื•ึผื•ื•ืŸ ืคึฟืึทืจืจื™ื›ื˜ืŸ ื“ืขื ื—ืกืจื•ืŸ, ื•ื•ืขื˜ ื“ืขืจ ืžื—ื‘ืจ ืคึฟื•ืŸ ื“ืขื ืžืึทื˜ืขืจื™ืึทืœ, ืคึฟื•ืŸ ื•ื•ืขืœื›ืŸ ืžื™ืจ ืคึฟืึทืจืขืคื ื˜ืœืขื›ืŸ ื“ื™ ืื™ื‘ืขืจื–ืขืฆื•ื ื’ ื”ืฒึทื ื˜, ื‘ืึทื•ื•ื™ื™ื–ืŸ ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ืงืึธื“ ื•ื•ืึธืก ืื™ื– ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ 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's ื˜ื™ืคึผ ืคืึทืจื˜ืจืขื˜ื•ื ื’ ื‘ืึทืฉืœื•ืก int, ื•ื•ืึธืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ืจืขืคึผืจื™ื–ืขื ื˜ื™ื“ ื•ื•ื™ ืึท 32-ื‘ื™ืกืœ ืึธื“ืขืจ 64-ื‘ื™ืกืœ ื•ื•ืขืจื˜, ื“ื™ืคึผืขื ื“ื™ื ื’ ืื•ื™ืฃ ื“ื™ ืงืึทืžืคึผื™ื™ืœืขืจ ืื•ืŸ ื“ืขืจ ืฆื™ืœ ืคื•ืŸ ื“ื™ ื–ืึทืžืœื•ื ื’, ืื™ื– ืื ื’ืขื ื•ืžืขืŸ ื•ื•ืขืŸ LLVM ื“ื–ืฉืขื ืขืจื™ื™ืฅ ื“ื™ ื™ืจ ืงืึธื“. ื“ืึธืก ืื™ื– ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ืคื™ืœืข ืกื™ื‘ื•ืช ืึทื– LLVM IR ืงืึธื“ ืื™ื– ื ื™ืฉื˜, ื•ื•ื™ ืคื™ืœืข ืžืขื ื˜ืฉืŸ ื˜ืจืึทื›ื˜ืŸ, ืคึผืœืึทื˜ืคืึธืจืžืข ืคืจื™ื™ึท. ืึทื–ืึท ืงืึธื“, ื‘ืืฉืืคืŸ ืคึฟืึทืจ ืื™ื™ืŸ ืคึผืœืึทื˜ืคืึธืจืžืข, ืงืขื ืขืŸ ื ื™ื˜ ื ืึธืจ ื–ื™ื™ืŸ ื’ืขื ื•ืžืขืŸ ืื•ืŸ ืฆื•ื ื•ื™ืคื’ืขืฉื˜ืขืœื˜ ืคึฟืึทืจ ืืŸ ืื ื“ืขืจ ืคึผืœืึทื˜ืคืึธืจืžืข (ืกื™ื™ึทื“ืŸ ืื™ืจ ื–ืขื ื˜ ืคึผืึทืกื™ืง ืคึฟืึทืจ ืกืึทืœื•ื•ื™ื ื’ ื“ืขื ืคึผืจืึธื‘ืœืขื ืžื™ื˜ ืขืงืกื˜ืจืขื ื–ืึธืจื’).

ืืŸ ืื ื“ืขืจ ื˜ืฉื™ืงืึทื•ื•ืข ืคื•ื ื˜ ื•ื•ืขืจื˜ ื‘ืืžืขืจืงืŸ ืื™ื– ืึทื– ื“ืขืจ ื˜ื™ืคึผ i64 ืื™ื– ื ื™ืฉื˜ ืึท ื’ืขื—ืชืžืขื˜ ื’ืึทื ืฅ ื ื•ืžืขืจ: ืขืก ืื™ื– ื ื™ื™ื˜ืจืึทืœ ืื™ืŸ ื˜ืขืจืžื™ื ืขืŸ ืคื•ืŸ ืจืขืคึผืจื™ื–ืขื ื˜ื™ื ื’ ื“ื™ ืฆื™ื™ื›ืŸ ืคื•ืŸ ื“ื™ ื ื•ืžืขืจ. ื“ืขืคึผืขื ื“ื™ื ื’ ืื•ื™ืฃ ื“ื™ ืœื™ืžืขื“, ืขืก ืงืขื ืขืŸ ืคืึธืจืฉื˜ืขืœืŸ ื‘ื™ื™ื“ืข ื’ืขื—ืชืžืขื˜ ืื•ืŸ ืึทื ืกื™ื™ื ื“ ื ื•ืžืขืจืŸ. ืื™ืŸ ื“ืขื ืคืึทืœ ืคื•ืŸ ื“ื™ ืคืึทืจื˜ืจืขื˜ื•ื ื’ ืคื•ืŸ ื“ื™ ืึทื“ื™ืฉืึทืŸ ืึธืคึผืขืจืึทืฆื™ืข, ื“ืึธืก ื˜ื•ื˜ ื ื™ืฉื˜ ืขื ื™ืŸ, ืึทื–ื•ื™ ืขืก ืื™ื– ืงื™ื™ืŸ ื—ื™ืœื•ืง ืื™ืŸ ืืจื‘ืขื˜ืŸ ืžื™ื˜ ื’ืขื—ืชืžืขื˜ ืึธื“ืขืจ ืึทื ืกื™ื™ื ื“ ื ื•ืžืขืจืŸ. ื“ืึธ ืื™ืš ื•ื•ืึธืœื˜ ื•ื•ื™ ืฆื• ื˜ืึธืŸ ืึทื– ืื™ืŸ ื“ื™ C ืฉืคึผืจืึทืš, ืึธื•ื•ื•ืขืจืคืœืึธื•ื™ื ื’ ืึท ื’ืขื—ืชืžืขื˜ ื™ื ื˜ืึทื“ื–ืฉืขืจ ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง ืคื™ืจื˜ ืฆื• ืึทื ื“ื™ืคื™ื™ื ื“ ื ืึทื˜ื•ืจ, ืึทื–ื•ื™ ื“ื™ ืงืœืึทื ื’ ืคืจืึธื ื˜ืขื ื“ ืžื•ืกื™ืฃ ืึท ืคืึธืŸ ืฆื• ื“ื™ ืึธืคึผืขืจืึทืฆื™ืข nsw (ืงื™ื™ืŸ ื’ืขื—ืชืžืขื˜ ื™ื™ึทื ื•ื•ื™ืงืœืขืŸ), ื•ื•ืึธืก ื“ืขืจืฆื™ื™ืœื˜ LLVM ืึทื– ืขืก ืงืขื ืขืŸ ื™ื‘ืขืจื ืขืžืขืŸ ืึทื– ื“ืขืจืฆื• ืงื™ื™ื ืžืึธืœ ืึธื•ื•ื•ืขืจืคืœืึธื•ื–.

ื“ืึธืก ืงืขืŸ ื–ื™ื™ืŸ ื•ื•ื™ื›ื˜ื™ืง ืคึฟืึทืจ ืขื˜ืœืขื›ืข ืึธืคึผื˜ื™ืžื™ื–ืึทื˜ื™ืึธื ืก. ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืึทื“ื™ื ื’ ืฆื•ื•ื™ื™ ื•ื•ืึทืœื•ืขืก i16 ืื•ื™ืฃ ืึท 32-ื‘ื™ืกืœ ืคึผืœืึทื˜ืคืึธืจืžืข (ืžื™ื˜ 32-ื‘ื™ืกืœ ืจืขื“ื–ืฉื™ืกื˜ืขืจื–) ืจื™ืงื•ื•ื™ื™ืขืจื–, ื ืึธืš ืึทื“ื™ืฉืึทืŸ, ืึท ืฆื™ื™ื›ืŸ ื™ืงืกืคึผืึทื ืฉืึทืŸ ืึธืคึผืขืจืึทืฆื™ืข ืฆื• ื‘ืœื™ื™ึทื‘ืŸ ืื™ืŸ ืงื™ื™ื˜ i16. ื•ื•ื™ื™ึทืœ ืคื•ืŸ ื“ืขื, ืขืก ืื™ื– ืึธืคื˜ ืžืขืจ ืขืคืขืงื˜ื™ื•ื• ืฆื• ื“ื•ืจื›ืคื™ืจืŸ ื™ื ื˜ืึทื“ื–ืฉืขืจ ืึทืคึผืขืจื™ื™ืฉืึทื ื– ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ืžืึทืฉื™ืŸ ืจืขื’ื™ืกื˜ืจื™ืจืŸ ืกื™ื–ืขืก.

ื•ื•ืึธืก ื›ืึทืคึผืึทื ื– ื•ื•ื™ื™ึทื˜ืขืจ ืžื™ื˜ ื“ืขื ื™ืจ ืงืึธื“ ืื™ื– ื ื™ืฉื˜ ืคื•ืŸ ื‘ืึทื–ื•ื ื“ืขืจ ืื™ื ื˜ืขืจืขืก ืฆื• ืื•ื ื“ื– ืื™ืฆื˜. ื“ืขืจ ืงืึธื“ ืื™ื– ืึธืคึผื˜ื™ืžื™ื–ืขื“ (ืึธื‘ืขืจ ืื™ืŸ ื“ืขื ืคืึทืœ ืคื•ืŸ ืึท ืคึผืฉื•ื˜ ื‘ื™ื™ึทืฉืคึผื™ืœ ื•ื•ื™ ืื•ื ื“ื–ืขืจ, ื’ืึธืจื ื™ืฉื˜ ืื™ื– ืึธืคึผื˜ื™ืžื™ื–ืขื“) ืื•ืŸ ื“ืขืžืึธืœื˜ ืงืึธื ื•ื•ืขืจื˜ืขื“ ืื™ืŸ ืžืึทืฉื™ืŸ ืงืึธื“.

ืฆื•ื•ื™ื™ื˜ืข ื‘ื™ื™ืฉืคื™ืœ

ื“ืขืจ ื•ื•ื™ื™ึทื˜ืขืจ ื‘ื™ื™ึทืฉืคึผื™ืœ ืžื™ืจ ื•ื•ืขืœืŸ ืงื•ืงืŸ ืื™ืŸ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืึท ื‘ื™ืกืœ ืžืขืจ ืงืึธืžืคึผืœื™ืฆื™ืจื˜. ื ื™ื™ืžืœื™, ืžื™ืจ ื–ืขื ืขืŸ ื’ืขืจืขื“ื˜ ื•ื•ืขื’ืŸ ืึท ืคึฟื•ื ืงืฆื™ืข ื•ื•ืึธืก ืกืึทืžืขืจื– ืึท ืจืขืคื˜ืœ ืคื•ืŸ ื™ื ื˜ืึทื“ื–ืฉืขืจื–:

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. ื“ื™ ื™ื ืกื˜ืจืึทืงืฉืึทื ื– ื–ืขื ืขืŸ ื’ืึทื ืฅ ื•ืžื’ืขื•ื•ื™ื™ื ื˜ืœืขืš ืื•ืŸ ืงืขืŸ ื ืขืžืขืŸ ืขื˜ืœืขื›ืข ืžืึธืœ ืฆื• ืคึฟืึทืจืฉื˜ื™ื™ืŸ. ื’ืขื“ืขื ืง, ืึทื– S.S.A. ืื™ื– ืงื•ืจืฅ ืคึฟืึทืจ ืกื˜ืึทื˜ื™ืง ืื™ื™ืŸ ืึทืกื™ื™ื ืžืึทื ื˜. ื“ืึธืก ืื™ื– ืึท ื™ื ื˜ืขืจืžื™ื“ื™ื™ื˜ ืคืึทืจื˜ืจืขื˜ื•ื ื’ ืคื•ืŸ ื“ื™ ืงืึธื“ ื’ืขื ื™ืฆื˜ ื“ื•ืจืš ืงืึทืžืคึผื™ื™ืœืขืจื–, ืื™ืŸ ื•ื•ืึธืก ื™ืขื“ืขืจ ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง ืื™ื– ืึทืกื™ื™ื ื“ ืึท ื•ื•ืขืจื˜ ื‘ืœื•ื™ื– ืึทืžืึธืœ. ื“ืึธืก ืื™ื– ื’ืจื•ื™ืก ืคึฟืึทืจ ื™ืงืกืคึผืจืขืกื™ื ื’ ืคึผืฉื•ื˜ ืคืึทื ื’ืงืฉืึทื ื– ื•ื•ื™ ืื•ื ื“ื–ืขืจ ืคึฟื•ื ืงืฆื™ืข 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 ืฉื˜ื™ืฆื˜ ื ื™ืฉื˜ ืกืœื™ื™ืกื™ื–, ืื•ืŸ ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜, ื•ื•ื™ ืึท ืึทืคึผื˜ืึทืžืึทื–ื™ื™ืฉืึทืŸ, ื“ื™ 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. ืคื•ืŸ ืงื•ืจืก, ืขืก ืื™ื– ืึท ืคึผืœืึทืฅ ืžืขืจ ื“ืึธ. ืื™ืŸ ื‘ืึทื–ื•ื ื“ืขืจ, ื“ื™ ื™ื ื˜ืขืจืžื™ื“ื™ื™ื˜ ืคืึทืจื˜ืจืขื˜ื•ื ื’ ืคื•ืŸ ื“ื™ ืงืึธื“ ืงืขืŸ ืึทื ื˜ื”ืึทืœื˜ืŸ ืคื™ืœืข ืึทื ืึทื˜ื™ื™ืฉืึทื ื– ื•ื•ืึธืก ืœืึธื–ืŸ ืึทืคึผื˜ืึทืžืึทื–ื™ื™ืฉืึทืŸ ืคึผืึทืกื™ื– ืฆื• ื ืขืžืขืŸ ืื™ืŸ ื—ืฉื‘ื•ืŸ ื–ื™ื›ืขืจ ืคึฟืขื™ึดืงื™ื™ื˜ืŸ ืคื•ืŸ ื“ื™ ืงืึธื“ ื‘ืืงืื ื˜ ืฆื• ื“ื™ ืงืึทืžืคึผื™ื™ืœืขืจ ื•ื•ืึธืก ืงืขื ืขืŸ ื ื™ื˜ ืึทื ื“ืขืจืฉ ื–ื™ื™ืŸ ืื•ื™ืกื’ืขื“ืจื™ืงื˜ ืื™ืŸ ื™ืจ. ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ื“ืึธืก ืื™ื– ืึท ืคืึธืŸ inbounds GEP ื™ื ืกื˜ืจืึทืงืฉืึทื ื–, ืึธื“ืขืจ ืคืœืึทื’ืก nsw ะธ nuw, ื•ื•ืึธืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ืžื•ืกื™ืฃ ืฆื• ื“ื™ ื™ื ืกื˜ืจืึทืงืฉืึทื ื– add. ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ื’ื™ื™ื˜ ืคึฟืึทืจ ื“ื™ ืงื™ื•ื•ืขืจื“ private, ื™ื ื“ืึทืงื™ื™ื˜ื™ื ื’ ืฆื• ื“ื™ ืึธืคึผื˜ื™ืžื™ื–ืขืจ ืึทื– ื“ื™ ืคึฟื•ื ืงืฆื™ืข ืขืก ืžืึทืจืงืก ื•ื•ืขื˜ ื ื™ืฉื˜ ื–ื™ื™ืŸ ืจืขืคืขืจืขื ืกืขื“ ืคึฟื•ืŸ ืึทืจื•ื™ืก ื“ื™ ืงืจืึทื ื˜ ื–ืึทืžืœื•ื ื’ ืึทืคึผืึทืจืึทื˜. ื“ืึธืก ืึทืœืึทื•ื– ืึท ืคึผืœืึทืฅ ืคื•ืŸ ื˜ืฉื™ืงืึทื•ื•ืข ื™ื ื˜ืขืจืคึผืจืึทืกื™ื“ื–ืฉืขืจืึทืœ ืึทืคึผื˜ืึทืžืึทื–ื™ื™ืฉืึทื ื– ื•ื•ื™ ื™ืœื™ืžืึทื ื™ื™ื˜ื™ื ื’ ืึทื ื™ื•ื–ื“ ืึทืจื’ื•ืžืขื ื˜ืŸ.

ืื™ืจ ืงืขื ื˜ ืœื™ื™ืขื ืขืŸ ืžืขืจ ื•ื•ืขื’ืŸ LLVM ืื™ืŸ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ, ื•ื•ืึธืก ืื™ืจ ื•ื•ืขื˜ ืึธืคื˜ ืึธืคึผืฉื™ืงืŸ ืฆื• ื•ื•ืขืŸ ืื™ืจ ืึทื ื˜ื•ื•ื™ืงืœืขืŸ ื“ื™ื™ืŸ ืื™ื™ื’ืขื ืข LLVM-ื‘ืื–ื™ืจื˜ ืงืึทืžืคึผื™ื™ืœืขืจ. ื“ืึธ ืคื™ืจืขืจืฉืึทืคื˜, ื•ื•ืึธืก ืงื•ืงื˜ ืื•ื™ืฃ ืึทื ื˜ื•ื•ื™ืงืœืขืŸ ืึท ืงืึทืžืคึผื™ื™ืœืขืจ ืคึฟืึทืจ ืึท ื–ื™ื™ืขืจ ืคึผืฉื•ื˜ ืฉืคึผืจืึทืš. ื‘ื™ื™ื“ืข ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืงื•ื•ืืœืŸ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื ื•ืฆื™ืง ืคึฟืึทืจ ืื™ืจ ื•ื•ืขืŸ ืื™ืจ ืฉืึทืคึฟืŸ ื“ื™ื™ืŸ ืื™ื™ื’ืขื ืข ืงืึทืžืคึผื™ื™ืœืขืจ.

ืœื™ื‘ ืœื™ื™ืขื ืขืจ! ื ื™ืฆืŸ LLVM?

LLVM ืคึฟื•ืŸ ืึท ื’ื™ื™ืŸ ืคึผืขืจืกืคึผืขืงื˜ื™ื•ื•

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’