你正在使用哪个版本的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版本中,产生的代码是一个裸返回,正如我最初所期望的那样。
4条答案
按热度按时间zd287kbt1#
这看起来像是添加的内联标记阻止了分支的移除。
在发生恐慌时,内联标记用于获取正确的回溯信息,即使存在内联。
在这种情况下,可能有一种方法可以移除不必要的内联标记。
jvlzgdj92#
Bisected to 69c2c56 , which makes sense.
dluptydi3#
可能相关的: #20354
aamkag614#
本期提到的代码已被c46ebec修复。
这是否应作为一个总问题继续开放?