go ``` cmd/compile: 消除更多的死存储 ```

xxslljrj  于 4个月前  发布在  Go
关注(0)|答案(6)|浏览(52)

你正在使用的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已经消除了死存储,包括零除,所以它也应该处理这种情况。

niknxzdl

niknxzdl1#

cc @mvdan,他最近对死库存密码进行了戳。

ghhkc1vu

ghhkc1vu2#

@josharian 谢谢你的ping!很明显,我不会为1.11提交任何DSE内容 :)我会在冻结期间尝试让一些东西正常工作。Michael Munday住得很近,所以我可能会用啤酒贿赂他来帮助我在DSE上进行黑客攻击。

bxjv4tth

bxjv4tth3#

我昨天简要地提了一下这个问题。我认为(但不确定)这里有两个问题。

  1. 清除一个[1]T与清除一个T。我认为Michael最近的结构体CL可能会有所帮助。我们应该检查一下。
  2. DSE需要相同的存储目标,就像相同的v.ID一样。但是分解会为每个分解引入新的OffPtr值。在DSE之前再次进行CSE可能会有帮助,但那也太大了。在DSE期间解包OffPtrs可能会做到这一点,或者让分解以某种方式进行实时CSE。
    我把这个问题留给你们去解决。:)
weylhg0b

weylhg0b4#

https://golang.org/cl/110121提到了这个问题:cmd/compile: unwrap OpOffPtr during DSE

6l7fqoea

6l7fqoea6#

快速提示:当我在查看重现 #29892 时,我注意到 LocalAddrInlMark 操作没有被死存储传递特别处理,所以它会将它们视为加载(防止死存储被消除,如果它们的 mem 参数用作新操作之一的输入)。如果我们再次回顾死存储消除,可能值得修复。

相关问题