x/tools/go/ssa: if语句的ssa引用错误

v7pvogib  于 4个月前  发布在  Go
关注(0)|答案(2)|浏览(37)

请在提交问题之前回答以下问题。谢谢!

您正在使用的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"

您看到了什么?

错误

km0tfn4u

km0tfn4u2#

跳线程优化简化了退化的if语句,有效地完全消除了下面的代码:

cond = ...
   if cond {
   } else {
   }

只留下条件的评估,但不包括其引用者。
这在编译器中将是一个合理的代码转换,但由于go/ssa力求保持与源代码的接近,也许它必须放弃这种优化。

相关问题