From b7e0dfc437edf6d744dfdf9f4613bee26ea08e31 Mon Sep 17 00:00:00 2001 From: Lynn Boger Date: Tue, 12 Sep 2023 09:34:43 -0500 Subject: [PATCH] cmd/compile: add rules to avoid unnecessary MOVDaddr for PPC64 This adds some rules to recognize MOVDaddr in those cases where it is just adding 0 to a ptr value. Instead the ptr value can just be used. Change-Id: I95188defc9701165c86bbea70d14d037a9e54853 Reviewed-on: https://go-review.googlesource.com/c/go/+/527698 Reviewed-by: Matthew Dempsky TryBot-Result: Gopher Robot Reviewed-by: Paul Murphy Run-TryBot: Lynn Boger Reviewed-by: Than McIntosh --- src/cmd/compile/internal/ssa/_gen/PPC64.rules | 2 ++ src/cmd/compile/internal/ssa/rewritePPC64.go | 35 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/cmd/compile/internal/ssa/_gen/PPC64.rules b/src/cmd/compile/internal/ssa/_gen/PPC64.rules index 4c4f7c8c17..c5309f16c6 100644 --- a/src/cmd/compile/internal/ssa/_gen/PPC64.rules +++ b/src/cmd/compile/internal/ssa/_gen/PPC64.rules @@ -238,6 +238,8 @@ (LocalAddr {sym} base mem) && t.Elem().HasPointers() => (MOVDaddr {sym} (SPanchored base mem)) (LocalAddr {sym} base _) && !t.Elem().HasPointers() => (MOVDaddr {sym} base) (OffPtr [off] ptr) => (ADD (MOVDconst [off]) ptr) +(MOVDaddr {sym} [n] p:(ADD x y)) && sym == nil && n == 0 => p +(MOVDaddr {sym} [n] ptr) && sym == nil && n == 0 && (ptr.Op == OpArgIntReg || ptr.Op == OpPhi) => ptr // TODO: optimize these cases? (Ctz32NonZero ...) => (Ctz32 ...) diff --git a/src/cmd/compile/internal/ssa/rewritePPC64.go b/src/cmd/compile/internal/ssa/rewritePPC64.go index 2bcc27fbc8..089e4e614c 100644 --- a/src/cmd/compile/internal/ssa/rewritePPC64.go +++ b/src/cmd/compile/internal/ssa/rewritePPC64.go @@ -533,6 +533,8 @@ func rewriteValuePPC64(v *Value) bool { return rewriteValuePPC64_OpPPC64MOVBstoreidx(v) case OpPPC64MOVBstorezero: return rewriteValuePPC64_OpPPC64MOVBstorezero(v) + case OpPPC64MOVDaddr: + return rewriteValuePPC64_OpPPC64MOVDaddr(v) case OpPPC64MOVDload: return rewriteValuePPC64_OpPPC64MOVDload(v) case OpPPC64MOVDloadidx: @@ -7778,6 +7780,39 @@ func rewriteValuePPC64_OpPPC64MOVBstorezero(v *Value) bool { } return false } +func rewriteValuePPC64_OpPPC64MOVDaddr(v *Value) bool { + v_0 := v.Args[0] + // match: (MOVDaddr {sym} [n] p:(ADD x y)) + // cond: sym == nil && n == 0 + // result: p + for { + n := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) + p := v_0 + if p.Op != OpPPC64ADD { + break + } + if !(sym == nil && n == 0) { + break + } + v.copyOf(p) + return true + } + // match: (MOVDaddr {sym} [n] ptr) + // cond: sym == nil && n == 0 && (ptr.Op == OpArgIntReg || ptr.Op == OpPhi) + // result: ptr + for { + n := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) + ptr := v_0 + if !(sym == nil && n == 0 && (ptr.Op == OpArgIntReg || ptr.Op == OpPhi)) { + break + } + v.copyOf(ptr) + return true + } + return false +} func rewriteValuePPC64_OpPPC64MOVDload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] -- 2.50.0