เช—เซ‹ เชชเชฐเชฟเชชเซเชฐเซ‡เช•เซเชทเซเชฏเชฎเชพเช‚ เชเชฒเชเชฒเชตเซ€เชเชฎ

เช•เชฎเซเชชเชพเชˆเชฒเชฐ เชกเซ‡เชตเชฒเชช เช•เชฐเชตเซเช‚ เช เช–เซ‚เชฌ เชœ เชฎเซเชถเซเช•เซ‡เชฒ เช•เชพเชฐเซเชฏ เช›เซ‡. เชชเชฐเช‚เชคเซ, เชธเชฆเชญเชพเช—เซเชฏเซ‡, LLVM เชœเซ‡เชตเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเชพ เชตเชฟเช•เชพเชธ เชธเชพเชฅเซ‡, เช† เชธเชฎเชธเซเชฏเชพเชจเซ‹ เช‰เช•เซ‡เชฒ เช–เซ‚เชฌ เชœ เชธเชฐเชณ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เช›เซ‡, เชœเซ‡ เชเช• เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฐเชจเซ‡ เชเช• เชจเชตเซ€ เชญเชพเชทเชพ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡ เชœเซ‡ C เชจเซ€ เชจเชœเซ€เช• เชนเซ‹เชฏ. LLVM เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเซเช‚ เช เชนเช•เซ€เช•เชค เชฆเซเชตเชพเชฐเชพ เชœเชŸเชฟเชฒ เช›เซ‡ เช•เซ‡ เช† เชธเชฟเชธเซเชŸเชฎเชจเซ‡ เช•เซ‹เชกเชจเซ€ เชตเชฟเชถเชพเชณ เชฎเชพเชคเซเชฐเชพ เชฆเซเชตเชพเชฐเชพ เชฐเชœเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชœเซ‡ เช“เช›เชพ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ‹เชฅเซ€ เชธเชœเซเชœ เช›เซ‡. เช† เช–เชพเชฎเซ€เชจเซ‡ เชธเซเชงเชพเชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชธเชพเชฎเช—เซเชฐเซ€เชจเชพ เชฒเซ‡เช–เช•, เชœเซ‡เชจเซ‹ เช…เชจเซเชตเชพเชฆ เช…เชฎเซ‡ เช†เชœเซ‡ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช, เชคเซ‡ Go เชฎเชพเช‚ เชฒเช–เซ‡เชฒเชพ เช•เซ‹เชกเชจเชพ เช‰เชฆเชพเชนเชฐเชฃเซ‹ เชฆเชฐเซเชถเชพเชตเชตเชพ เชœเชˆ เชฐเชนเซเชฏเชพ เช›เซ‡ เช…เชจเซ‡ เชฌเชคเชพเชตเชถเซ‡ เช•เซ‡ เชคเซ‡เชจเซ‹ เชชเซเชฐเชฅเชฎ เช…เชจเซเชตเชพเชฆ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. SSA เชœเชพเช“, เช…เชจเซ‡ เชชเช›เซ€ เช•เชฎเซเชชเชพเช‡เชฒเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ LLVM IR เชฎเชพเช‚ เชŸเชฟเชจเซ€เช—เซ‹. 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 เชจเชพ เชเช• เชชเชพเชธเชพเชจเซ‹ เชธเชพเชฐ เชœเซ‹เชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡. เชœเซ‡เชฎ เช•เซ‡, เช•เซ‹เชกเชจเซ‡ 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 เช•เซ‹เชก เช—เซ‹ SSA เช•เซ‹เชก เช•เชฐเชคเชพเช‚ เชฅเซ‹เชกเซ‹ เชฎเชœเชฌเซ‚เชค เช›เซ‡, C เชœเซ‡เชตเซ‹ เชœ เช›เซ‡. เช…เชนเซ€เช‚, เชซเช‚เช•เซเชถเชจ เชกเชฟเช•เซเชฒเซ‡เชฐเซ‡เชถเชจเชฎเชพเช‚, เชชเชนเซ‡เชฒเชพ เชกเซ‡เชŸเชพ เชชเซเชฐเช•เชพเชฐเชจเซเช‚ เชตเชฐเซเชฃเชจ เช›เซ‡ เชœเซ‡ เชคเซ‡ เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡, เชฆเชฒเซ€เชฒเชจเชพ เชจเชพเชฎ เชชเชนเซ‡เชฒเชพเช‚ เชฆเชฒเซ€เชฒเชจเซ‹ เชชเซเชฐเช•เชพเชฐ เชฆเชฐเซเชถเชพเชตเซ‡เชฒ เช›เซ‡. เชตเชงเซเชฎเชพเช‚, IR เชชเชฆเชšเซเช›เซ‡เชฆเชจเชจเซ‡ เชธเชฐเชณ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชตเซˆเชถเซเชตเชฟเช• เชธเช‚เชธเซเชฅเชพเช“เชจเชพ เชจเชพเชฎ เชชเซเชฐเชคเซ€เช•เชจเซ€ เช†เช—เชณ เช†เชตเซ‡ เช›เซ‡. @, เช…เชจเซ‡ เชธเซเชฅเชพเชจเชฟเช• เชจเชพเชฎเซ‹ เชชเชนเซ‡เชฒเชพเช‚ เชเช• เชชเซเชฐเชคเซ€เช• เช›เซ‡ % (เชเช• เช•เชพเชฐเซเชฏเชจเซ‡ เชตเซˆเชถเซเชตเชฟเช• เชเชจเซเชŸเชฟเชŸเซ€ เชชเชฃ เช—เชฃเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡).

เช† เช•เซ‹เชก เชตเชฟเชถเซ‡ เชจเซ‹เช‚เชง เชฒเซ‡เชตเชพ เชœเซ‡เชตเซ€ เชฌเชพเชฌเชค เช เช›เซ‡ เช•เซ‡ เช—เซ‹เชจเซ‹ เชชเซเชฐเช•เชพเชฐ เชชเซเชฐเชคเชฟเชจเชฟเชงเชฟเชคเซเชต เชจเชฟเชฐเซเชฃเชฏ int, เชœเซ‡ เช•เชฎเซเชชเชพเช‡เชฒเชฐ เช…เชจเซ‡ เชธเช‚เช•เชฒเชจเชจเชพ เชฒเช•เซเชทเซเชฏเชจเชพ เช†เชงเชพเชฐเซ‡ 32-เชฌเซ€เชŸ เช…เชฅเชตเชพ 64-เชฌเซ€เชŸ เชฎเซ‚เชฒเซเชฏ เชคเชฐเซ€เช•เซ‡ เชฐเชœเซ‚ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชœเซเชฏเชพเชฐเซ‡ LLVM IR เช•เซ‹เชก เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡ เชคเซเชฏเชพเชฐเซ‡ เชธเซเชตเซ€เช•เชพเชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. LLVM IR เช•เซ‹เชก เชจ เชนเซ‹เชตเชพเชจเชพ เช˜เชฃเชพ เช•เชพเชฐเชฃเซ‹ เชชเซˆเช•เซ€ เช† เชเช• เช›เซ‡, เชœเซ‡เชฎ เช•เซ‡ เช˜เชฃเชพ เชฒเซ‹เช•เซ‹ เชตเชฟเชšเชพเชฐเซ‡ เช›เซ‡, เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎ เชธเซเชตเชคเช‚เชคเซเชฐ เช›เซ‡. เช†เชตเซ‹ เช•เซ‹เชก, เชเช• เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎ เชฎเชพเชŸเซ‡ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เช›เซ‡, เชคเซ‡เชจเซ‡ เชฌเซ€เชœเชพ เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎ เชฎเชพเชŸเซ‡ เชธเชฐเชณเชคเชพเชฅเซ€ เชฒเชˆ เช…เชจเซ‡ เช•เชฎเซเชชเชพเชˆเชฒ เช•เชฐเซ€ เชถเช•เชพเชคเซ‹ เชจเชฅเซ€ (เชœเซเชฏเชพเช‚ เชธเซเชงเซ€ เชคเชฎเซ‡ เช† เชธเชฎเชธเซเชฏเชพเชจเซ‡ เช‰เช•เซ‡เชฒเชตเชพ เชฎเชพเชŸเซ‡ เชฏเซ‹เช—เซเชฏ เชจ เชนเซ‹เชต. เช…เชคเซเชฏเช‚เชค เช•เชพเชณเชœเซ€ เชธเชพเชฅเซ‡).

เชจเซ‹เช‚เชงเชตเชพ เชฏเซ‹เช—เซเชฏ เช…เชจเซเชฏ เชฐเชธเชชเซเชฐเชฆ เชฎเซเชฆเซเชฆเซ‹ เช เช›เซ‡ เช•เซ‡ เชชเซเชฐเช•เชพเชฐ i64 เชธเชพเช‡เชจ เช•เชฐเซ‡เชฒ เชชเซ‚เชฐเซเชฃเชพเช‚เช• เชจเชฅเซ€: เชคเซ‡ เชธเช‚เช–เซเชฏเชพเชจเชพ เชšเชฟเชนเซเชจเชจเซ‡ เชฐเชœเซ‚ เช•เชฐเชตเชพเชจเชพ เชธเช‚เชฆเชฐเซเชญเชฎเชพเช‚ เชคเชŸเชธเซเชฅ เช›เซ‡. เชธเซ‚เชšเชจเชพเชจเชพ เช†เชงเชพเชฐเซ‡, เชคเซ‡ เชธเชนเซ€ เช•เชฐเซ‡เชฒ เช…เชจเซ‡ เชธเชนเซ€ เชจ เช•เชฐเซ‡เชฒ เชฌเช‚เชจเซ‡ เชจเช‚เชฌเชฐเซ‹เชจเซเช‚ เชชเซเชฐเชคเชฟเชจเชฟเชงเชฟเชคเซเชต เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡. เช‰เชฎเซ‡เชฐเชฃ เช•เชพเชฎเช—เซ€เชฐเซ€เชจเซ€ เชฐเชœเซ‚เช†เชคเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เช† เช•เซ‹เชˆ เชตเชพเช‚เชงเซ‹ เชจเชฅเซ€, เชคเซ‡เชฅเซ€ เชธเชนเซ€ เช•เชฐเซ‡เชฒ เช…เชฅเชตเชพ เชธเชนเซ€ เชจ เช•เชฐเซ‡เชฒ เชจเช‚เชฌเชฐเซ‹ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพเชฎเชพเช‚ เช•เซ‹เชˆ เชคเชซเชพเชตเชค เชจเชฅเซ€. เช…เชนเซ€เช‚ เชนเซเช‚ เชจเซ‹เช‚เชงเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚ เช•เซ‡ C เชญเชพเชทเชพเชฎเชพเช‚, เชธเชพเช‡เชจ เช•เชฐเซ‡เชฒ เชชเซ‚เชฐเซเชฃเชพเช‚เช• เชšเชฒเชจเซ‡ เช“เชตเชฐเชซเซเชฒเซ‹ เช•เชฐเชตเชพเชฅเซ€ เช…เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เชตเชฐเซเชคเชจ เชคเชฐเชซ เชฆเซ‹เชฐเซ€ เชœเชพเชฏ เช›เซ‡, เชคเซ‡เชฅเซ€ เช•เซเชฒเซ‡เช‚เช— เชซเซเชฐเชจเซเชŸเชเชจเซเชก เช“เชชเชฐเซ‡เชถเชจเชฎเชพเช‚ เชงเซเชตเชœ เช‰เชฎเซ‡เชฐเซ‡ เช›เซ‡. nsw (เช•เซ‹เชˆ เชธเชนเซ€ เช•เชฐเซ‡เชฒ เชฒเชชเซ‡เชŸเซ€ เชจเชฅเซ€), เชœเซ‡ เชเชฒเชเชฒเชตเซ€เชเชฎเชจเซ‡ เช•เชนเซ‡ เช›เซ‡ เช•เซ‡ เชคเซ‡ เชฎเชพเชจเซ€ เชถเช•เซ‡ เช›เซ‡ เช•เซ‡ เช‰เชฎเซ‡เชฐเชฃ เช•เซเชฏเชพเชฐเซ‡เชฏ เช“เชตเชฐเชซเซเชฒเซ‹ เชฅเชคเซเช‚ เชจเชฅเซ€.

เช•เซ‡เชŸเชฒเชพเช• เช‘เชชเซเชŸเชฟเชฎเชพเช‡เชเซ‡เชถเชจ เชฎเชพเชŸเซ‡ เช† เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชฌเซ‡ เชฎเซ‚เชฒเซเชฏเซ‹ เช‰เชฎเซ‡เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ‡ i16 32-เชฌเซ€เชŸ เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎ เชชเชฐ (32-เชฌเซ€เชŸ เชฐเชœเชฟเชธเซเชŸเชฐ เชธเชพเชฅเซ‡) เชถเซเชฐเซ‡เชฃเซ€เชฎเชพเช‚ เชฐเชนเซ‡เชตเชพ เชฎเชพเชŸเซ‡, เชตเชงเชพเชฐเชพ เชชเช›เซ€, เชธเชพเช‡เชจ เชตเชฟเชธเซเชคเชฐเชฃ เช•เชพเชฎเช—เซ€เชฐเซ€เชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ i16. เช†เชจเซ‡ เช•เชพเชฐเชฃเซ‡, เชฎเชถเซ€เชจ เชฐเชœเชฟเชธเซเชŸเชฐเชจเชพ เช•เชฆเชจเชพ เช†เชงเชพเชฐเซ‡ เชชเซ‚เชฐเซเชฃเชพเช‚เช• เช•เซเชฐเชฟเชฏเชพเช“ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเซ‡ เช˜เชฃเซ€เชตเชพเชฐ เชตเชงเซ เช•เชพเชฐเซเชฏเช•เซเชทเชฎ เชนเซ‹เชฏ เช›เซ‡.

เช† IR เช•เซ‹เชก เชธเชพเชฅเซ‡ เช†เช—เชณ เชถเซเช‚ เชฅเชพเชฏ เช›เซ‡ เชคเซ‡ เชนเชตเซ‡ เช…เชฎเชจเซ‡ เช–เชพเชธ เชฐเชธ เชจเชฅเซ€. เช•เซ‹เชก เช‘เชชเซเชŸเชฟเชฎเชพเช‡เช เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ (เชชเชฐเช‚เชคเซ เช…เชฎเชพเชฐเชพ เชœเซ‡เชตเชพ เชธเชฐเชณ เช‰เชฆเชพเชนเชฐเชฃเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เช•เชถเซเช‚ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เช เชฅเชคเซเช‚ เชจเชฅเซ€) เช…เชจเซ‡ เชชเช›เซ€ เชฎเชถเซ€เชจ เช•เซ‹เชกเชฎเชพเช‚ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฟเชค เชฅเชพเชฏ เช›เซ‡.

เชฌเซ€เชœเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ

เช†เช—เชณเชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เช†เชชเชฃเซ‡ เชœเซ‹เชˆเชถเซเช‚ เชคเซ‡ เชฅเซ‹เชกเซเช‚ เชตเชงเซ เชœเชŸเชฟเชฒ เชนเชถเซ‡. เชœเซ‡เชฎ เช•เซ‡, เช…เชฎเซ‡ เชเชตเชพ เชซเช‚เช•เซเชถเชจ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช เชœเซ‡ เชชเซ‚เชฐเซเชฃเชพเช‚เช•เซ‹เชจเชพ เชŸเซเช•เชกเชพเชจเซ‹ เชธเชฐเชตเชพเชณเซ‹ เช•เชฐเซ‡ เช›เซ‡:

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

เช† เช•เซ‹เชก เชจเซ€เชšเซ‡เชจเชพ Go SSA เช•เซ‹เชกเชฎเชพเช‚ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฟเชค เชฅเชพเชฏ เช›เซ‡:

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

เช…เชนเซ€เช‚ เชคเชฎเซ‡ เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ SSA เชซเซ‹เชฐเซเชฎเชฎเชพเช‚ เช•เซ‹เชก เชฐเชœเซ‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฒเชพเช•เซเชทเชฃเชฟเช• เชตเชงเซ เชฌเชพเช‚เชงเช•เชพเชฎเซ‹ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹. เช•เชฆเชพเชš เช† เช•เซ‹เชกเชจเซ€ เชธเซŒเชฅเซ€ เชธเซเชชเชทเซเชŸ เชตเชฟเชถเซ‡เชทเชคเชพ เช เชนเช•เซ€เช•เชค เช›เซ‡ เช•เซ‡ เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เชฎเชพเชณเช–เชพเช—เชค เชชเซเชฐเชตเชพเชน เชจเชฟเชฏเช‚เชคเซเชฐเชฃ เช†เชฆเซ‡เชถเซ‹ เชจเชฅเซ€. เช—เชฃเชคเชฐเซ€เช“เชจเชพ เชชเซเชฐเชตเชพเชนเชจเซ‡ เชจเชฟเชฏเช‚เชคเซเชฐเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเซเชฏเชพเช‚ เชฎเชพเชคเซเชฐ เชถเชฐเชคเซ€ เช…เชจเซ‡ เชฌเชฟเชจเชถเชฐเชคเซ€ เช•เซ‚เชฆเช•เชพ เช›เซ‡, เช…เชจเซ‡, เชœเซ‹ เช†เชชเชฃเซ‡ เช† เช†เชฆเซ‡เชถเชจเซ‡ เชชเซเชฐเชตเชพเชนเชจเซ‡ เชจเชฟเชฏเช‚เชคเซเชฐเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเชพ เช†เชฆเซ‡เชถ เชคเชฐเซ€เช•เซ‡ เช—เชฃเซ€เช, เชคเซ‹ เชตเชณเชคเชฐ เช†เชฆเซ‡เชถ.

เชนเช•เซ€เช•เชคเชฎเชพเช‚, เช…เชนเซ€เช‚ เชคเชฎเซ‡ เช เชนเช•เซ€เช•เชค เชชเชฐ เชงเซเชฏเชพเชจ เช†เชชเซ€ เชถเช•เซ‹ เช›เซ‹ เช•เซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชธเชฐเซเชชเชพเช•เชพเชฐ เช•เซŒเช‚เชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฌเซเชฒเซ‹เช•เซเชธเชฎเชพเช‚ เชตเชฟเชญเชพเชœเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชจเชฅเซ€ (เชœเซ‡เชฎ เช•เซ‡ เชญเชพเชทเชพเช“เชจเชพ C เชชเชฐเชฟเชตเชพเชฐเชฎเชพเช‚). เชคเซ‡ เชฒเซ‡เชฌเชฒเซเชธ เชฆเซเชตเชพเชฐเชพ เชตเชฟเชญเชพเชœเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชœเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เชญเชพเชทเชพเช“เชจเซ€ เชฏเชพเชฆ เช…เชชเชพเชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เชฎเซ‚เชณเชญเซ‚เชค เชฌเซเชฒเซ‹เช•เซเชธเชจเชพ เชธเซเชตเชฐเซ‚เชชเชฎเชพเช‚ เชฐเชœเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. SSA เชฎเชพเช‚, เชฎเซ‚เชณเชญเซ‚เชค เชฌเซเชฒเซ‹เช•เซเชธเชจเซ‡ เช•เซ‹เชกเชจเชพ เชธเช‚เชฒเช—เซเชจ เช•เซเชฐเชฎ เชคเชฐเซ€เช•เซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เชœเซ‡ เชฒเซ‡เชฌเชฒเชฅเซ€ เชถเชฐเซ‚ เชฅเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เชฎเซ‚เชณเชญเซ‚เชค เชฌเซเชฒเซ‹เช• เชชเซ‚เชฐเซเชฃเชคเชพ เชธเซ‚เชšเชจเซ‹ เชธเชพเชฅเซ‡ เชธเชฎเชพเชชเซเชค เชฅเชพเชฏ เช›เซ‡, เชœเซ‡เชฎ เช•เซ‡ โˆ’ return ะธ jump.

เช† เช•เซ‹เชกเชจเซ€ เชฌเซ€เชœเซ€ เชฐเชธเชชเซเชฐเชฆ เชตเชฟเช—เชค เชธเซ‚เชšเชจเชพ เชฆเซเชตเชพเชฐเชพ เชฐเชœเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡ phi. เชธเซ‚เชšเชจเชพเช“ เชคเชฆเซเชฆเชจ เช…เชธเชพเชฎเชพเชจเซเชฏ เช›เซ‡ เช…เชจเซ‡ เชธเชฎเชœเชตเชพเชฎเชพเช‚ เชฅเซ‹เชกเซ‹ เชธเชฎเชฏ เชฒเชพเช—เซ€ เชถเช•เซ‡ เช›เซ‡. เชฏเชพเชฆ เชฐเชพเช–เซ‹, เช•เซ‡ เชเชธ.เชเชธ.เช. เชธเซเชŸเซ‡เชŸเชฟเช• เชธเชฟเช‚เช—เชฒ เช…เชธเชพเช‡เชจเชฎเซ‡เชจเซเชŸ เชฎเชพเชŸเซ‡ เชŸเซ‚เช‚เช•เซเช‚ เช›เซ‡. เช† เช•เชฎเซเชชเชพเช‡เชฒเชฐเซเชธ เชฆเซเชตเชพเชฐเชพ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ‡เชตเชพเชคเชพ เช•เซ‹เชกเชจเซเช‚ เชฎเชงเซเชฏเชตเชฐเซเชคเซ€ เชชเซเชฐเชคเชฟเชจเชฟเชงเชฟเชคเซเชต เช›เซ‡, เชœเซ‡เชฎเชพเช‚ เชฆเชฐเซ‡เช• เชšเชฒเชจเซ‡ เชฎเชพเชคเซเชฐ เชเช• เชœ เชตเชพเชฐ เชฎเซ‚เชฒเซเชฏ เช…เชธเชพเช‡เชจ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช…เชฎเชพเชฐเชพ เชซเช‚เช•เซเชถเชจ เชœเซ‡เชตเชพ เชธเชฐเชณ เช•เชพเชฐเซเชฏเซ‹เชจเซ‡ เชตเซเชฏเช•เซเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช† เชธเชฐเชธ เช›เซ‡ myAddเช‰เชชเชฐ เชฌเชคเชพเชตเซ‡เชฒ เช›เซ‡, เชชเชฐเช‚เชคเซ เชตเชงเซ เชœเชŸเชฟเชฒ เช•เชพเชฐเซเชฏเซ‹ เชฎเชพเชŸเซ‡ เชฏเซ‹เช—เซเชฏ เชจเชฅเซ€ เชœเซ‡เชฎ เช•เซ‡ เช† เชตเชฟเชญเชพเช—เชฎเชพเช‚ เชšเชฐเซเชšเชพ เช•เชฐเซ‡เชฒ เช•เชพเชฐเซเชฏ sum. เช–เชพเชธ เช•เชฐเซ€เชจเซ‡, เชฒเซ‚เชชเชจเชพ เช…เชฎเชฒ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชšเชฒเซ‹ เชฌเชฆเชฒเชพเชฏ เช›เซ‡ i ะธ n.

เชเชธเชเชธเช เช•เชนเซ‡เชตเชพเชคเซ€ เชธเซ‚เชšเชจเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชเช•เชตเชพเชฐ เชšเชฒ เชฎเซ‚เชฒเซเชฏเซ‹ เชธเซ‹เช‚เชชเชตเชพ เชชเชฐเชจเชพ เชชเซเชฐเชคเชฟเชฌเช‚เชงเชจเซ‡ เชฌเชพเชฏเชชเชพเชธ เช•เชฐเซ‡ เช›เซ‡ phi (เชคเซ‡เชจเซเช‚ เชจเชพเชฎ เช—เซเชฐเซ€เช• เชฎเซ‚เชณเชพเช•เซเชทเชฐเซ‹ เชชเชฐเชฅเซ€ เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡). เชนเช•เซ€เช•เชค เช เช›เซ‡ เช•เซ‡ C เชœเซ‡เชตเซ€ เชญเชพเชทเชพเช“ เชฎเชพเชŸเซ‡ เช•เซ‹เชกเชจเซ€ SSA เชฐเชœเซ‚เช†เชค เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เช•เซ‡เชŸเชฒเซ€เช• เชฏเซเช•เซเชคเชฟเช“เชจเซ‹ เช†เชถเชฐเซ‹ เชฒเซ‡เชตเซ‹ เชชเชกเชถเซ‡. เช† เชธเซ‚เชšเชจเชพเชจเซ‡ เช•เซ‰เชฒ เช•เชฐเชตเชพเชจเซเช‚ เชชเชฐเชฟเชฃเชพเชฎ เช เชšเชฒเชจเซเช‚ เชตเชฐเซเชคเชฎเชพเชจ เชฎเซ‚เชฒเซเชฏ เช›เซ‡ (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 เชจเซ€ เชธเซŒเชฅเซ€ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เชตเชฟเชถเซ‡เชทเชคเชพเช“เชจเซ‡ เช†เชตเชฐเซ€ เชฒเซ€เชงเซ€ เช›เซ‡. เช…เชฒเชฌเชคเซเชค, เช…เชนเซ€เช‚ เช˜เชฃเซเช‚ เชฌเชงเซเช‚ เช›เซ‡. เช–เชพเชธ เช•เชฐเซ€เชจเซ‡, เช•เซ‹เชกเชจเซ€ เชฎเชงเซเชฏเชตเชฐเซเชคเซ€ เชฐเชœเซ‚เช†เชคเชฎเชพเช‚ เช˜เชฃเซ€ เชŸเซ€เช•เชพเช“ เชถเชพเชฎเซ‡เชฒ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡ เชœเซ‡ เช“เชชเซเชŸเชฟเชฎเชพเช‡เชเซ‡เชถเชจ เชชเชพเชธเชจเซ‡ เช•เชฎเซเชชเชพเช‡เชฒเชฐเชจเซ‡ เชœเชพเชฃเซ€เชคเชพ เช•เซ‹เชกเชจเซ€ เช•เซ‡เชŸเชฒเซ€เช• เชตเชฟเชถเซ‡เชทเชคเชพเช“เชจเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ‡เชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡ เชœเซ‡ เช…เชจเซเชฏเชฅเชพ IR เชฎเชพเช‚ เชตเซเชฏเช•เซเชค เช•เชฐเซ€ เชถเช•เชพเชคเซ€ เชจเชฅเซ€. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช† เชเช• เชงเซเชตเชœ เช›เซ‡ inbounds GEP เชธเซ‚เชšเชจเชพเช“ เช…เชฅเชตเชพ เชงเซเชตเชœ nsw ะธ nuw, เชœเซ‡ เชธเซ‚เชšเชจเชพเช“เชฎเชพเช‚ เช‰เชฎเซ‡เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡ add. เชคเซ‡ เชœ เช•เซ€เชตเชฐเซเชก เชฎเชพเชŸเซ‡ เชœเชพเชฏ เช›เซ‡ private, เช‘เชชเซเชŸเชฟเชฎเชพเช‡เชเชฐเชจเซ‡ เชธเซ‚เชšเชตเซ‡ เช›เซ‡ เช•เซ‡ เชคเซ‡ เชœเซ‡ เช•เชพเชฐเซเชฏเชจเซ‡ เชšเชฟเชนเซเชจเชฟเชค เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡ เชตเชฐเซเชคเชฎเชพเชจ เชธเช‚เช•เชฒเชจ เชเช•เชฎเชจเซ€ เชฌเชนเชพเชฐเชฅเซ€ เชธเช‚เชฆเชฐเซเชญเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เชจเชนเซ€เช‚. เช† เชจ เชตเชชเชฐเชพเชฏเซ‡เชฒ เชฆเชฒเซ€เชฒเซ‹เชจเซ‡ เชฆเซ‚เชฐ เช•เชฐเชตเชพ เชœเซ‡เชตเชพ เช˜เชฃเชพ เชฐเชธเชชเซเชฐเชฆ เช†เช‚เชคเชฐเชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช•เซ€เชฏ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เชเซ‡เชถเชจ เชฎเชพเชŸเซ‡ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ‡ เช›เซ‡.

เชคเชฎเซ‡ LLVM เชตเชฟเชถเซ‡ เชตเชงเซ เชตเชพเช‚เชšเซ€ เชถเช•เซ‹ เช›เซ‹ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ, เชœเซ‡เชจเซ‹ เชคเชฎเซ‡ เชคเชฎเชพเชฐเชพ เชชเซ‹เชคเชพเชจเชพ LLVM-เช†เชงเชพเชฐเชฟเชค เช•เชฎเซเชชเชพเชˆเชฒเชฐเชจเซ‹ เชตเชฟเช•เชพเชธ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เชตเชพเชฐเช‚เชตเชพเชฐ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเชถเซ‹. เช…เชนเซ€เช‚ เชจเซ‡เชคเซƒเชคเซเชต, เชœเซ‡ เช–เซ‚เชฌ เชœ เชธเชฐเชณ เชญเชพเชทเชพ เชฎเชพเชŸเซ‡ เช•เชฎเซเชชเชพเชˆเชฒเชฐ เชตเชฟเช•เชธเชพเชตเชตเชพ เชคเชฐเชซ เชœเซเช เช›เซ‡. เชคเชฎเชพเชฐเซเช‚ เชชเซ‹เชคเชพเชจเซเช‚ เช•เชฎเซเชชเชพเชˆเชฒเชฐ เชฌเชจเชพเชตเชคเซ€ เชตเช–เชคเซ‡ เชฎเชพเชนเชฟเชคเซ€เชจเชพ เช† เชฌเช‚เชจเซ‡ เชธเซเชคเซเชฐเซ‹เชค เชคเชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เช‰เชชเชฏเซ‹เช—เซ€ เชฅเชถเซ‡.

เชชเซเชฐเชฟเชฏ เชตเชพเชšเช•เซ‹! เชถเซเช‚ เชคเชฎเซ‡ LLVM เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹ เช›เซ‹?

เช—เซ‹ เชชเชฐเชฟเชชเซเชฐเซ‡เช•เซเชทเซเชฏเชฎเชพเช‚ เชเชฒเชเชฒเชตเซ€เชเชฎ

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹