mirror of
https://github.com/golang/go.git
synced 2025-05-29 03:11:26 +00:00
Add 2 more cases: if a { x = value } else { x = a } => x = a && value if a { x = a } else { x = value } => x = a || value AND case goes from: 00006 (8) TESTB AX, AX 00007 (8) JNE 9 00008 (13) MOVL AX, BX 00009 (13) MOVL BX, AX 00010 (13) RET to: 00006 (13) ANDL BX, AX 00007 (13) RET OR goes from: 00006 (19) TESTB AX, AX 00007 (19) JNE 9 00008 (24) MOVL BX, AX 00009 (24) RET to: 00006 (24) ORL BX, AX 00007 (24) RET compilecmp linux/amd64: runtime runtime.lock2 847 -> 869 (+2.60%) runtime.addspecial 542 -> 517 (-4.61%) runtime.tracebackPCs changed runtime.scanstack changed runtime.mallocinit changed runtime.traceback2 2238 -> 2206 (-1.43%) runtime [cmd/compile] runtime.lock2 860 -> 882 (+2.56%) runtime.scanstack changed runtime.addspecial 542 -> 517 (-4.61%) runtime.traceback2 2238 -> 2206 (-1.43%) runtime.lockWithRank 870 -> 890 (+2.30%) runtime.tracebackPCs changed runtime.mallocinit changed strconv strconv.ryuFtoaFixed32 changed strconv.ryuFtoaFixed64 639 -> 638 (-0.16%) strconv.readFloat changed strconv.ryuFtoaShortest changed strings strings.(*Replacer).build changed strconv [cmd/compile] strconv.readFloat changed strconv.ryuFtoaFixed64 639 -> 638 (-0.16%) strconv.ryuFtoaFixed32 changed strconv.ryuFtoaShortest changed strings [cmd/compile] strings.(*Replacer).build changed regexp regexp.makeOnePass.func1 changed regexp [cmd/compile] regexp.makeOnePass.func1 changed encoding/json encoding/json.indirect changed database/sql database/sql.driverArgsConnLocked changed vendor/golang.org/x/text/unicode/norm vendor/golang.org/x/text/unicode/norm.Form.transform changed go/doc/comment go/doc/comment.parseSpans changed internal/diff internal/diff.tgs changed log/slog log/slog.(*handleState).appendNonBuiltIns 1898 -> 1877 (-1.11%) testing/fstest testing/fstest.(*fsTester).checkGlob changed runtime/pprof runtime/pprof.(*profileBuilder).build changed cmd/internal/dwarf cmd/internal/dwarf.isEmptyInlinedCall 254 -> 244 (-3.94%) go/printer go/printer.keepTypeColumn 302 -> 270 (-10.60%) go/printer.(*printer).binaryExpr changed cmd/compile/internal/syntax cmd/compile/internal/syntax.(*scanner).rune changed cmd/compile/internal/syntax.(*scanner).number 2137 -> 2153 (+0.75%) Change-Id: I7f95f54b03a35d0b616c40f38b415a7feb71be73 Reviewed-on: https://go-review.googlesource.com/c/go/+/666835 Reviewed-by: Keith Randall <khr@golang.org> Auto-Submit: Keith Randall <khr@golang.org> Reviewed-by: Keith Randall <khr@google.com> Run-TryBot: Jakub Ciolek <jakub@ciolek.dev> TryBot-Bypass: Keith Randall <khr@golang.org> Reviewed-by: Cherry Mui <cherryyz@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
156 lines
2.3 KiB
Go
156 lines
2.3 KiB
Go
// errorcheck -0 -d=ssa/phiopt/debug=3
|
|
|
|
//go:build amd64 || s390x || arm64
|
|
|
|
// Copyright 2016 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package main
|
|
|
|
//go:noinline
|
|
func f0(a bool) bool {
|
|
x := false
|
|
if a {
|
|
x = true
|
|
} else {
|
|
x = false
|
|
}
|
|
return x // ERROR "converted OpPhi to Copy$"
|
|
}
|
|
|
|
//go:noinline
|
|
func f1(a bool) bool {
|
|
x := false
|
|
if a {
|
|
x = false
|
|
} else {
|
|
x = true
|
|
}
|
|
return x // ERROR "converted OpPhi to Not$"
|
|
}
|
|
|
|
//go:noinline
|
|
func f2(a, b int) bool {
|
|
x := true
|
|
if a == b {
|
|
x = false
|
|
}
|
|
return x // ERROR "converted OpPhi to Not$"
|
|
}
|
|
|
|
//go:noinline
|
|
func f3(a, b int) bool {
|
|
x := false
|
|
if a == b {
|
|
x = true
|
|
}
|
|
return x // ERROR "converted OpPhi to Copy$"
|
|
}
|
|
|
|
//go:noinline
|
|
func f4(a, b bool) bool {
|
|
return a || b // ERROR "converted OpPhi to OrB$"
|
|
}
|
|
|
|
//go:noinline
|
|
func f5or(a int, b bool) bool {
|
|
var x bool
|
|
if a == 0 {
|
|
x = true
|
|
} else {
|
|
x = b
|
|
}
|
|
return x // ERROR "converted OpPhi to OrB$"
|
|
}
|
|
|
|
//go:noinline
|
|
func f5and(a int, b bool) bool {
|
|
var x bool
|
|
if a == 0 {
|
|
x = b
|
|
} else {
|
|
x = false
|
|
}
|
|
return x // ERROR "converted OpPhi to AndB$"
|
|
}
|
|
|
|
//go:noinline
|
|
func f6or(a int, b bool) bool {
|
|
x := b
|
|
if a == 0 {
|
|
// f6or has side effects so the OpPhi should not be converted.
|
|
x = f6or(a, b)
|
|
}
|
|
return x
|
|
}
|
|
|
|
//go:noinline
|
|
func f6and(a int, b bool) bool {
|
|
x := b
|
|
if a == 0 {
|
|
// f6and has side effects so the OpPhi should not be converted.
|
|
x = f6and(a, b)
|
|
}
|
|
return x
|
|
}
|
|
|
|
//go:noinline
|
|
func f7or(a bool, b bool) bool {
|
|
return a || b // ERROR "converted OpPhi to OrB$"
|
|
}
|
|
|
|
//go:noinline
|
|
func f7and(a bool, b bool) bool {
|
|
return a && b // ERROR "converted OpPhi to AndB$"
|
|
}
|
|
|
|
//go:noinline
|
|
func f8(s string) (string, bool) {
|
|
neg := false
|
|
if s[0] == '-' { // ERROR "converted OpPhi to Copy$"
|
|
neg = true
|
|
s = s[1:]
|
|
}
|
|
return s, neg
|
|
}
|
|
|
|
var d int
|
|
|
|
//go:noinline
|
|
func f9(a, b int) bool {
|
|
c := false
|
|
if a < 0 { // ERROR "converted OpPhi to Copy$"
|
|
if b < 0 {
|
|
d = d + 1
|
|
}
|
|
c = true
|
|
}
|
|
return c
|
|
}
|
|
|
|
//go:noinline
|
|
func f10and(a bool, b bool) bool {
|
|
var x bool
|
|
if a {
|
|
x = b
|
|
} else {
|
|
x = a
|
|
}
|
|
return x // ERROR "converted OpPhi to AndB$"
|
|
}
|
|
|
|
//go:noinline
|
|
func f11or(a bool, b bool) bool {
|
|
var x bool
|
|
if a {
|
|
x = a
|
|
} else {
|
|
x = b
|
|
}
|
|
return x // ERROR "converted OpPhi to OrB$"
|
|
}
|
|
|
|
func main() {
|
|
}
|