From 964dda9bf1a5ddff5f258d0a0ad07d3a01d5a952 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandru=20Mo=C8=99oi?= Date: Mon, 8 Feb 2016 18:55:56 +0100 Subject: [PATCH] [dev.ssa] cmd/compile/internal/ssa/gen: constant fold Neg*. Change-Id: Id51e5c97e9653b764b809bf3424f1a6d31b6ffea Reviewed-on: https://go-review.googlesource.com/19338 Run-TryBot: David Chase Reviewed-by: David Chase --- .../compile/internal/ssa/gen/generic.rules | 5 ++ .../compile/internal/ssa/rewritegeneric.go | 76 +++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/src/cmd/compile/internal/ssa/gen/generic.rules b/src/cmd/compile/internal/ssa/gen/generic.rules index 2b811cc7ab8..a3cc5654ead 100644 --- a/src/cmd/compile/internal/ssa/gen/generic.rules +++ b/src/cmd/compile/internal/ssa/gen/generic.rules @@ -20,6 +20,11 @@ // For now, the generated successors must be a permutation of the matched successors. // constant folding +(Neg8 (Const8 [c])) -> (Const8 [-c]) +(Neg16 (Const16 [c])) -> (Const16 [-c]) +(Neg32 (Const32 [c])) -> (Const32 [-c]) +(Neg64 (Const64 [c])) -> (Const64 [-c]) + (Add8 (Const8 [c]) (Const8 [d])) -> (Const8 [c+d]) (Add16 (Const16 [c]) (Const16 [d])) -> (Const16 [c+d]) (Add32 (Const32 [c]) (Const32 [d])) -> (Const32 [c+d]) diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go index a5d8a4d9eb5..a724a2d369e 100644 --- a/src/cmd/compile/internal/ssa/rewritegeneric.go +++ b/src/cmd/compile/internal/ssa/rewritegeneric.go @@ -183,6 +183,14 @@ func rewriteValuegeneric(v *Value, config *Config) bool { return rewriteValuegeneric_OpMul64(v, config) case OpMul8: return rewriteValuegeneric_OpMul8(v, config) + case OpNeg16: + return rewriteValuegeneric_OpNeg16(v, config) + case OpNeg32: + return rewriteValuegeneric_OpNeg32(v, config) + case OpNeg64: + return rewriteValuegeneric_OpNeg64(v, config) + case OpNeg8: + return rewriteValuegeneric_OpNeg8(v, config) case OpNeq16: return rewriteValuegeneric_OpNeq16(v, config) case OpNeq32: @@ -3428,6 +3436,74 @@ func rewriteValuegeneric_OpMul8(v *Value, config *Config) bool { } return false } +func rewriteValuegeneric_OpNeg16(v *Value, config *Config) bool { + b := v.Block + _ = b + // match: (Neg16 (Const16 [c])) + // cond: + // result: (Const16 [-c]) + for { + if v.Args[0].Op != OpConst16 { + break + } + c := v.Args[0].AuxInt + v.reset(OpConst16) + v.AuxInt = -c + return true + } + return false +} +func rewriteValuegeneric_OpNeg32(v *Value, config *Config) bool { + b := v.Block + _ = b + // match: (Neg32 (Const32 [c])) + // cond: + // result: (Const32 [-c]) + for { + if v.Args[0].Op != OpConst32 { + break + } + c := v.Args[0].AuxInt + v.reset(OpConst32) + v.AuxInt = -c + return true + } + return false +} +func rewriteValuegeneric_OpNeg64(v *Value, config *Config) bool { + b := v.Block + _ = b + // match: (Neg64 (Const64 [c])) + // cond: + // result: (Const64 [-c]) + for { + if v.Args[0].Op != OpConst64 { + break + } + c := v.Args[0].AuxInt + v.reset(OpConst64) + v.AuxInt = -c + return true + } + return false +} +func rewriteValuegeneric_OpNeg8(v *Value, config *Config) bool { + b := v.Block + _ = b + // match: (Neg8 (Const8 [c])) + // cond: + // result: (Const8 [-c]) + for { + if v.Args[0].Op != OpConst8 { + break + } + c := v.Args[0].AuxInt + v.reset(OpConst8) + v.AuxInt = -c + return true + } + return false +} func rewriteValuegeneric_OpNeq16(v *Value, config *Config) bool { b := v.Block _ = b