From 4cef0e980a5d4fca2b7d26ec26eb1de954cecc21 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Mon, 4 May 2015 15:02:09 -0700 Subject: [PATCH] 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 Run-TryBot: David Crawshaw TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/subr.go | 9 +++++++++ src/cmd/compile/internal/gc/walk.go | 15 +++++++++++++++ 2 files changed, 24 insertions(+) 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. -- 2.50.0