]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: special-case const comparisons against zero
authorRobert Griesemer <gri@golang.org>
Mon, 21 Mar 2016 17:52:03 +0000 (10:52 -0700)
committerRobert Griesemer <gri@golang.org>
Mon, 21 Mar 2016 17:58:21 +0000 (17:58 +0000)
Constant comparisons against 0 are reasonably common.
Special-case and avoid allocating a new zero value each time.

Change-Id: I6c526c8ab30ef7f0fef59110133c764b7b90ba05
Reviewed-on: https://go-review.googlesource.com/20956
Reviewed-by: Alan Donovan <adonovan@google.com>
src/cmd/compile/internal/gc/mpfloat.go
src/cmd/compile/internal/gc/mpint.go
src/cmd/compile/internal/gc/walk.go

index ca290d70d5c8f321cf44898a7766527d5bf5fbb1..72cc5405568acff5e86d3b09453f07299ee06aed 100644 (file)
@@ -116,11 +116,11 @@ func (a *Mpflt) Cmp(b *Mpflt) int {
        return a.Val.Cmp(&b.Val)
 }
 
-func (b *Mpflt) CmpFloat64(c float64) int {
-       var a Mpflt
-
-       a.SetFloat64(c)
-       return b.Cmp(&a)
+func (a *Mpflt) CmpFloat64(c float64) int {
+       if c == 0 {
+               return a.Val.Sign() // common case shortcut
+       }
+       return a.Val.Cmp(big.NewFloat(c))
 }
 
 func (a *Mpflt) Float64() float64 {
index 1ab060ee753cf976ff9988a44deb215cafd10c60..d0f87deb00dd56bfbeaaab590d5040cc98b07ff5 100644 (file)
@@ -262,8 +262,11 @@ func (a *Mpint) Cmp(b *Mpint) int {
        return a.Val.Cmp(&b.Val)
 }
 
-func (b *Mpint) CmpInt64(c int64) int {
-       return b.Val.Cmp(big.NewInt(c))
+func (a *Mpint) CmpInt64(c int64) int {
+       if c == 0 {
+               return a.Val.Sign() // common case shortcut
+       }
+       return a.Val.Cmp(big.NewInt(c))
 }
 
 func (a *Mpint) Neg() {
index 428d309722cafe5d689e696f1f75e48abcabcb93..7a82a808e8052ac821f81ff22bf28c1f2d8f15fc 100644 (file)
@@ -10,8 +10,6 @@ import (
        "strings"
 )
 
-var mpzero Mpint
-
 // The constant is known to runtime.
 const (
        tmpstringbufsize = 32
@@ -1229,7 +1227,7 @@ opswitch:
                }
 
                if Isconst(n.Right, CTINT) {
-                       if n.Right.Val().U.(*Mpint).Cmp(&mpzero) < 0 || n.Right.Val().U.(*Mpint).Cmp(Maxintval[TINT]) > 0 {
+                       if n.Right.Val().U.(*Mpint).CmpInt64(0) < 0 || n.Right.Val().U.(*Mpint).Cmp(Maxintval[TINT]) > 0 {
                                Yyerror("index out of bounds")
                        }
                }