]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fold MOV*nop and MOV*const on loong64
authorXiaolin Zhao <zhaoxiaolin@loongson.cn>
Mon, 21 Oct 2024 09:19:48 +0000 (17:19 +0800)
committerabner chenc <chenguoqi@loongson.cn>
Thu, 24 Oct 2024 09:47:44 +0000 (09:47 +0000)
Change-Id: I4bb1082518fc08fc0a1cb66970746d5b4f13c934
Reviewed-on: https://go-review.googlesource.com/c/go/+/621356
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: abner chenc <chenguoqi@loongson.cn>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
src/cmd/compile/internal/ssa/_gen/LOONG64.rules
src/cmd/compile/internal/ssa/rewriteLOONG64.go

index d2c9d722780e5a6bdbff7a2eb1f227bc1678b82f..a5fa2ae48f4c365ef92ac7da704a00cabbe2c535 100644 (file)
 // 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 <t> [c])) && is32Bit(c) && !t.IsPtr() => (ADDVconst [c] x)
 (SUBV x (MOVVconst [c])) && is32Bit(c) => (SUBVconst [c] x)
index f07c54c0fccfe228e1af39b75379230dc6b82a1c..9f22c9917289fa77442da1894ca23f66afed19fd 100644 (file)
@@ -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)