请在提交问题之前回答以下问题。谢谢!
您正在使用的Go版本是什么(go version
)?
go version go1.10.2 linux/amd64
最新版本的此问题是否会重现?
是的
您正在使用什么操作系统和处理器架构(go env
)?
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/nabice/.cache/go-build"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/nabice/go:/home/nabice/skygo/go"
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build010669814=/tmp/go-build -gno-record-gcc-switches"
您做了什么?
Package: golang.org/x/tools/go/ssa
ok.Referrers 不包含 Ifstmt
https://play.golang.org/p/wkERfEjeSu1
我发现它在这里被替换了:
https://github.com/golang/tools/blob/e10d6c9a84802dced65cb0278773be159bb7ed07/go/ssa/blockopt.go#L89
您期望看到什么?
ok.Referrers 包含 Ifstmt的 cond -- "ok"
您看到了什么?
错误
2条答案
按热度按时间qfe3c7zg1#
@alandonovan
km0tfn4u2#
跳线程优化简化了退化的if语句,有效地完全消除了下面的代码:
只留下条件的评估,但不包括其引用者。
这在编译器中将是一个合理的代码转换,但由于go/ssa力求保持与源代码的接近,也许它必须放弃这种优化。