mirror of
				https://github.com/golang/go.git
				synced 2025-10-31 16:50:58 +00:00 
			
		
		
		
	 c9d0fad5cb
			
		
	
	
		c9d0fad5cb
		
	
	
	
	
		
			
			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>
		
	
			
		
			
				
	
	
		
			155 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			155 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() {
 | |
| }
 |