aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJosh Bleecher Snyder <josharian@gmail.com>2015-05-04 15:02:09 -0700
committerJosh Bleecher Snyder <josharian@gmail.com>2016-02-21 18:13:55 +0000
commit4cef0e980a5d4fca2b7d26ec26eb1de954cecc21 (patch)
treedc3f316b10ca307634c520ccb974663b952a96a6 /src
parent9ad41f6243e7947ce1569140382f8847cc2a80dd (diff)
downloadgo-4cef0e980a5d4fca2b7d26ec26eb1de954cecc21.tar.xz
cmd/compile: don't generate algs for [0]T and [1]T
All [0]T values are equal. [1]T values are equal iff their sole components are. This types show up most frequently as a by-product of variadic function calls, such as fmt.Printf("abc") or fmt.Printf("%v", x). Cuts 12k off cmd/go and 22k off golang.org/x/tools/cmd/godoc, approx 0.1% each. For #6853 and #9930 Change-Id: Ic9b7aeb8cc945804246340f6f5e67bbf6008773e Reviewed-on: https://go-review.googlesource.com/19766 Reviewed-by: David Crawshaw <crawshaw@golang.org> Run-TryBot: David Crawshaw <crawshaw@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src')
-rw-r--r--src/cmd/compile/internal/gc/subr.go9
-rw-r--r--src/cmd/compile/internal/gc/walk.go15
2 files changed, 24 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/gc/subr.go b/src/cmd/compile/internal/gc/subr.go
index 0d25ddf2af..a17d7df60d 100644
--- a/src/cmd/compile/internal/gc/subr.go
+++ b/src/cmd/compile/internal/gc/subr.go
@@ -465,6 +465,15 @@ func algtype1(t *Type, bad **Type) int {
return a
}
+ switch t.Bound {
+ case 0:
+ // We checked above that the element type is comparable.
+ return AMEM
+ case 1:
+ // Single-element array is same as its lone element.
+ return a
+ }
+
return -1 // needs special compare
case TSTRUCT:
diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go
index e008317562..f324d5e00f 100644
--- a/src/cmd/compile/internal/gc/walk.go
+++ b/src/cmd/compile/internal/gc/walk.go
@@ -3193,6 +3193,21 @@ func walkcompare(np **Node, init **NodeList) {
return
}
+ if t.Etype == TARRAY {
+ // Zero- or single-element array, of any type.
+ switch t.Bound {
+ case 0:
+ finishcompare(np, n, Nodbool(n.Op == OEQ), init)
+ return
+ case 1:
+ l0 := Nod(OINDEX, l, Nodintconst(0))
+ r0 := Nod(OINDEX, r, Nodintconst(0))
+ a := Nod(n.Op, l0, r0)
+ finishcompare(np, n, a, init)
+ return
+ }
+ }
+
if t.Etype == TSTRUCT && countfield(t) <= 4 {
// Struct of four or fewer fields.
// Inline comparisons.