From: Josh Bleecher Snyder Date: Sun, 23 Feb 2020 06:05:05 +0000 (-0800) Subject: cmd/compile: use immediates for MOVO of readonly sym X-Git-Tag: go1.15beta1~1036 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=f5b5d77ee2ea0c2edfa600c5245df869e2177615;p=gostls13.git cmd/compile: use immediates for MOVO of readonly sym 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 TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- diff --git a/src/cmd/compile/internal/ssa/gen/AMD64.rules b/src/cmd/compile/internal/ssa/gen/AMD64.rules index 16fba3f22f..fd32d35f20 100644 --- a/src/cmd/compile/internal/ssa/gen/AMD64.rules +++ b/src/cmd/compile/internal/ssa/gen/AMD64.rules @@ -2428,3 +2428,6 @@ (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)) diff --git a/src/cmd/compile/internal/ssa/rewriteAMD64.go b/src/cmd/compile/internal/ssa/rewriteAMD64.go index 35010203e3..1beccb4f29 100644 --- a/src/cmd/compile/internal/ssa/rewriteAMD64.go +++ b/src/cmd/compile/internal/ssa/rewriteAMD64.go @@ -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 {