From 252fbaf30fab5542f959d3ead59258440a0e0903 Mon Sep 17 00:00:00 2001 From: Xiaolin Zhao Date: Mon, 21 Oct 2024 17:19:48 +0800 Subject: [PATCH] cmd/compile: fold MOV*nop and MOV*const on loong64 Change-Id: I4bb1082518fc08fc0a1cb66970746d5b4f13c934 Reviewed-on: https://go-review.googlesource.com/c/go/+/621356 Reviewed-by: Dmitri Shuralyov Reviewed-by: abner chenc LUCI-TryBot-Result: Go LUCI Reviewed-by: Michael Pratt --- src/cmd/compile/internal/ssa/_gen/LOONG64.rules | 4 ++++ src/cmd/compile/internal/ssa/rewriteLOONG64.go | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/cmd/compile/internal/ssa/_gen/LOONG64.rules b/src/cmd/compile/internal/ssa/_gen/LOONG64.rules index d2c9d72278..a5fa2ae48f 100644 --- a/src/cmd/compile/internal/ssa/_gen/LOONG64.rules +++ b/src/cmd/compile/internal/ssa/_gen/LOONG64.rules @@ -625,6 +625,10 @@ // MOVVnop doesn't emit instruction, only for ensuring the type. (MOVVreg x) && x.Uses == 1 => (MOVVnop x) +// TODO: we should be able to get rid of MOVVnop all together. +// But for now, this is enough to get rid of lots of them. +(MOVVnop (MOVVconst [c])) => (MOVVconst [c]) + // fold constant into arithmetic ops (ADDV x (MOVVconst [c])) && is32Bit(c) && !t.IsPtr() => (ADDVconst [c] x) (SUBV x (MOVVconst [c])) && is32Bit(c) => (SUBVconst [c] x) diff --git a/src/cmd/compile/internal/ssa/rewriteLOONG64.go b/src/cmd/compile/internal/ssa/rewriteLOONG64.go index f07c54c0fc..9f22c99172 100644 --- a/src/cmd/compile/internal/ssa/rewriteLOONG64.go +++ b/src/cmd/compile/internal/ssa/rewriteLOONG64.go @@ -306,6 +306,8 @@ func rewriteValueLOONG64(v *Value) bool { return rewriteValueLOONG64_OpLOONG64MOVVload(v) case OpLOONG64MOVVloadidx: return rewriteValueLOONG64_OpLOONG64MOVVloadidx(v) + case OpLOONG64MOVVnop: + return rewriteValueLOONG64_OpLOONG64MOVVnop(v) case OpLOONG64MOVVreg: return rewriteValueLOONG64_OpLOONG64MOVVreg(v) case OpLOONG64MOVVstore: @@ -3880,6 +3882,21 @@ func rewriteValueLOONG64_OpLOONG64MOVVloadidx(v *Value) bool { } return false } +func rewriteValueLOONG64_OpLOONG64MOVVnop(v *Value) bool { + v_0 := v.Args[0] + // match: (MOVVnop (MOVVconst [c])) + // result: (MOVVconst [c]) + for { + if v_0.Op != OpLOONG64MOVVconst { + break + } + c := auxIntToInt64(v_0.AuxInt) + v.reset(OpLOONG64MOVVconst) + v.AuxInt = int64ToAuxInt(c) + return true + } + return false +} func rewriteValueLOONG64_OpLOONG64MOVVreg(v *Value) bool { v_0 := v.Args[0] // match: (MOVVreg x) -- 2.48.1