你正在使用的Go版本是什么(go version
)?
主线
go version devel +3470321 Tue Apr 24 15:26:21 2018 -0500 linux/amd64
你做了什么?
使用以下程序构建go:
package test
//go:noinline
func f(x ...interface{}) {
}
func g() {
var x string
f(&x)
}
在查看生成的代码时,我发现autotmp_1被零除,然后立即被覆盖
v27 00003 (8) XORPS X0, X0
v7 00004 (8) MOVUPS X0, "".x-32(SP)
v13 00005 (9) MOVUPS X0, ""..autotmp_1-16(SP) // zeroing
v23 00006 (9) LEAQ type.*string(SB), AX
v35 00007 (9) MOVQ AX, ""..autotmp_1-16(SP) // followed by 2 stores
v34 00008 (9) LEAQ "".x-32(SP), AX
v21 00009 (9) MOVQ AX, ""..autotmp_1-8(SP)
v36 00010 (9) LEAQ ""..autotmp_1-16(SP), AX
dse pass已经消除了死存储,包括零除,所以它也应该处理这种情况。
6条答案
按热度按时间niknxzdl1#
cc @mvdan,他最近对死库存密码进行了戳。
ghhkc1vu2#
@josharian 谢谢你的ping!很明显,我不会为1.11提交任何DSE内容 :)我会在冻结期间尝试让一些东西正常工作。Michael Munday住得很近,所以我可能会用啤酒贿赂他来帮助我在DSE上进行黑客攻击。
bxjv4tth3#
我昨天简要地提了一下这个问题。我认为(但不确定)这里有两个问题。
我把这个问题留给你们去解决。:)
weylhg0b4#
https://golang.org/cl/110121提到了这个问题:
cmd/compile: unwrap OpOffPtr during DSE
fnx2tebb5#
cc @mundaym
6l7fqoea6#
快速提示:当我在查看重现 #29892 时,我注意到
LocalAddr
和InlMark
操作没有被死存储传递特别处理,所以它会将它们视为加载(防止死存储被消除,如果它们的 mem 参数用作新操作之一的输入)。如果我们再次回顾死存储消除,可能值得修复。