]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.18] cmd/compile: fix boolean comparison on RISCV64
authorCherry Mui <cherryyz@google.com>
Tue, 10 May 2022 14:49:33 +0000 (10:49 -0400)
committerThan McIntosh <thanm@google.com>
Mon, 8 Aug 2022 16:24:50 +0000 (16:24 +0000)
Following CL 421457, for RISCV64.

May fix RISCV64 builds.

Updates #52788.
Updates #53397.

Change-Id: Ifc34658703d1e8b97665e7b862060152e3005d71
Reviewed-on: https://go-review.googlesource.com/c/go/+/405553
Reviewed-by: David Chase <drchase@google.com>
Run-TryBot: Cherry Mui <cherryyz@google.com>
Reviewed-on: https://go-review.googlesource.com/c/go/+/421460
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Run-TryBot: Dmitri Shuralyov <dmitshur@golang.org>
Reviewed-by: Cherry Mui <cherryyz@google.com>
src/cmd/compile/internal/ssa/gen/RISCV64.rules
src/cmd/compile/internal/ssa/rewriteRISCV64.go

index 96b24a63808c668c583a012501e1b5fd47e58cc0..7aea622c5e81139212726c98f7c72db9ca9be3c3 100644 (file)
 (AtomicOr32  ...) => (LoweredAtomicOr32  ...)
 
 // Conditional branches
-(If cond yes no) => (BNEZ cond yes no)
+(If cond yes no) => (BNEZ (MOVBUreg <typ.UInt64> cond) yes no)
 
 // Optimizations
 
 (MOVWstore [off] {sym} ptr (MOVDconst [0]) mem) => (MOVWstorezero [off] {sym} ptr mem)
 (MOVDstore [off] {sym} ptr (MOVDconst [0]) mem) => (MOVDstorezero [off] {sym} ptr mem)
 
+// Boolean ops are already extended.
+(MOVBUreg x:((SEQZ|SNEZ) _)) => x
+(MOVBUreg x:((SLT|SLTU) _ _)) => x
+
 // Avoid sign/zero extension for consts.
 (MOVBreg  (MOVDconst [c])) => (MOVDconst [int64(int8(c))])
 (MOVHreg  (MOVDconst [c])) => (MOVDconst [int64(int16(c))])
index a67d13e0da9236fe66dfea98aac714fead304e41..6828d97ff8f7df0e26d9360b776110f5aeeb8c7b 100644 (file)
@@ -3152,6 +3152,46 @@ func rewriteValueRISCV64_OpRISCV64MOVBUload(v *Value) bool {
 func rewriteValueRISCV64_OpRISCV64MOVBUreg(v *Value) bool {
        v_0 := v.Args[0]
        b := v.Block
+       // match: (MOVBUreg x:(SEQZ _))
+       // result: x
+       for {
+               x := v_0
+               if x.Op != OpRISCV64SEQZ {
+                       break
+               }
+               v.copyOf(x)
+               return true
+       }
+       // match: (MOVBUreg x:(SNEZ _))
+       // result: x
+       for {
+               x := v_0
+               if x.Op != OpRISCV64SNEZ {
+                       break
+               }
+               v.copyOf(x)
+               return true
+       }
+       // match: (MOVBUreg x:(SLT _ _))
+       // result: x
+       for {
+               x := v_0
+               if x.Op != OpRISCV64SLT {
+                       break
+               }
+               v.copyOf(x)
+               return true
+       }
+       // match: (MOVBUreg x:(SLTU _ _))
+       // result: x
+       for {
+               x := v_0
+               if x.Op != OpRISCV64SLTU {
+                       break
+               }
+               v.copyOf(x)
+               return true
+       }
        // match: (MOVBUreg (MOVDconst [c]))
        // result: (MOVDconst [int64(uint8(c))])
        for {
@@ -6483,6 +6523,7 @@ func rewriteValueRISCV64_OpZero(v *Value) bool {
        }
 }
 func rewriteBlockRISCV64(b *Block) bool {
+       typ := &b.Func.Config.Types
        switch b.Kind {
        case BlockRISCV64BEQ:
                // match: (BEQ (MOVDconst [0]) cond yes no)
@@ -6690,10 +6731,12 @@ func rewriteBlockRISCV64(b *Block) bool {
                }
        case BlockIf:
                // match: (If cond yes no)
-               // result: (BNEZ cond yes no)
+               // result: (BNEZ (MOVBUreg <typ.UInt64> cond) yes no)
                for {
                        cond := b.Controls[0]
-                       b.resetWithControl(BlockRISCV64BNEZ, cond)
+                       v0 := b.NewValue0(cond.Pos, OpRISCV64MOVBUreg, typ.UInt64)
+                       v0.AddArg(cond)
+                       b.resetWithControl(BlockRISCV64BNEZ, v0)
                        return true
                }
        }