]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: improve PPC64 rules for AtomicLoad{8,32}
authorLynn Boger <laboger@linux.vnet.ibm.com>
Tue, 5 Oct 2021 15:22:47 +0000 (10:22 -0500)
committerLynn Boger <laboger@linux.vnet.ibm.com>
Wed, 6 Oct 2021 12:54:11 +0000 (12:54 +0000)
This adds a rule to avoid the zero extension after an AtomicLoad8
or AtomicLoad32 since the atomic load has already filled it with
zeros. This eliminates an instruction in a high use block in findObject
and the AtomicLoad8 appears many times within runtime.

Change-Id: I7e684bf73d3812110bd371e05b1aa44fa235fc9b
Reviewed-on: https://go-review.googlesource.com/c/go/+/354029
Run-TryBot: Lynn Boger <laboger@linux.vnet.ibm.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Trust: Lynn Boger <laboger@linux.vnet.ibm.com>

src/cmd/compile/internal/ssa/gen/PPC64.rules
src/cmd/compile/internal/ssa/rewritePPC64.go

index 4c766df4b3ade3f01e3d10b44d82312b850a9488..8e42bae215e09725f089c2df9a7cd0973cc7f0ce 100644 (file)
 (MOVWZreg x:(MOVWZloadidx _ _ _)) => x
 (MOVWreg x:(MOVWload _ _)) => x
 (MOVWreg x:(MOVWloadidx _ _ _)) => x
+(MOVBZreg x:(Select0 (LoweredAtomicLoad8 _ _))) => x
+(MOVWZreg x:(Select0 (LoweredAtomicLoad32 _ _))) => x
 
 // don't extend if argument is already extended
 (MOVBreg x:(Arg <t>)) && is8BitInt(t) && isSigned(t) => x
index b278a4cb4405dfff21e06a6325d71326fa6169a2..1e6624e9064c7d62e7a8f20fb9b5a8f1f1b5fa4a 100644 (file)
@@ -7093,6 +7093,20 @@ func rewriteValuePPC64_OpPPC64MOVBZreg(v *Value) bool {
                v.copyOf(x)
                return true
        }
+       // match: (MOVBZreg x:(Select0 (LoweredAtomicLoad8 _ _)))
+       // result: x
+       for {
+               x := v_0
+               if x.Op != OpSelect0 {
+                       break
+               }
+               x_0 := x.Args[0]
+               if x_0.Op != OpPPC64LoweredAtomicLoad8 {
+                       break
+               }
+               v.copyOf(x)
+               return true
+       }
        // match: (MOVBZreg x:(Arg <t>))
        // cond: is8BitInt(t) && !isSigned(t)
        // result: x
@@ -10549,6 +10563,20 @@ func rewriteValuePPC64_OpPPC64MOVWZreg(v *Value) bool {
                v.copyOf(x)
                return true
        }
+       // match: (MOVWZreg x:(Select0 (LoweredAtomicLoad32 _ _)))
+       // result: x
+       for {
+               x := v_0
+               if x.Op != OpSelect0 {
+                       break
+               }
+               x_0 := x.Args[0]
+               if x_0.Op != OpPPC64LoweredAtomicLoad32 {
+                       break
+               }
+               v.copyOf(x)
+               return true
+       }
        // match: (MOVWZreg x:(Arg <t>))
        // cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !isSigned(t)
        // result: x