]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: avoid zero extension after properly typed atomic operation on riscv64
authorJoel Sing <joel@sing.id.au>
Mon, 29 Aug 2022 20:32:09 +0000 (06:32 +1000)
committerJoel Sing <joel@sing.id.au>
Wed, 7 Sep 2022 05:38:50 +0000 (05:38 +0000)
LoweredAtomicLoad8 is implemented using MOVBU, hence it is already zero
extended. LoweredAtomicCas32 and LoweredAtomicCas64 return a properly
typed boolean.

Change-Id: Ie0acbaa19403d59c7e5f76d060cc13ee51eb7834
Reviewed-on: https://go-review.googlesource.com/c/go/+/428214
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Joel Sing <joel@sing.id.au>

src/cmd/compile/internal/ssa/gen/RISCV64.rules
src/cmd/compile/internal/ssa/rewriteRISCV64.go

index 0207fb45d68bd13a6d4b69457df04a58bf8baec0..385f004b225504e1ee970360e7d2307a1111725f 100644 (file)
 (MOVWUreg x:(MOVHUload _ _)) => (MOVDreg x)
 (MOVWUreg x:(MOVWUload _ _)) => (MOVDreg x)
 
+// Avoid zero extension after properly typed atomic operation.
+(MOVBUreg x:(Select0 (LoweredAtomicLoad8 _ _))) => (MOVDreg x)
+(MOVBUreg x:(Select0 (LoweredAtomicCas32 _ _ _ _))) => (MOVDreg x)
+(MOVBUreg x:(Select0 (LoweredAtomicCas64 _ _ _ _))) => (MOVDreg x)
+
 // Fold double extensions.
 (MOVBreg  x:(MOVBreg  _)) => (MOVDreg x)
 (MOVHreg  x:(MOVBreg  _)) => (MOVDreg x)
index 908456b0aa074284475f9dfd942409cd2c755e5f..ac0770639eab0e12feb9be322d456dd84004e6e1 100644 (file)
@@ -3609,6 +3609,51 @@ func rewriteValueRISCV64_OpRISCV64MOVBUreg(v *Value) bool {
                v.AddArg(x)
                return true
        }
+       // match: (MOVBUreg x:(Select0 (LoweredAtomicLoad8 _ _)))
+       // result: (MOVDreg x)
+       for {
+               x := v_0
+               if x.Op != OpSelect0 {
+                       break
+               }
+               x_0 := x.Args[0]
+               if x_0.Op != OpRISCV64LoweredAtomicLoad8 {
+                       break
+               }
+               v.reset(OpRISCV64MOVDreg)
+               v.AddArg(x)
+               return true
+       }
+       // match: (MOVBUreg x:(Select0 (LoweredAtomicCas32 _ _ _ _)))
+       // result: (MOVDreg x)
+       for {
+               x := v_0
+               if x.Op != OpSelect0 {
+                       break
+               }
+               x_0 := x.Args[0]
+               if x_0.Op != OpRISCV64LoweredAtomicCas32 {
+                       break
+               }
+               v.reset(OpRISCV64MOVDreg)
+               v.AddArg(x)
+               return true
+       }
+       // match: (MOVBUreg x:(Select0 (LoweredAtomicCas64 _ _ _ _)))
+       // result: (MOVDreg x)
+       for {
+               x := v_0
+               if x.Op != OpSelect0 {
+                       break
+               }
+               x_0 := x.Args[0]
+               if x_0.Op != OpRISCV64LoweredAtomicCas64 {
+                       break
+               }
+               v.reset(OpRISCV64MOVDreg)
+               v.AddArg(x)
+               return true
+       }
        // match: (MOVBUreg x:(MOVBUreg _))
        // result: (MOVDreg x)
        for {