]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/ssa: correct sign extension for consts on riscv64
authorJoel Sing <joel@sing.id.au>
Sat, 20 Mar 2021 13:58:18 +0000 (00:58 +1100)
committerJoel Sing <joel@sing.id.au>
Mon, 22 Mar 2021 16:13:55 +0000 (16:13 +0000)
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>
src/cmd/compile/internal/ssa/gen/RISCV64.rules
src/cmd/compile/internal/ssa/rewriteRISCV64.go

index ec013c11ed161bb6614c11633a1d525f521d1597..9cdd62edbe01c004f4b79951d38a4d5cd123a2a3 100644 (file)
 (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))])
index 767c7dda1f0a313f64ae63af8da0b68f7666a31c..431fb1aaf66e0dd288704707d9ed909780533d4b 100644 (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 _ _))