LLVM αž–αžΈαž‘αžŸαŸ’αžŸαž“αŸˆ Go

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž…αž„αž€αŸ’αžšαž„αž‚αžΊαž‡αžΆαž€αž·αž…αŸ’αž…αž€αžΆαžšαžŠαŸαž›αŸ†αž”αžΆαž€αž˜αž½αž™αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‡αžΆαžŸαŸ†αžŽαžΆαž„αž›αŸ’αž’ αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž‚αž˜αŸ’αžšαŸ„αž„αžŠαžΌαž…αž‡αžΆ LLVM αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž…αŸ†αž–αŸ„αŸ‡αž”αž‰αŸ’αž αžΆαž“αŸαŸ‡αž‚αžΊαž˜αžΆαž“αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž™αŸ‰αžΆαž„αžαŸ’αž›αžΆαŸ†αž„ αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ‚αž˜αž½αž™αž’αžΆαž…αž”αž„αŸ’αž€αžΎαžαž—αžΆαžŸαžΆαžαŸ’αž˜αžΈαžŠαŸ‚αž›αž‡αž·αžαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‡αžΆαž˜αž½αž™ C. αž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ LLVM αž˜αžΆαž“αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αžŠαŸ„αž™αžŸαžΆαžšαž€αžΆαžšαž–αž·αžαž“αŸαŸ‡αŸ” αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžαŸ’αžšαžΌαžœαž”αžΆαž“αžαŸ†αžŽαžΆαž„αžŠαŸ„αž™αž…αŸ†αž“αž½αž“αžŠαŸαž…αŸ’αžšαžΎαž“αž“αŸƒαž›αŸαžαž€αžΌαžŠ αž”αŸ†αž–αžΆαž€αŸ‹αžŠαŸ„αž™αž―αž€αžŸαžΆαžšαžαž·αž…αžαž½αž…αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž–αŸ’αž™αžΆαž™αžΆαž˜αž€αŸ‚αžαž˜αŸ’αžšαžΌαžœαž…αŸ†αžŽαž»αž…αžαŸ’αžœαŸ‡αžαžΆαžαž“αŸαŸ‡ αž’αŸ’αž“αž€αž“αž·αž–αž“αŸ’αž’αž“αŸƒαžŸαž˜αŸ’αž—αžΆαžšαŸˆ αžŠαŸ‚αž›αž‡αžΆαž€αžΆαžšαž”αž€αž”αŸ’αžšαŸ‚αžŠαŸ‚αž›αž™αžΎαž„αž€αŸ†αž–αž»αž„αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αžαŸ’αž„αŸƒαž“αŸαŸ‡ αž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αžΌαžŠαžŠαŸ‚αž›αžŸαžšαžŸαŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„ Go αž“αž·αž„αž”αž„αŸ’αž αžΆαž‰αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž–αž½αž€αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž€αž”αŸ’αžšαŸ‚αž‡αžΆαž›αžΎαž€αžŠαŸ†αž”αžΌαž„αž‘αŸ…αž‡αžΆ αž‘αŸ… SSAαž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž“αŸ…αž€αŸ’αž“αž»αž„ LLVM IR αžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž…αž„αž€αŸ’αžšαž„ αžαžΌαž… GO. αž€αžΌαžŠ 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 frontend αž”αž“αŸ’αžαŸ‚αž˜αž‘αž„αŸ‹αž‘αŸ…αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαŸ” 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. αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž‚αžΊαž˜αž·αž“αž’αž˜αŸ’αž˜αžαžΆαž‘αŸ αž αžΎαž™αž’αžΆαž…αž…αŸ†αžŽαžΆαž™αž–αŸαž›αžαŸ’αž›αŸ‡αžŠαžΎαž˜αŸ’αž”αžΈαž™αž›αŸ‹αŸ” αž…αž„αž…αžΆαŸ†β€‹αžαžΆ αžŸαŸŠαžΈαŸ” αžŸαŸŠαžΈαŸ” ស៊ី αž‚αžΊαžαŸ’αž›αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ 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 αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ” αžαžΆαž˜αž‘αžŸαŸ’αžŸαž“αŸˆαžšαž”αžŸαŸ‹αž˜αž“αž»αžŸαŸ’αžŸ αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αž’αŸ’αžœαžΎαž±αŸ’αž™αž€αžΌαžŠαž–αž·αž”αžΆαž€αž™αž›αŸ‹ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αžΆαžšαž–αž·αžαžŠαŸ‚αž›αžαžΆαžαž˜αŸ’αž›αŸƒαž“αžΈαž˜αž½αž™αŸ—αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αžαŸ‚αž˜αž½αž™αžŠαž„αž’αŸ’αžœαžΎαž±αŸ’αž™αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž‡αžΆαž…αŸ’αžšαžΎαž“αž€αžΆαž“αŸ‹αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž›αŸ”

αž…αŸ†αžŽαžΆαŸ†αžαžΆαž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž…αž„αž€αŸ’αžšαž„αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆ αž’αŸ’αž“αž€αž“αžΉαž„αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‡αžΆαž˜αž½αž™αžšαžΏαž„αž”αŸ’αžšαž—αŸαž‘αž“αŸαŸ‡αž‘αŸαŸ” αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚ Clang αž€αŸαž˜αž·αž“αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αžŠαŸ‚αžšαŸ” phiαžœαžΆαž”αŸ’αžšαžΎαž™αž“αŸ’αžαž€αžΆαžšαž˜αž½αž™αŸ” alloca (αžœαžΆαž”αŸ’αžšαž αžΆαž€αŸ‹αž”αŸ’αžšαž αŸ‚αž›αž“αžΉαž„αž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž’αžαŸαžšαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž’αž˜αŸ’αž˜αžαžΆ)αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš LLVM optimization pass αž αŸ…αžαžΆ 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) αž‡αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ (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 αž˜αŸ‚αž“αž‘αŸ?

LLVM αž–αžΈαž‘αžŸαŸ’αžŸαž“αŸˆ Go

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹