diff --git a/src/cmd/compile/internal/ssa/_gen/LOONG64.rules b/src/cmd/compile/internal/ssa/_gen/LOONG64.rules index efeeca652c8..75b5e3806b0 100644 --- a/src/cmd/compile/internal/ssa/_gen/LOONG64.rules +++ b/src/cmd/compile/internal/ssa/_gen/LOONG64.rules @@ -749,6 +749,9 @@ (SRLVconst [rc] (MOVHUreg x)) && rc >= 16 => (MOVVconst [0]) (SRLVconst [rc] (MOVBUreg x)) && rc >= 8 => (MOVVconst [0]) +// (x + x) << c -> x << c+1 +((SLLV|SLL)const [c] (ADDV x x)) => ((SLLV|SLL)const [c+1] x) + // mul by constant (MULV _ (MOVVconst [0])) => (MOVVconst [0]) (MULV x (MOVVconst [1])) => x diff --git a/src/cmd/compile/internal/ssa/rewriteLOONG64.go b/src/cmd/compile/internal/ssa/rewriteLOONG64.go index 6f29588f9a5..df4ac818dda 100644 --- a/src/cmd/compile/internal/ssa/rewriteLOONG64.go +++ b/src/cmd/compile/internal/ssa/rewriteLOONG64.go @@ -468,6 +468,8 @@ func rewriteValueLOONG64(v *Value) bool { return rewriteValueLOONG64_OpLOONG64SLLV(v) case OpLOONG64SLLVconst: return rewriteValueLOONG64_OpLOONG64SLLVconst(v) + case OpLOONG64SLLconst: + return rewriteValueLOONG64_OpLOONG64SLLconst(v) case OpLOONG64SRA: return rewriteValueLOONG64_OpLOONG64SRA(v) case OpLOONG64SRAV: @@ -6457,6 +6459,22 @@ func rewriteValueLOONG64_OpLOONG64SLLV(v *Value) bool { } func rewriteValueLOONG64_OpLOONG64SLLVconst(v *Value) bool { v_0 := v.Args[0] + // match: (SLLVconst [c] (ADDV x x)) + // result: (SLLVconst [c+1] x) + for { + c := auxIntToInt64(v.AuxInt) + if v_0.Op != OpLOONG64ADDV { + break + } + x := v_0.Args[1] + if x != v_0.Args[0] { + break + } + v.reset(OpLOONG64SLLVconst) + v.AuxInt = int64ToAuxInt(c + 1) + v.AddArg(x) + return true + } // match: (SLLVconst [c] (MOVVconst [d])) // result: (MOVVconst [d<