golang(cgo)コンパイラのcopyelim最適化パスについて
golangコンパイラの処理系のcgoコンパイラの最適化パスを適当に解説していく記事です。
今回は、copy eliminationです。copy 駆除(削除)ですね。
たぶん、以下を持って助長だと判断して、elimするようです。
a = b;c = a;
だと思います。
c = b
でいいよね。たぶん。
COPY
opのCOPYってのは、型変換みたいなmov命令系のことだと思います。
機械語を吐く、以下のコードから推測しました。
ちなみに、レジスタが同じだったら、そもそも機械語を吐かないことになってますね。
case ssa.OpCopy: // TODO: use MOVLreg for reg->reg copies instead of OpCopy?
if v.Type.IsMemory() {
return
}
x := v.Args[0].Reg()
y := v.Reg()
if x != y {
opregreg(s, x86.AMOVL, y, x)
}
cgo
肝心の処理系のコードですが、説明むずかしいので、ほぼ無しです
めっちゃ適宜コード削除しているので、しっかり読みたい方は、本家を見ましょう。
go/copyelim.go at master · golang/go · GitHub
func copyelim(f *Func) {
//すべてのvalueの引数(arg)の0番目のopがCOPYだったら、wに入れて、そして、wをvの引数に戻す。
//a = b;c = a; が c = bになる感じだと思います多分。
//コピーが入れ子になってるから、浅くしようね。といった感じです。
for _, b := range f.Blocks {
for _, v := range b.Values {
w := v.Args[0]
//適宜書き換えたので、無限ループになっちゃう感じだけど、
//forじゃなくてifの方がわかりやすいかもしれない
for w.Op == OpCopy {
w = w.Args[0]
}
for v != w {
x := v.Args[0]
v.SetArg(0, w)
v = x
}
}
}
}