āĻāĻŽā§āĻĒāĻžāĻāϞāĻžāϰ āĻĄā§āĻā§āϞāĻĒ āĻāϰāĻž āĻā§āĻŦāĻ āĻāĻ āĻŋāύ āĻāĻžāĻāĨ¤ āĻāĻŋāύā§āϤā§, āϏā§āĻāĻžāĻā§āϝāĻŦāĻļāϤ, LLVM-āĻāϰ āĻŽāϤ⧠āĻĒā§āϰāĻāϞā§āĻĒāĻā§āϞāĻŋāϰ āĻŦāĻŋāĻāĻžāĻļā§āϰ āϏāĻžāĻĨā§, āĻāĻ āϏāĻŽāϏā§āϝāĻžāϰ āϏāĻŽāĻžāϧāĻžāύāĻāĻŋ āĻŦā§āϝāĻžāĻĒāĻāĻāĻžāĻŦā§ āϏāϰāϞā§āĻā§āϤ āĻšāϝāĻŧā§āĻā§, āϝāĻž āĻāĻŽāύāĻāĻŋ āĻāĻāĻāύ āĻāĻāĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻžāϰāĻā§ āĻāĻāĻāĻŋ āύāϤā§āύ āĻāĻžāώāĻž āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻĻā§āϝāĻŧ āϝāĻž C-āĻāϰ āĻĒāĻžāϰāĻĢāϰāĻŽā§āϝāĻžāύā§āϏā§āϰ āĻāĻžāĻāĻžāĻāĻžāĻāĻŋāĨ¤ āϏāĻŋāϏā§āĻā§āĻŽāĻāĻŋ āĻŦāĻŋāĻĒā§āϞ āĻĒāϰāĻŋāĻŽāĻžāĻŖ āĻā§āĻĄ āĻĻā§āĻŦāĻžāϰāĻž āĻāĻĒāϏā§āĻĨāĻžāĻĒāĻŋāϤ āĻšāϝāĻŧ, āϏāĻžāĻŽāĻžāύā§āϝ āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύ āĻĻāĻŋāϝāĻŧā§ āϏāĻā§āĻāĻŋāϤāĨ¤ āĻāĻ āϤā§āϰā§āĻāĻŋāĻāĻŋ āϏāĻāĻļā§āϧāύ āĻāϰāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰāĻžāϰ āĻāύā§āϝ, āĻāĻĒāĻžāĻĻāĻžāύāĻāĻŋāϰ āϞā§āĻāĻ, āϝāĻžāϰ āĻ āύā§āĻŦāĻžāĻĻ āĻāĻŽāϰāĻž āĻāĻ āĻĒā§āϰāĻāĻžāĻļ āĻāϰāĻāĻŋ, Go-āϤ⧠āϞā§āĻāĻž āĻā§āĻĄā§āϰ āĻāĻĻāĻžāĻšāϰāĻŖāĻā§āϞāĻŋ āĻĒā§āϰāĻĻāϰā§āĻļāύ āĻāϰāϤ⧠āĻāϞā§āĻā§āύ āĻāĻŦāĻ āĻĻā§āĻāĻžāĻŦā§āύ āϝ⧠āĻā§āĻāĻžāĻŦā§ āϏā§āĻā§āϞāĻŋ āĻĒā§āϰāĻĨāĻŽ āĻ āύā§āĻŦāĻžāĻĻ āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞ , āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰ āĻāĻŽā§āĻĒāĻžāĻāϞāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāϞāĻāϞāĻāĻŋāĻāĻŽ āĻāĻāĻāϰ-āĻ . Go SSA āĻāĻŦāĻ LLVM IR āĻā§āĻĄ āϏāĻžāĻŽāĻžāύā§āϝ āĻāĻĄāĻŋāĻ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ āϝāĻžāϤ⧠āĻāϰ⧠āĻŦā§āϝāĻžāĻā§āϝāĻžāĻā§āϞāĻŋāĻā§ āĻāϰāĻ āĻŦā§āϧāĻāĻŽā§āϝ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻžāύ⧠āĻĒā§āϰāĻĻāϤā§āϤ āĻŦā§āϝāĻžāĻā§āϝāĻžāĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§ āĻĒā§āϰāĻžāϏāĻā§āĻāĻŋāĻ āύāϝāĻŧ āĻāĻŽāύ āĻāĻŋāύāĻŋāϏāĻā§āϞāĻŋāĻā§ āϏāϰāĻŋāϝāĻŧā§ āĻĻā§āĻāϝāĻŧāĻž āĻšāϝāĻŧā§āĻā§ā§ˇ
āĻĒā§āϰāĻĨāĻŽ āĻāĻĻāĻžāĻšāϰāĻŖ
āĻāĻŽāĻŋ āĻāĻāĻžāύ⧠āĻĒā§āϰāĻĨāĻŽ āϝ⧠āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻĻā§āĻāϤ⧠āϝāĻžāĻā§āĻāĻŋ āϤāĻž āĻšāϞ āϏāĻāĻā§āϝāĻž āϝā§āĻ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āϏāĻšāĻ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž:
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 āĻāϰ āĻāĻāĻāĻŋ āĻĻāĻŋāĻāĻāĻŋāϰ āϏāĻžāϰāĻŽāϰā§āĻŽ āĻĻā§āĻāϤ⧠āĻĻā§āϝāĻŧāĨ¤ āϝāĻĨāĻž, āĻā§āĻĄāĻā§ āĻāϏāĻāϏāĻ āĻĢāϰā§āĻŽā§ āϰā§āĻĒāĻžāύā§āϤāϰ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ, āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻ
āĻāĻŋāĻŦā§āϝāĻā§āϤāĻŋ āϏāĻŦāĻā§āϝāĻŧā§ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ āĻ
āĻāĻļā§ āĻŦāĻŋāĻāĻā§āϤ āĻšāϝāĻŧ āϝāĻžāϰ āĻŽāϧā§āϝ⧠āĻāĻāĻŋ āĻāĻ āĻŋāϤ āĻšāϝāĻŧāĨ¤ āĻāĻŽāĻžāĻĻā§āϰ āĻā§āώā§āϤā§āϰā§, āĻāĻĻā§āĻļ 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 āĻā§āĻĄāĻāĻŋ āĻĒā§āϞā§āϝāĻžāĻāĻĢāϰā§āĻŽ āϏā§āĻŦāĻžāϧā§āύ āύāϝāĻŧ āĻāĻŽāύ āĻ
āύā§āĻ āĻāĻžāϰāĻŖā§āϰ āĻŽāϧā§āϝ⧠āĻāĻāĻŋ āĻāĻāĻāĻŋāĨ¤ āĻāĻ āϧāϰāύā§āϰ āĻā§āĻĄ, āĻāĻāĻāĻŋ āĻĒā§āϞā§āϝāĻžāĻāĻĢāϰā§āĻŽā§āϰ āĻāύā§āϝ āϤā§āϰāĻŋ, āĻ
āύā§āϝ āĻĒā§āϞā§āϝāĻžāĻāĻĢāϰā§āĻŽā§āϰ āĻāύā§āϝ āϏāĻšāĻāĻāĻžāĻŦā§ āύā§āĻāϝāĻŧāĻž āĻāĻŦāĻ āϏāĻāĻāϞāύ āĻāϰāĻž āϝāĻžāĻŦā§ āύāĻž (āϝāĻĻāĻŋ āύāĻž āĻāĻĒāύāĻŋ āĻāĻ āϏāĻŽāϏā§āϝāĻžāĻāĻŋ āϏāĻŽāĻžāϧāĻžāύā§āϰ āĻāύā§āϝ āĻāĻĒāϝā§āĻā§āϤ āĻšāύ) ).
āĻāϰā§āĻāĻāĻŋ āĻāĻāϰā§āώāĻŖā§āϝāĻŧ āĻĒāϝāĻŧā§āύā§āĻ āϞāĻā§āώā§āϝāύā§āϝāĻŧ āϝ⧠āĻāĻžāĻāĻĒ 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āĻāĻāĻžāύ⧠āĻāĻĒāύāĻŋ āĻāϤāĻŋāĻŽāϧā§āϝā§āĻ āĻāϏāĻāϏāĻ āĻĢāϰā§āĻŽā§ āĻā§āĻĄā§āϰ āĻĒā§āϰāϤāĻŋāύāĻŋāϧāĻŋāϤā§āĻŦ āĻāϰāĻžāϰ āĻāύā§āϝ āϏāĻžāϧāĻžāϰāĻŖ āĻāϰāĻ āύāĻŋāϰā§āĻŽāĻžāĻŖ āĻĻā§āĻāϤ⧠āĻĒāĻžāϰā§āύāĨ¤ āϏāĻŽā§āĻāĻŦāϤ āĻāĻ āĻā§āĻĄā§āϰ āϏāĻŦāĻā§āϝāĻŧā§ āϏā§āϏā§āĻĒāώā§āĻ āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āĻšāϞ āĻā§āύ āĻāĻžāĻ āĻžāĻŽā§āĻāϤ āĻĒā§āϰāĻŦāĻžāĻš āύāĻŋāϝāĻŧāύā§āϤā§āϰāĻŖ āĻāĻŽāĻžāύā§āĻĄ āύā§āĻāĨ¤ āĻāĻŖāύāĻžāϰ āĻĒā§āϰāĻŦāĻžāĻš āύāĻŋāϝāĻŧāύā§āϤā§āϰāĻŖ āĻāϰāĻžāϰ āĻāύā§āϝ, āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻļāϰā§āϤāϏāĻžāĻĒā§āĻā§āώ āĻāĻŦāĻ āĻļāϰā§āϤāĻšā§āύ āĻāĻžāĻŽā§āĻĒ āĻāĻā§, āĻāĻŦāĻ, āϝāĻĻāĻŋ āĻāĻŽāϰāĻž āĻāĻ āĻāĻŽāĻžāύā§āĻĄāĻāĻŋāĻā§ āĻĒā§āϰāĻŦāĻžāĻš āύāĻŋāϝāĻŧāύā§āϤā§āϰāĻŖā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻāĻŽāĻžāύā§āĻĄ āĻšāĻŋāϏāĻžāĻŦā§ āĻŦāĻŋāĻŦā§āĻāύāĻž āĻāϰāĻŋ, āĻāĻāĻāĻŋ āϰāĻŋāĻāĻžāϰā§āύ āĻāĻŽāĻžāύā§āĻĄāĨ¤
āĻĒā§āϰāĻā§āϤāĻĒāĻā§āώā§, āĻāĻāĻžāύ⧠āĻāĻĒāύāĻŋ āĻŽāύā§āϝā§āĻ āĻĻāĻŋāϤ⧠āĻĒāĻžāϰā§āύ āϝ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻā§āĻāĻāĻĄāĻŧāĻž āϧāύā§āϰā§āĻŦāύā§āϧāύ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻŦā§āϞāĻāĻā§āϞāĻŋāϤ⧠āĻŦāĻŋāĻāĻā§āϤ āύāϝāĻŧ (āĻāĻžāώāĻžāϰ āϏāĻŋ āĻĒāϰāĻŋāĻŦāĻžāϰā§āϰ āĻŽāϤā§)āĨ¤ āĻāĻāĻŋ āϞā§āĻŦā§āϞ āĻĻā§āĻŦāĻžāϰāĻž āĻŦāĻŋāĻāĻā§āϤ, āϏāĻŽāĻžāĻŦā§āĻļ āĻāĻžāώāĻžāϰ āϏā§āĻŽāϰāĻŖ āĻāϰāĻŋāϝāĻŧā§ āĻĻā§āϝāĻŧ āĻāĻŦāĻ āĻŽā§āϞāĻŋāĻ āĻŦā§āϞāĻā§āϰ āĻāĻāĻžāϰ⧠āĻāĻĒāϏā§āĻĨāĻžāĻĒāĻŋāϤ āĻšāϝāĻŧāĨ¤ āĻāϏāĻāϏāĻ-āϤā§, āĻŽā§āϞāĻŋāĻ āĻŦā§āϞāĻāĻā§āϞāĻŋāĻā§ āĻā§āĻĄā§āϰ āϏāĻāϞāĻā§āύ āĻā§āϰāĻŽ āĻšāĻŋāϏāĻžāĻŦā§ āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰāĻž āĻšāϝāĻŧ āĻāĻāĻāĻŋ āϞā§āĻŦā§āϞ āĻĻāĻŋāϝāĻŧā§ āĻļā§āϰ⧠āĻšāϝāĻŧ āĻāĻŦāĻ āĻŽā§āϞāĻŋāĻ āĻŦā§āϞāĻ āϏāĻŽāĻžāĻĒā§āϤāĻŋāϰ āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞ⧠āĻĻāĻŋāϝāĻŧā§ āĻļā§āώ āĻšāϝāĻŧ, āϝā§āĻŽāύ â return и jump.
āĻāĻ āĻā§āĻĄā§āϰ āĻāϰā§āĻāĻāĻŋ āĻāĻāϰā§āώāĻŖā§āϝāĻŧ āĻŦāĻŋāĻŦāϰāĻŖ āύāĻŋāϰā§āĻĻā§āĻļ āĻĻā§āĻŦāĻžāϰāĻž āĻĒā§āϰāϤāĻŋāύāĻŋāϧāĻŋāϤā§āĻŦ āĻāϰāĻž āĻšāϝāĻŧ phi. āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞ⧠āĻŦā§āĻļ āĻ
āϏā§āĻŦāĻžāĻāĻžāĻŦāĻŋāĻ āĻāĻŦāĻ āĻŦā§āĻāϤ⧠āĻāĻŋāĻā§ āϏāĻŽāϝāĻŧ āϞāĻžāĻāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻŽāύ⧠āϰāĻžāĻāĻŦā§āύ, āϝ⧠āϏā§āĻā§āϝāĻžāĻāĻŋāĻ āĻāĻāĻ āĻ
ā§āϝāĻžāϏāĻžāĻāύāĻŽā§āύā§āĻā§āϰ āĻāύā§āϝ āϏāĻāĻā§āώāĻŋāĻĒā§āϤāĨ¤ āĻāĻāĻŋ āĻāĻŽā§āĻĒāĻžāĻāϞāĻžāϰāĻĻā§āϰ āĻĻā§āĻŦāĻžāϰāĻž āĻŦā§āϝāĻŦāĻšā§āϤ āĻā§āĻĄā§āϰ āĻāĻāĻāĻŋ āĻŽāϧā§āϝāĻŦāϰā§āϤ⧠āĻāĻĒāϏā§āĻĨāĻžāĻĒāύāĻž, āϝā§āĻāĻžāύ⧠āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞāĻā§ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻāĻŦāĻžāϰ āĻāĻāĻāĻŋ āĻŽāĻžāύ āĻŦāϰāĻžāĻĻā§āĻĻ āĻāϰāĻž āĻšāϝāĻŧāĨ¤ āĻāĻŽāĻžāĻĻā§āϰ āĻĢāĻžāĻāĻļāύā§āϰ āĻŽāϤ⧠āϏāĻžāϧāĻžāϰāĻŖ āĻĢāĻžāĻāĻļāύ āĻĒā§āϰāĻāĻžāĻļ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻŋ āĻĻā§āϰā§āĻĻāĻžāύā§āϤ myAddāĻāĻĒāϰ⧠āĻĻā§āĻāĻžāύ⧠āĻšāϝāĻŧā§āĻā§, āĻāĻŋāύā§āϤ⧠āĻāϰāĻ āĻāĻāĻŋāϞ āĻĢāĻžāĻāĻļāύ āϝā§āĻŽāύ āĻāĻ āĻŦāĻŋāĻāĻžāĻā§ āĻāϞā§āĻāĻŋāϤ āĻĢāĻžāĻāĻļāύā§āϰ āĻāύā§āϝ āĻāĻĒāϝā§āĻā§āϤ āύāϝāĻŧ sum. āĻŦāĻŋāĻļā§āώ āĻāϰā§, āϞā§āĻĒ āĻāĻžāϞāĻžāύā§āϰ āϏāĻŽāϝāĻŧ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻšāϝāĻŧ i и n.
āĻāϏāĻāϏāĻ āĻāĻāĻŦāĻžāϰ āϤāĻĨāĻžāĻāĻĨāĻŋāϤ āύāĻŋāϰā§āĻĻā§āĻļ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĒāϰāĻŋāĻŦāϰā§āϤāύāĻļā§āϞ āĻŽāĻžāύ āύāĻŋāϰā§āϧāĻžāϰāĻŖā§āϰ āϏā§āĻŽāĻžāĻŦāĻĻā§āϧāϤāĻžāĻā§ āĻŦāĻžāĻāĻĒāĻžāϏ āĻāϰ⧠phi (āĻāϰ āύāĻžāĻŽ āĻā§āϰā§āĻ āĻŦāϰā§āĻŖāĻŽāĻžāϞāĻž āĻĨā§āĻā§ āύā§āĻāϝāĻŧāĻž āĻšāϝāĻŧā§āĻā§)āĨ¤ āĻāϏāϞ āĻŦāĻŋāώāϝāĻŧāĻāĻŋ āĻšāϞ āϝ⧠āϏāĻŋ āĻāϰ āĻŽāϤ⧠āĻāĻžāώāĻžāϰ āĻāύā§āϝ āĻā§āĻĄā§āϰ āĻāϏāĻāϏāĻ āĻāĻĒāϏā§āĻĨāĻžāĻĒāύāĻž āϤā§āϰāĻŋ āĻāϰāĻžāϰ āĻāύā§āϝ, āĻāĻĒāύāĻžāĻā§ āĻāĻŋāĻā§ āĻā§āĻļāϞ āĻ
āĻŦāϞāĻŽā§āĻŦāύ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤ āĻāĻ āύāĻŋāϰā§āĻĻā§āĻļ āĻāϞ āĻāϰāĻžāϰ āĻĢāϞāĻžāĻĢāϞ āĻšāϞ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞā§āϰ āĻŦāϰā§āϤāĻŽāĻžāύ āĻŽāĻžāύ (i āĻŦāĻž n), āĻāĻŦāĻ āĻŽā§āϞāĻŋāĻ āĻŦā§āϞāĻāĻā§āϞāĻŋāϰ āĻāĻāĻāĻŋ āϤāĻžāϞāĻŋāĻāĻž āĻāϰ āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋ āĻšāĻŋāϏāĻžāĻŦā§ āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāϝāĻŧāĨ¤ āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻāĻ āύāĻŋāϰā§āĻĻā§āĻļ āĻŦāĻŋāĻŦā§āĻāύāĻž āĻāϰā§āύ:
t0 = phi [entry: 0:int, for.body: t6] #n āĻāϰ āĻ
āϰā§āĻĨ āύāĻŋāĻŽā§āύāϰā§āĻĒ: āϝāĻĻāĻŋ āĻĒā§āϰā§āĻŦāĻŦāϰā§āϤ⧠āĻŽā§āϞāĻŋāĻ āĻŦā§āϞāĻāĻāĻŋ āĻāĻāĻāĻŋ āĻŦā§āϞāĻ āĻāĻŋāϞ entry (āĻāύāĻĒā§āĻ), āϤāĻžāϰāĻĒāϰ t0 āĻāĻāĻāĻŋ āϧā§āϰā§āĻŦāĻ 0, āĻāĻŦāĻ āϝāĻĻāĻŋ āĻĒā§āϰā§āĻŦāĻŦāϰā§āϤ⧠āĻŽā§āϞāĻŋāĻ āĻŦā§āϞāĻ āĻāĻŋāϞ for.body, āϤāĻžāϰāĻĒāϰ āĻāĻĒāύāĻžāĻā§ āĻŽāĻžāύ āύāĻŋāϤ⧠āĻšāĻŦā§ t6 āĻāĻ āĻŦā§āϞāĻ āĻĨā§āĻā§ āĻāĻ āϏāĻŦ āĻŦā§āĻļ āϰāĻšāϏā§āϝāĻŽāϝāĻŧ āĻŽāύ⧠āĻšāϤ⧠āĻĒāĻžāϰā§, āĻāĻŋāύā§āϤ⧠āĻāĻ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āϝāĻž SSA āĻāĻžāĻ āĻāϰā§āĨ¤ āĻŽāĻžāύā§āώā§āϰ āĻĻā§āώā§āĻāĻŋāĻā§āĻŖ āĻĨā§āĻā§, āĻāĻ āϏāĻŦ āĻā§āĻĄ āĻŦā§āĻāĻž āĻāĻ āĻŋāύ āĻāϰ⧠āϤā§āϞā§, āĻāĻŋāύā§āϤ⧠āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻŽāĻžāύ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻāĻŦāĻžāϰ āĻŦāϰāĻžāĻĻā§āĻĻ āĻāϰāĻž āĻšāϝāĻŧ āϤāĻž āĻ
āύā§āĻ āĻ
āĻĒā§āĻāĻŋāĻŽāĻžāĻāĻā§āĻļāύāĻā§ āĻ
āύā§āĻ āϏāĻšāĻ āĻāϰ⧠āϤā§āϞā§āĨ¤
āĻŽāύ⧠āϰāĻžāĻāĻŦā§āύ āϝ⧠āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āύāĻŋāĻā§āϰ āĻāĻŽā§āĻĒāĻžāĻāϞāĻžāϰ āϞā§āĻā§āύ āϤāĻŦā§ āĻāĻĒāύāĻžāĻā§ āϏāĻžāϧāĻžāϰāĻŖāϤ āĻāĻ āϧāϰāĻŖā§āϰ āĻāĻŋāύāĻŋāϏā§āϰ āϏāĻžāĻĨā§ āĻŽā§āĻāĻžāĻŦāĻŋāϞāĻž āĻāϰāϤ⧠āĻšāĻŦā§ āύāĻžāĨ¤ āĻāĻŽāύāĻāĻŋ āĻāύāĻāύ āĻāĻ āϏāĻŽāϏā§āϤ āύāĻŋāϰā§āĻĻā§āĻļāύāĻž āϤā§āϰāĻŋ āĻāϰ⧠āύāĻž phi, āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠alloca (āĻāĻāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āϏā§āĻĨāĻžāύā§āϝāĻŧ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞā§āϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰāĻžāϰ āĻŽāϤā§)āĨ¤ āϤāĻžāϰāĻĒāϰ, āĻāĻāĻāĻŋ LLVM āĻ
āĻĒā§āĻāĻŋāĻŽāĻžāĻāĻā§āĻļāĻžāύ āĻĒāĻžāϏ āĻāĻžāϞāĻžāύā§āϰ āϏāĻŽāϝāĻŧ āĻŦāϞāĻž āĻšāϝāĻŧ , āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞ⧠alloca āĻāϏāĻāϏāĻ āĻĢāϰā§āĻŽā§ āϰā§āĻĒāĻžāύā§āϤāϰāĻŋāϤāĨ¤ 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) āĻāĻāĻāĻŋ āĻāĻžāĻ āĻžāĻŽā§ (struct) āĻšāĻŋāϏāĻžāĻŦā§, āĻāĻŋāύā§āϤ⧠āϤāĻŋāύāĻāĻŋ āĻĒā§āĻĨāĻ āϏāϤā§āϤāĻž āĻšāĻŋāϏāĻžāĻŦā§ āϤāĻžāĻĻā§āϰ āĻĒā§āϰāϤāĻŋāύāĻŋāϧāĻŋāϤā§āĻŦ āĻāĻŋāĻā§ āĻ
āĻĒā§āĻāĻŋāĻŽāĻžāĻāĻā§āĻļāύā§āϰ āĻāύā§āϝ āĻ
āύā§āĻŽāϤāĻŋ āĻĻā§āϝāĻŧāĨ¤ āϞāĻā§āώā§āϝ āĻĒā§āϞā§āϝāĻžāĻāĻĢāϰā§āĻŽā§āϰ āĻĢāĻžāĻāĻļāύā§āϰ āĻāϞāĻŋāĻ āĻāύāĻā§āύāĻļāύā§āϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻāϰ āĻāϰ⧠āĻ
āύā§āϝāĻžāύā§āϝ āĻāĻŽā§āĻĒāĻžāĻāϞāĻžāϰāϰāĻž āĻ
āύā§āϝāĻžāύā§āϝ āĻāĻĒāĻžāϝāĻŧā§ āϏā§āϞāĻžāĻāϏāĻā§ āĻāĻĒāϏā§āĻĨāĻžāĻĒāύ āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤
āĻāĻ āĻā§āĻĄā§āϰ āĻāϰā§āĻāĻāĻŋ āĻāĻāϰā§āώāĻŖā§āϝāĻŧ āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āĻšāϞ āύāĻŋāϰā§āĻĻā§āĻļā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ 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 āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻā§āύ?
āĻāϤā§āϏ: www.habr.com
