go cmd/compile:移除不必要的内联标记

c6ubokkw  于 5个月前  发布在  Go
关注(0)|答案(4)|浏览(43)

你正在使用哪个版本的Go(go version)?

$ go version
go version devel +c4f87ed Tue Mar 26 02:20:09 2019 +0000 linux/amd64

这个问题在最新版本中是否会重现?

是的

你做了什么?

我正在尝试编译器,看看在各种情况下它会产生什么样的代码。经过一段时间的测试后,我发现了这样一个情况,产生的代码有点奇怪:

package test

func test1() {
    return
}

func test2(k *int) {
    if k == nil {
        test1()
    }
}

你期望看到什么?

我期望test2函数能够编译成一个简单的返回。

你看到了什么?

相反,以下代码被生成了(注意奇怪的双重跳转):

movq"".k+8(SP),AX
pcdata  $2, $0
testq   AX,AX
jeq     test2_pc11
test2_pc10:
pcdata  $2,$-2
pcdata  $0,$-2
ret
test2_pc11:
pcdata  $2, $0
pcdata  $0, $1
xchgl   AX,AX
jmptest2_pc10

在go1.11版本中,产生的代码是一个裸返回,正如我最初所期望的那样。

zd287kbt

zd287kbt1#

这看起来像是添加的内联标记阻止了分支的移除。
在发生恐慌时,内联标记用于获取正确的回溯信息,即使存在内联。
在这种情况下,可能有一种方法可以移除不必要的内联标记。

jvlzgdj9

jvlzgdj92#

Bisected to 69c2c56 , which makes sense.

aamkag61

aamkag614#

本期提到的代码已被c46ebec修复。
这是否应作为一个总问题继续开放?

相关问题