From 9d2b988e4aeb59424411a314748aa8ffd1e71033 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Wed, 1 Jun 2016 10:58:30 -0700 Subject: cmd/compile: accept literals in samesafeexpr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This only triggers a few places in the stdlib, but it helps a lot when it does. Before: runtime.mapassign1 t=1 size=2400 args=0x20 locals=0xe0 After: runtime.mapassign1 t=1 size=2352 args=0x20 locals=0xd8 name old time/op new time/op delta MapPop100-8 19.8µs ±11% 18.4µs ± 9% -7.16% (p=0.000 n=20+19) MapPop1000-8 367µs ±17% 335µs ±11% -8.63% (p=0.000 n=19+19) MapPop10000-8 7.29ms ±15% 6.86ms ±12% -5.84% (p=0.020 n=20+20) Change-Id: I9faf32f95a6ba6a6d5d0818eab32cc271e01d10a Reviewed-on: https://go-review.googlesource.com/26666 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/const.go | 28 ++++++++++++++++++++++++++++ src/cmd/compile/internal/gc/typecheck.go | 3 +++ 2 files changed, 31 insertions(+) diff --git a/src/cmd/compile/internal/gc/const.go b/src/cmd/compile/internal/gc/const.go index 882daec460..4b4cffdc06 100644 --- a/src/cmd/compile/internal/gc/const.go +++ b/src/cmd/compile/internal/gc/const.go @@ -61,6 +61,34 @@ func (v Val) Ctype() Ctype { } } +func eqval(a, b Val) bool { + if a.Ctype() != b.Ctype() { + return false + } + switch x := a.U.(type) { + default: + Fatalf("unexpected Ctype for %T", a.U) + panic("not reached") + case *NilVal: + return true + case bool: + y := b.U.(bool) + return x == y + case *Mpint: + y := b.U.(*Mpint) + return x.Cmp(y) == 0 + case *Mpflt: + y := b.U.(*Mpflt) + return x.Cmp(y) == 0 + case *Mpcplx: + y := b.U.(*Mpcplx) + return x.Real.Cmp(&y.Real) == 0 && x.Imag.Cmp(&y.Imag) == 0 + case string: + y := b.U.(string) + return x == y + } +} + type NilVal struct{} // IntLiteral returns the Node's literal value as an integer. diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index c8ee9417e6..066e2a19c8 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -3185,6 +3185,9 @@ func samesafeexpr(l *Node, r *Node) bool { case OINDEX: return samesafeexpr(l.Left, r.Left) && samesafeexpr(l.Right, r.Right) + + case OLITERAL: + return eqval(l.Val(), r.Val()) } return false -- cgit v1.2.1