зеркало из https://github.com/CryptoPro/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:
Родитель
9850ad045f
Коммит
c03d0e4fec
|
@ -3298,7 +3298,8 @@ func samesafeexpr(l *Node, r *Node) bool {
|
|||
case ODOT, ODOTPTR:
|
||||
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)
|
||||
|
||||
case OCONV:
|
||||
|
@ -3306,7 +3307,8 @@ func samesafeexpr(l *Node, r *Node) bool {
|
|||
// Allow only numeric-ish types. This is a bit conservative.
|
||||
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)
|
||||
|
||||
case OLITERAL:
|
||||
|
|
|
@ -304,6 +304,18 @@ func mapAppendAssignmentInt32() {
|
|||
// arm64:-".*mapaccess"
|
||||
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
|
||||
|
||||
// 386:".*mapaccess"
|
||||
|
@ -349,6 +361,18 @@ func mapAppendAssignmentInt64() {
|
|||
// arm64:-".*mapaccess"
|
||||
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
|
||||
|
||||
// 386:".*mapaccess"
|
||||
|
|
Загрузка…
Ссылка в новой задаче