1
0
mirror of https://github.com/golang/go synced 2024-11-26 23:01:23 -07:00

cmd/compile/internal/ssa: correct sign extension for consts on riscv64

Correct sign extension handling for consts on riscv64. This fixes a bug
in part exposed by CL 302609 - previously 64 bit consts were rewritten into
multiple 32 bit consts and the expansion would result in sign/zero extension
not being eliminated. With this change a MOVDconst with a 64 bit value can be
followed by a MOV{B,H,W}reg, which will be eliminated without actually
truncating to a smaller value.

Change-Id: I8d9cd380217466997b341e008a1f139bc11a0d51
Reviewed-on: https://go-review.googlesource.com/c/go/+/303350
Trust: Joel Sing <joel@sing.id.au>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
Joel Sing 2021-03-21 00:58:18 +11:00
parent 5437b5a24b
commit 8fd0f83552
2 changed files with 9 additions and 9 deletions

View File

@ -607,9 +607,9 @@
(MOVDstore [off] {sym} ptr (MOVDconst [0]) mem) => (MOVDstorezero [off] {sym} ptr mem)
// Avoid sign/zero extension for consts.
(MOVBreg (MOVDconst [c])) => (MOVDconst [int64(c)])
(MOVHreg (MOVDconst [c])) => (MOVDconst [int64(c)])
(MOVWreg (MOVDconst [c])) => (MOVDconst [int64(c)])
(MOVBreg (MOVDconst [c])) => (MOVDconst [int64(int8(c))])
(MOVHreg (MOVDconst [c])) => (MOVDconst [int64(int16(c))])
(MOVWreg (MOVDconst [c])) => (MOVDconst [int64(int32(c))])
(MOVBUreg (MOVDconst [c])) => (MOVDconst [int64(uint8(c))])
(MOVHUreg (MOVDconst [c])) => (MOVDconst [int64(uint16(c))])
(MOVWUreg (MOVDconst [c])) => (MOVDconst [int64(uint32(c))])

View File

@ -2985,14 +2985,14 @@ func rewriteValueRISCV64_OpRISCV64MOVBreg(v *Value) bool {
v_0 := v.Args[0]
b := v.Block
// match: (MOVBreg (MOVDconst [c]))
// result: (MOVDconst [int64(c)])
// result: (MOVDconst [int64(int8(c))])
for {
if v_0.Op != OpRISCV64MOVDconst {
break
}
c := auxIntToInt64(v_0.AuxInt)
v.reset(OpRISCV64MOVDconst)
v.AuxInt = int64ToAuxInt(int64(c))
v.AuxInt = int64ToAuxInt(int64(int8(c)))
return true
}
// match: (MOVBreg x:(MOVBload _ _))
@ -3638,14 +3638,14 @@ func rewriteValueRISCV64_OpRISCV64MOVHreg(v *Value) bool {
v_0 := v.Args[0]
b := v.Block
// match: (MOVHreg (MOVDconst [c]))
// result: (MOVDconst [int64(c)])
// result: (MOVDconst [int64(int16(c))])
for {
if v_0.Op != OpRISCV64MOVDconst {
break
}
c := auxIntToInt64(v_0.AuxInt)
v.reset(OpRISCV64MOVDconst)
v.AuxInt = int64ToAuxInt(int64(c))
v.AuxInt = int64ToAuxInt(int64(int16(c)))
return true
}
// match: (MOVHreg x:(MOVBload _ _))
@ -4129,14 +4129,14 @@ func rewriteValueRISCV64_OpRISCV64MOVWreg(v *Value) bool {
v_0 := v.Args[0]
b := v.Block
// match: (MOVWreg (MOVDconst [c]))
// result: (MOVDconst [int64(c)])
// result: (MOVDconst [int64(int32(c))])
for {
if v_0.Op != OpRISCV64MOVDconst {
break
}
c := auxIntToInt64(v_0.AuxInt)
v.reset(OpRISCV64MOVDconst)
v.AuxInt = int64ToAuxInt(int64(c))
v.AuxInt = int64ToAuxInt(int64(int32(c)))
return true
}
// match: (MOVWreg x:(MOVBload _ _))