]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: use immediates for MOVO of readonly sym
authorJosh Bleecher Snyder <josharian@gmail.com>
Sun, 23 Feb 2020 06:05:05 +0000 (22:05 -0800)
committerJosh Bleecher Snyder <josharian@gmail.com>
Wed, 26 Feb 2020 19:30:29 +0000 (19:30 +0000)
file      before    after     Δ       %
addr2line 4307760   4303616   -4144   -0.096%
api       5968600   5968568   -32     -0.001%
asm       5109928   5122120   +12192  +0.239%
buildid   2843752   2839608   -4144   -0.146%
cgo       4823768   4819624   -4144   -0.086%
compile   20687848  20691800  +3952   +0.019%
cover     5259896   5255752   -4144   -0.079%
dist      3665176   3661032   -4144   -0.113%
doc       4668648   4668600   -48     -0.001%
fix       3368792   3368744   -48     -0.001%
link      6613328   6609200   -4128   -0.062%
nm        4253312   4253280   -32     -0.001%
objdump   4655360   4655312   -48     -0.001%
pack      2294312   2294280   -32     -0.001%
pprof     14747332  14747284  -48     -0.000%
test2json 2819416   2815272   -4144   -0.147%
trace     11669436  11665292  -4144   -0.036%
vet       8274184   8270040   -4144   -0.050%
total     116030848 116009424 -21424  -0.018%

Change-Id: Ice37222c4d76540b3591459f605321cbf142872d
Reviewed-on: https://go-review.googlesource.com/c/go/+/220690
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/compile/internal/ssa/gen/AMD64.rules
src/cmd/compile/internal/ssa/rewriteAMD64.go

index 16fba3f22fae2006c19a835629adab3f30248970..fd32d35f20f891829d810895d0c57e060547aca4 100644 (file)
 (MOVWload [off] {sym} (SB) _) && symIsRO(sym) -> (MOVLconst [int64(read16(sym, off, config.ctxt.Arch.ByteOrder))])
 (MOVLload [off] {sym} (SB) _) && symIsRO(sym) -> (MOVQconst [int64(read32(sym, off, config.ctxt.Arch.ByteOrder))])
 (MOVQload [off] {sym} (SB) _) && symIsRO(sym) -> (MOVQconst [int64(read64(sym, off, config.ctxt.Arch.ByteOrder))])
+(MOVOstore [dstOff] {dstSym} ptr (MOVOload [srcOff] {srcSym} (SB) _) mem) && symIsRO(srcSym) ->
+  (MOVQstore [dstOff+8] {dstSym} ptr (MOVQconst [int64(read64(srcSym, srcOff+8, config.ctxt.Arch.ByteOrder))])
+    (MOVQstore [dstOff] {dstSym} ptr (MOVQconst [int64(read64(srcSym, srcOff, config.ctxt.Arch.ByteOrder))]) mem))
index 35010203e33ec294349be2439c250a79e0f296a2..1beccb4f296e7d6e36c01917db6df09add344d39 100644 (file)
@@ -15550,6 +15550,9 @@ func rewriteValueAMD64_OpAMD64MOVOstore(v *Value) bool {
        v_2 := v.Args[2]
        v_1 := v.Args[1]
        v_0 := v.Args[0]
+       b := v.Block
+       config := b.Func.Config
+       typ := &b.Func.Config.Types
        // match: (MOVOstore [off1] {sym} (ADDQconst [off2] ptr) val mem)
        // cond: is32Bit(off1+off2)
        // result: (MOVOstore [off1+off2] {sym} ptr val mem)
@@ -15599,6 +15602,45 @@ func rewriteValueAMD64_OpAMD64MOVOstore(v *Value) bool {
                v.AddArg(mem)
                return true
        }
+       // match: (MOVOstore [dstOff] {dstSym} ptr (MOVOload [srcOff] {srcSym} (SB) _) mem)
+       // cond: symIsRO(srcSym)
+       // result: (MOVQstore [dstOff+8] {dstSym} ptr (MOVQconst [int64(read64(srcSym, srcOff+8, config.ctxt.Arch.ByteOrder))]) (MOVQstore [dstOff] {dstSym} ptr (MOVQconst [int64(read64(srcSym, srcOff, config.ctxt.Arch.ByteOrder))]) mem))
+       for {
+               dstOff := v.AuxInt
+               dstSym := v.Aux
+               ptr := v_0
+               if v_1.Op != OpAMD64MOVOload {
+                       break
+               }
+               srcOff := v_1.AuxInt
+               srcSym := v_1.Aux
+               _ = v_1.Args[1]
+               v_1_0 := v_1.Args[0]
+               if v_1_0.Op != OpSB {
+                       break
+               }
+               mem := v_2
+               if !(symIsRO(srcSym)) {
+                       break
+               }
+               v.reset(OpAMD64MOVQstore)
+               v.AuxInt = dstOff + 8
+               v.Aux = dstSym
+               v.AddArg(ptr)
+               v0 := b.NewValue0(v_1.Pos, OpAMD64MOVQconst, typ.UInt64)
+               v0.AuxInt = int64(read64(srcSym, srcOff+8, config.ctxt.Arch.ByteOrder))
+               v.AddArg(v0)
+               v1 := b.NewValue0(v_1.Pos, OpAMD64MOVQstore, types.TypeMem)
+               v1.AuxInt = dstOff
+               v1.Aux = dstSym
+               v1.AddArg(ptr)
+               v2 := b.NewValue0(v_1.Pos, OpAMD64MOVQconst, typ.UInt64)
+               v2.AuxInt = int64(read64(srcSym, srcOff, config.ctxt.Arch.ByteOrder))
+               v1.AddArg(v2)
+               v1.AddArg(mem)
+               v.AddArg(v1)
+               return true
+       }
        return false
 }
 func rewriteValueAMD64_OpAMD64MOVQatomicload(v *Value) bool {