1. 27 Apr, 2018 6 commits
    • Yasuhiro Matsumoto's avatar
      os: os: make Stat("*.txt") fail on windows · e656aebb
      Yasuhiro Matsumoto authored
      Fixes #24999
      
      Change-Id: Ie0bb6a6e0fa3992cdd272d42347af65ae7c95463
      Reviewed-on: https://go-review.googlesource.com/108755
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarAlex Brainman <alex.brainman@gmail.com>
      e656aebb
    • Daniel Martí's avatar
      cmd/compile: add initial README · a835c739
      Daniel Martí authored
      As a follow-up to the first README for cmd/compile/internal/ssa.
      
      Since this is the parent package for all the compiler packages, this
      README serves as an overview of the compiler and its packages. As more
      READMEs are added for specific parts with more detail, such as ssa's,
      they can be linked from this one.
      
      Thanks to Iskander Sharipov, Josh Bleecher Snyder, Matthew Dempsky,
      Alberto Donizetti, and Robert Griesemer for helping with all the details
      in this document.
      
      Change-Id: I820a535e25dce86ccc667ce1c6e92b75fc32f3af
      Reviewed-on: https://go-review.googlesource.com/103935Reviewed-by: default avatarMartin Möhrmann <moehrmann@google.com>
      Reviewed-by: default avatarJosh Bleecher Snyder <josharian@gmail.com>
      Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
      a835c739
    • Josh Bleecher Snyder's avatar
      cmd/compile: increase initial allocation of LSym.R · a76249c3
      Josh Bleecher Snyder authored
      Not a big win, but cheap.
      
      name        old alloc/op      new alloc/op      delta
      Template         34.4MB ± 0%       34.4MB ± 0%  -0.20%  (p=0.000 n=15+15)
      Unicode          29.2MB ± 0%       29.3MB ± 0%  +0.17%  (p=0.000 n=15+15)
      GoTypes           113MB ± 0%        113MB ± 0%  -0.22%  (p=0.000 n=15+15)
      Compiler          509MB ± 0%        508MB ± 0%  -0.11%  (p=0.000 n=15+14)
      SSA              1.46GB ± 0%       1.46GB ± 0%  -0.08%  (p=0.000 n=14+15)
      Flate            23.8MB ± 0%       23.7MB ± 0%  -0.22%  (p=0.000 n=15+15)
      GoParser         27.9MB ± 0%       27.8MB ± 0%  -0.21%  (p=0.000 n=14+15)
      Reflect          77.2MB ± 0%       77.0MB ± 0%  -0.27%  (p=0.000 n=14+15)
      Tar              34.0MB ± 0%       33.9MB ± 0%  -0.21%  (p=0.000 n=13+15)
      XML              42.6MB ± 0%       42.5MB ± 0%  -0.15%  (p=0.000 n=15+15)
      [Geo mean]       75.8MB            75.7MB       -0.15%
      
      name        old allocs/op     new allocs/op     delta
      Template           322k ± 0%         320k ± 0%  -0.60%  (p=0.000 n=15+15)
      Unicode            337k ± 0%         336k ± 0%  -0.23%  (p=0.000 n=12+15)
      GoTypes           1.13M ± 0%        1.12M ± 0%  -0.58%  (p=0.000 n=15+14)
      Compiler          4.67M ± 0%        4.65M ± 0%  -0.38%  (p=0.000 n=14+15)
      SSA               11.7M ± 0%        11.6M ± 0%  -0.25%  (p=0.000 n=15+15)
      Flate              216k ± 0%         214k ± 0%  -0.67%  (p=0.000 n=15+15)
      GoParser           271k ± 0%         270k ± 0%  -0.57%  (p=0.000 n=15+15)
      Reflect            927k ± 0%         920k ± 0%  -0.72%  (p=0.000 n=13+14)
      Tar                318k ± 0%         316k ± 0%  -0.57%  (p=0.000 n=15+15)
      XML                376k ± 0%         375k ± 0%  -0.46%  (p=0.000 n=14+14)
      [Geo mean]         731k              727k       -0.50%
      
      Change-Id: I1417c5881e866fb3efe62a3d0fbe1134275da31a
      Reviewed-on: https://go-review.googlesource.com/109755
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      a76249c3
    • Josh Bleecher Snyder's avatar
      cmd/compile: log Ctz non-zero proofs · b9785fc8
      Josh Bleecher Snyder authored
      I forgot this in CL 109358.
      
      Change-Id: Ia5e8bd9cf43393f098b101a0d6a0c526e3e4f101
      Reviewed-on: https://go-review.googlesource.com/109775
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      b9785fc8
    • Kevin Burke's avatar
      cmd/vet: remove "only" from error message · 6b55407d
      Kevin Burke authored
      If the vetted function supplies zero arguments, previously you would
      get an error message like this:
      
          Printf format %v reads arg #1, but call has only 0 args
      
      "has only 0 args" is an odd construction, and "has 0 args" sounds
      better. Getting rid of "only" in all cases simplifies the code and
      reads just as well.
      
      Change-Id: I4706dfe4a75f13bf4db9c0650e459ca676710752
      Reviewed-on: https://go-review.googlesource.com/109457
      Run-TryBot: Kevin Burke <kev@inburke.com>
      Run-TryBot: David Symonds <dsymonds@golang.org>
      Reviewed-by: default avatarDavid Symonds <dsymonds@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      6b55407d
    • Daniel Martí's avatar
      cmd/link/internal/ld: simple cleanups · a6b183fa
      Daniel Martí authored
      Simplify some C-style loops with range statements, and move some
      declarations closer to their uses.
      
      While at it, ensure that all the SymbolType consts are typed.
      
      Change-Id: I04b06afb2c1fb249ef8093a0c5cca0a597d1e05c
      Reviewed-on: https://go-review.googlesource.com/105217
      Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
      a6b183fa
  2. 26 Apr, 2018 24 commits
  3. 25 Apr, 2018 10 commits
    • Josh Bleecher Snyder's avatar
      cmd/compile: use intrinsic for LeadingZeros8 on amd64 · c5f0104d
      Josh Bleecher Snyder authored
      The previous change sped up the pure computation form of LeadingZeros8.
      This places it somewhat close to the table lookup form.
      Depending on something that varies from toolchain to toolchain
      (alignment, perhaps?), the slowdown from ditching the table lookup
      is either 20% or 5%.
      
      This benchmark is the best case scenario for the table lookup:
      It is in the L1 cache already.
      
      I think we're close enough that we can switch to the computational version,
      and trust that the memory effects and binary size savings will be worth it.
      
      Code:
      
      func f8(x uint8)   { z = bits.LeadingZeros8(x) }
      
      Before:
      
      "".f8 STEXT nosplit size=34 args=0x8 locals=0x0
      	0x0000 00000 (x.go:7)	TEXT	"".f8(SB), NOSPLIT, $0-8
      	0x0000 00000 (x.go:7)	FUNCDATA	$0, gclocals·2a5305abe05176240e61b8620e19a815(SB)
      	0x0000 00000 (x.go:7)	FUNCDATA	$1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
      	0x0000 00000 (x.go:7)	MOVBLZX	"".x+8(SP), AX
      	0x0005 00005 (x.go:7)	MOVBLZX	AL, AX
      	0x0008 00008 (x.go:7)	LEAQ	math/bits.len8tab(SB), CX
      	0x000f 00015 (x.go:7)	MOVBLZX	(CX)(AX*1), AX
      	0x0013 00019 (x.go:7)	ADDQ	$-8, AX
      	0x0017 00023 (x.go:7)	NEGQ	AX
      	0x001a 00026 (x.go:7)	MOVQ	AX, "".z(SB)
      	0x0021 00033 (x.go:7)	RET
      
      After:
      
      "".f8 STEXT nosplit size=30 args=0x8 locals=0x0
      	0x0000 00000 (x.go:7)	TEXT	"".f8(SB), NOSPLIT, $0-8
      	0x0000 00000 (x.go:7)	FUNCDATA	$0, gclocals·2a5305abe05176240e61b8620e19a815(SB)
      	0x0000 00000 (x.go:7)	FUNCDATA	$1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
      	0x0000 00000 (x.go:7)	MOVBLZX	"".x+8(SP), AX
      	0x0005 00005 (x.go:7)	MOVBLZX	AL, AX
      	0x0008 00008 (x.go:7)	LEAL	1(AX)(AX*1), AX
      	0x000c 00012 (x.go:7)	BSRL	AX, AX
      	0x000f 00015 (x.go:7)	ADDQ	$-8, AX
      	0x0013 00019 (x.go:7)	NEGQ	AX
      	0x0016 00022 (x.go:7)	MOVQ	AX, "".z(SB)
      	0x001d 00029 (x.go:7)	RET
      
      Change-Id: Icc7db50a7820fb9a3da8a816d6b6940d7f8e193e
      Reviewed-on: https://go-review.googlesource.com/108942
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarKeith Randall <khr@golang.org>
      c5f0104d
    • Josh Bleecher Snyder's avatar
      cmd/compile: optimize LeadingZeros(16|32) on amd64 · 1d321ada
      Josh Bleecher Snyder authored
      Introduce Len8 and Len16 ops and provide optimized lowerings for them.
      amd64 only for this CL, although it wouldn't surprise me
      if other architectures also admit of optimized lowerings.
      
      Also use and optimize the Len32 lowering, along the same lines.
      
      Leave Len8 unused for the moment; a subsequent CL will enable it.
      
      For 16 and 32 bits, this leads to a speed-up.
      
      name              old time/op  new time/op  delta
      LeadingZeros16-8  1.42ns ± 5%  1.23ns ± 5%  -13.42%  (p=0.000 n=20+20)
      LeadingZeros32-8  1.25ns ± 5%  1.03ns ± 5%  -17.63%  (p=0.000 n=20+16)
      
      Code:
      
      func f16(x uint16) { z = bits.LeadingZeros16(x) }
      func f32(x uint32) { z = bits.LeadingZeros32(x) }
      
      Before:
      
      "".f16 STEXT nosplit size=38 args=0x8 locals=0x0
      	0x0000 00000 (x.go:8)	TEXT	"".f16(SB), NOSPLIT, $0-8
      	0x0000 00000 (x.go:8)	FUNCDATA	$0, gclocals·2a5305abe05176240e61b8620e19a815(SB)
      	0x0000 00000 (x.go:8)	FUNCDATA	$1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
      	0x0000 00000 (x.go:8)	MOVWLZX	"".x+8(SP), AX
      	0x0005 00005 (x.go:8)	MOVWLZX	AX, AX
      	0x0008 00008 (x.go:8)	BSRQ	AX, AX
      	0x000c 00012 (x.go:8)	MOVQ	$-1, CX
      	0x0013 00019 (x.go:8)	CMOVQEQ	CX, AX
      	0x0017 00023 (x.go:8)	ADDQ	$-15, AX
      	0x001b 00027 (x.go:8)	NEGQ	AX
      	0x001e 00030 (x.go:8)	MOVQ	AX, "".z(SB)
      	0x0025 00037 (x.go:8)	RET
      
      "".f32 STEXT nosplit size=34 args=0x8 locals=0x0
      	0x0000 00000 (x.go:9)	TEXT	"".f32(SB), NOSPLIT, $0-8
      	0x0000 00000 (x.go:9)	FUNCDATA	$0, gclocals·2a5305abe05176240e61b8620e19a815(SB)
      	0x0000 00000 (x.go:9)	FUNCDATA	$1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
      	0x0000 00000 (x.go:9)	MOVL	"".x+8(SP), AX
      	0x0004 00004 (x.go:9)	BSRQ	AX, AX
      	0x0008 00008 (x.go:9)	MOVQ	$-1, CX
      	0x000f 00015 (x.go:9)	CMOVQEQ	CX, AX
      	0x0013 00019 (x.go:9)	ADDQ	$-31, AX
      	0x0017 00023 (x.go:9)	NEGQ	AX
      	0x001a 00026 (x.go:9)	MOVQ	AX, "".z(SB)
      	0x0021 00033 (x.go:9)	RET
      
      After:
      
      "".f16 STEXT nosplit size=30 args=0x8 locals=0x0
      	0x0000 00000 (x.go:8)	TEXT	"".f16(SB), NOSPLIT, $0-8
      	0x0000 00000 (x.go:8)	FUNCDATA	$0, gclocals·2a5305abe05176240e61b8620e19a815(SB)
      	0x0000 00000 (x.go:8)	FUNCDATA	$1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
      	0x0000 00000 (x.go:8)	MOVWLZX	"".x+8(SP), AX
      	0x0005 00005 (x.go:8)	MOVWLZX	AX, AX
      	0x0008 00008 (x.go:8)	LEAL	1(AX)(AX*1), AX
      	0x000c 00012 (x.go:8)	BSRL	AX, AX
      	0x000f 00015 (x.go:8)	ADDQ	$-16, AX
      	0x0013 00019 (x.go:8)	NEGQ	AX
      	0x0016 00022 (x.go:8)	MOVQ	AX, "".z(SB)
      	0x001d 00029 (x.go:8)	RET
      
      "".f32 STEXT nosplit size=28 args=0x8 locals=0x0
      	0x0000 00000 (x.go:9)	TEXT	"".f32(SB), NOSPLIT, $0-8
      	0x0000 00000 (x.go:9)	FUNCDATA	$0, gclocals·2a5305abe05176240e61b8620e19a815(SB)
      	0x0000 00000 (x.go:9)	FUNCDATA	$1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
      	0x0000 00000 (x.go:9)	MOVL	"".x+8(SP), AX
      	0x0004 00004 (x.go:9)	LEAQ	1(AX)(AX*1), AX
      	0x0009 00009 (x.go:9)	BSRQ	AX, AX
      	0x000d 00013 (x.go:9)	ADDQ	$-32, AX
      	0x0011 00017 (x.go:9)	NEGQ	AX
      	0x0014 00020 (x.go:9)	MOVQ	AX, "".z(SB)
      	0x001b 00027 (x.go:9)	RET
      
      Change-Id: I6c93c173752a7bfdeab8be30777ae05a736e1f4b
      Reviewed-on: https://go-review.googlesource.com/108941
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarGiovanni Bajo <rasky@develer.com>
      Reviewed-by: default avatarKeith Randall <khr@golang.org>
      1d321ada
    • Josh Bleecher Snyder's avatar
      cmd/compile: optimize TrailingZeros(8|16) on amd64 · 54dbab52
      Josh Bleecher Snyder authored
      Introduce Ctz8 and Ctz16 ops and provide optimized lowerings for them.
      amd64 only for this CL, although it wouldn't surprise me
      if other architectures also admit of optimized lowerings.
      
      name               old time/op  new time/op  delta
      TrailingZeros8-8   1.33ns ± 6%  0.84ns ± 3%  -36.90%  (p=0.000 n=20+20)
      TrailingZeros16-8  1.26ns ± 5%  0.84ns ± 5%  -33.50%  (p=0.000 n=20+18)
      
      Code:
      
      func f8(x uint8)   { z = bits.TrailingZeros8(x) }
      func f16(x uint16) { z = bits.TrailingZeros16(x) }
      
      Before:
      
      "".f8 STEXT nosplit size=34 args=0x8 locals=0x0
      	0x0000 00000 (x.go:7)	TEXT	"".f8(SB), NOSPLIT, $0-8
      	0x0000 00000 (x.go:7)	FUNCDATA	$0, gclocals·2a5305abe05176240e61b8620e19a815(SB)
      	0x0000 00000 (x.go:7)	FUNCDATA	$1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
      	0x0000 00000 (x.go:7)	MOVBLZX	"".x+8(SP), AX
      	0x0005 00005 (x.go:7)	MOVBLZX	AL, AX
      	0x0008 00008 (x.go:7)	BTSQ	$8, AX
      	0x000d 00013 (x.go:7)	BSFQ	AX, AX
      	0x0011 00017 (x.go:7)	MOVL	$64, CX
      	0x0016 00022 (x.go:7)	CMOVQEQ	CX, AX
      	0x001a 00026 (x.go:7)	MOVQ	AX, "".z(SB)
      	0x0021 00033 (x.go:7)	RET
      
      "".f16 STEXT nosplit size=34 args=0x8 locals=0x0
      	0x0000 00000 (x.go:8)	TEXT	"".f16(SB), NOSPLIT, $0-8
      	0x0000 00000 (x.go:8)	FUNCDATA	$0, gclocals·2a5305abe05176240e61b8620e19a815(SB)
      	0x0000 00000 (x.go:8)	FUNCDATA	$1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
      	0x0000 00000 (x.go:8)	MOVWLZX	"".x+8(SP), AX
      	0x0005 00005 (x.go:8)	MOVWLZX	AX, AX
      	0x0008 00008 (x.go:8)	BTSQ	$16, AX
      	0x000d 00013 (x.go:8)	BSFQ	AX, AX
      	0x0011 00017 (x.go:8)	MOVL	$64, CX
      	0x0016 00022 (x.go:8)	CMOVQEQ	CX, AX
      	0x001a 00026 (x.go:8)	MOVQ	AX, "".z(SB)
      	0x0021 00033 (x.go:8)	RET
      
      After:
      
      "".f8 STEXT nosplit size=20 args=0x8 locals=0x0
      	0x0000 00000 (x.go:7)	TEXT	"".f8(SB), NOSPLIT, $0-8
      	0x0000 00000 (x.go:7)	FUNCDATA	$0, gclocals·2a5305abe05176240e61b8620e19a815(SB)
      	0x0000 00000 (x.go:7)	FUNCDATA	$1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
      	0x0000 00000 (x.go:7)	MOVBLZX	"".x+8(SP), AX
      	0x0005 00005 (x.go:7)	BTSL	$8, AX
      	0x0009 00009 (x.go:7)	BSFL	AX, AX
      	0x000c 00012 (x.go:7)	MOVQ	AX, "".z(SB)
      	0x0013 00019 (x.go:7)	RET
      
      "".f16 STEXT nosplit size=20 args=0x8 locals=0x0
      	0x0000 00000 (x.go:8)	TEXT	"".f16(SB), NOSPLIT, $0-8
      	0x0000 00000 (x.go:8)	FUNCDATA	$0, gclocals·2a5305abe05176240e61b8620e19a815(SB)
      	0x0000 00000 (x.go:8)	FUNCDATA	$1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
      	0x0000 00000 (x.go:8)	MOVWLZX	"".x+8(SP), AX
      	0x0005 00005 (x.go:8)	BTSL	$16, AX
      	0x0009 00009 (x.go:8)	BSFL	AX, AX
      	0x000c 00012 (x.go:8)	MOVQ	AX, "".z(SB)
      	0x0013 00019 (x.go:8)	RET
      
      Change-Id: I0551e357348de2b724737d569afd6ac9f5c3aa11
      Reviewed-on: https://go-review.googlesource.com/108940
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarGiovanni Bajo <rasky@develer.com>
      Reviewed-by: default avatarKeith Randall <khr@golang.org>
      54dbab52
    • Russ Cox's avatar
      cmd/go/internal/load: split test logic out of pkg.go into test.go · 90083e65
      Russ Cox authored
      It's going to grow.
      
      Change-Id: I4f5d3cce6e03250508d1ae0981a6d82a4192ae31
      Reviewed-on: https://go-review.googlesource.com/107915
      Run-TryBot: Russ Cox <rsc@golang.org>
      Reviewed-by: default avatarBryan C. Mills <bcmills@google.com>
      90083e65
    • Russ Cox's avatar
      cmd/go: add go list -deps · 90e860f1
      Russ Cox authored
      This gives an easy way to query properties of all the deps
      of a set of packages, in a single go list invocation.
      Go list has already done the hard work of loading these
      packages, so exposing them is more efficient than
      requiring a second invocation.
      
      This will be helpful for tools asking cmd/go about build
      information.
      
      Change-Id: I90798e386246b24aad92dd13cb9e3788c7d30e91
      Reviewed-on: https://go-review.googlesource.com/107776
      Run-TryBot: Russ Cox <rsc@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarBryan C. Mills <bcmills@google.com>
      90e860f1
    • Ian Lance Taylor's avatar
      misc/cgo/test: log error value in testSigprocmask · 9c9ed9aa
      Ian Lance Taylor authored
      The test has been flaky, probably due to EAGAIN, but let's find out
      for sure.
      
      Updates #25078
      
      Change-Id: I5a5b14bfc52cb43f25f07ca7d207b61ae9d4f944
      Reviewed-on: https://go-review.googlesource.com/109359
      Run-TryBot: Ian Lance Taylor <iant@golang.org>
      Reviewed-by: default avatarBryan C. Mills <bcmills@google.com>
      9c9ed9aa
    • Russ Cox's avatar
      cmd/compile: fix format error · d3ff5090
      Russ Cox authored
      Found by pending CL to make cmd/vet auto-detect printf wrappers.
      
      Change-Id: I6b5ba8f9c301dd2d7086c152cf2e54a68b012208
      Reviewed-on: https://go-review.googlesource.com/109345
      Run-TryBot: Russ Cox <rsc@golang.org>
      Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      d3ff5090
    • Russ Cox's avatar
      encoding/base64: fix format error · 50a58396
      Russ Cox authored
      Found by pending CL to make cmd/vet auto-detect printf wrappers.
      
      Change-Id: I2ad06647b7b41cf68859820a60eeac2e689ca2e6
      Reviewed-on: https://go-review.googlesource.com/109344
      Run-TryBot: Russ Cox <rsc@golang.org>
      Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      50a58396
    • Russ Cox's avatar
      go/types: fix format errors · 932794cb
      Russ Cox authored
      Found by pending CL to make cmd/vet auto-detect printf wrappers.
      
      Change-Id: I1928a5bcd7885cdd950ce81b7d0ba07fbad3bf88
      Reviewed-on: https://go-review.googlesource.com/109343
      Run-TryBot: Russ Cox <rsc@golang.org>
      Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      932794cb
    • Russ Cox's avatar
      cmd/go: fix go list .Stale computation · 9e0e6981
      Russ Cox authored
      If X depends on Y and X was installed but Y is only present in the cache
      (as happens when you "go install X") then we should report X as up-to-date,
      not as stale.
      
      This applies whether X is a package or a main binary.
      
      Fixes #24558.
      Fixes #23818.
      
      Change-Id: I26a0b375b1f7f7ac909cc0db68e92f4e04529208
      Reviewed-on: https://go-review.googlesource.com/107957
      Run-TryBot: Russ Cox <rsc@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarBryan C. Mills <bcmills@google.com>
      9e0e6981