mirror of https://github.com/golang/go.git
cmd/compile/internal/gc: handle arith ops in samesafeexpr
Teach samesafeexpr to handle arithmetic unary and binary ops. It makes map lookup optimization possible in m[k+1] = append(m[k+1], ...) m[-k] = append(m[-k], ...) ... etc Does not cover "+" for strings (concatenation). Change-Id: Ibbb16ac3faf176958da344be1471b06d7cf33a6c Reviewed-on: https://go-review.googlesource.com/135795 Run-TryBot: Iskander Sharipov <iskander.sharipov@intel.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
9850ad045f
commit
c03d0e4fec
|
|
@ -3298,7 +3298,8 @@ func samesafeexpr(l *Node, r *Node) bool {
|
||||||
case ODOT, ODOTPTR:
|
case ODOT, ODOTPTR:
|
||||||
return l.Sym != nil && r.Sym != nil && l.Sym == r.Sym && samesafeexpr(l.Left, r.Left)
|
return l.Sym != nil && r.Sym != nil && l.Sym == r.Sym && samesafeexpr(l.Left, r.Left)
|
||||||
|
|
||||||
case OIND, OCONVNOP:
|
case OIND, OCONVNOP,
|
||||||
|
ONOT, OCOM, OPLUS, OMINUS:
|
||||||
return samesafeexpr(l.Left, r.Left)
|
return samesafeexpr(l.Left, r.Left)
|
||||||
|
|
||||||
case OCONV:
|
case OCONV:
|
||||||
|
|
@ -3306,7 +3307,8 @@ func samesafeexpr(l *Node, r *Node) bool {
|
||||||
// Allow only numeric-ish types. This is a bit conservative.
|
// Allow only numeric-ish types. This is a bit conservative.
|
||||||
return issimple[l.Type.Etype] && samesafeexpr(l.Left, r.Left)
|
return issimple[l.Type.Etype] && samesafeexpr(l.Left, r.Left)
|
||||||
|
|
||||||
case OINDEX, OINDEXMAP:
|
case OINDEX, OINDEXMAP,
|
||||||
|
OADD, OSUB, OOR, OXOR, OMUL, OLSH, ORSH, OAND, OANDNOT, ODIV, OMOD:
|
||||||
return samesafeexpr(l.Left, r.Left) && samesafeexpr(l.Right, r.Right)
|
return samesafeexpr(l.Left, r.Left) && samesafeexpr(l.Right, r.Right)
|
||||||
|
|
||||||
case OLITERAL:
|
case OLITERAL:
|
||||||
|
|
|
||||||
|
|
@ -304,6 +304,18 @@ func mapAppendAssignmentInt32() {
|
||||||
// arm64:-".*mapaccess"
|
// arm64:-".*mapaccess"
|
||||||
m[k] = append(m[k], a...)
|
m[k] = append(m[k], a...)
|
||||||
|
|
||||||
|
// 386:-".*mapaccess"
|
||||||
|
// amd64:-".*mapaccess"
|
||||||
|
// arm:-".*mapaccess"
|
||||||
|
// arm64:-".*mapaccess"
|
||||||
|
m[k+1] = append(m[k+1], a...)
|
||||||
|
|
||||||
|
// 386:-".*mapaccess"
|
||||||
|
// amd64:-".*mapaccess"
|
||||||
|
// arm:-".*mapaccess"
|
||||||
|
// arm64:-".*mapaccess"
|
||||||
|
m[-k] = append(m[-k], a...)
|
||||||
|
|
||||||
// Exceptions
|
// Exceptions
|
||||||
|
|
||||||
// 386:".*mapaccess"
|
// 386:".*mapaccess"
|
||||||
|
|
@ -349,6 +361,18 @@ func mapAppendAssignmentInt64() {
|
||||||
// arm64:-".*mapaccess"
|
// arm64:-".*mapaccess"
|
||||||
m[k] = append(m[k], a...)
|
m[k] = append(m[k], a...)
|
||||||
|
|
||||||
|
// 386:-".*mapaccess"
|
||||||
|
// amd64:-".*mapaccess"
|
||||||
|
// arm:-".*mapaccess"
|
||||||
|
// arm64:-".*mapaccess"
|
||||||
|
m[k+1] = append(m[k+1], a...)
|
||||||
|
|
||||||
|
// 386:-".*mapaccess"
|
||||||
|
// amd64:-".*mapaccess"
|
||||||
|
// arm:-".*mapaccess"
|
||||||
|
// arm64:-".*mapaccess"
|
||||||
|
m[-k] = append(m[-k], a...)
|
||||||
|
|
||||||
// Exceptions
|
// Exceptions
|
||||||
|
|
||||||
// 386:".*mapaccess"
|
// 386:".*mapaccess"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue