cmd/compile: avoid zero extension after properly typed atomic operation on riscv64

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>
This commit is contained in:
Joel Sing 2022-08-30 06:32:09 +10:00
parent c011270fa5
commit b6a6847b2f
2 changed files with 50 additions and 0 deletions

View file

@ -686,6 +686,11 @@
(MOVWUreg x:(MOVHUload _ _)) => (MOVDreg x) (MOVWUreg x:(MOVHUload _ _)) => (MOVDreg x)
(MOVWUreg x:(MOVWUload _ _)) => (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. // Fold double extensions.
(MOVBreg x:(MOVBreg _)) => (MOVDreg x) (MOVBreg x:(MOVBreg _)) => (MOVDreg x)
(MOVHreg x:(MOVBreg _)) => (MOVDreg x) (MOVHreg x:(MOVBreg _)) => (MOVDreg x)

View file

@ -3609,6 +3609,51 @@ func rewriteValueRISCV64_OpRISCV64MOVBUreg(v *Value) bool {
v.AddArg(x) v.AddArg(x)
return true 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 _)) // match: (MOVBUreg x:(MOVBUreg _))
// result: (MOVDreg x) // result: (MOVDreg x)
for { for {