diff --git a/src/cmd/compile/internal/ssa/_gen/RISCV64.rules b/src/cmd/compile/internal/ssa/_gen/RISCV64.rules index 96b9b11cf9..a5d4fb72ec 100644 --- a/src/cmd/compile/internal/ssa/_gen/RISCV64.rules +++ b/src/cmd/compile/internal/ssa/_gen/RISCV64.rules @@ -558,14 +558,16 @@ (BNEZ (SLTIU [x] y) yes no) => (BLTU y (MOVDconst [x]) yes no) // Convert branch with zero to more optimal branch zero. -(BEQ (MOVDconst [0]) cond yes no) => (BEQZ cond yes no) -(BEQ cond (MOVDconst [0]) yes no) => (BEQZ cond yes no) -(BNE (MOVDconst [0]) cond yes no) => (BNEZ cond yes no) -(BNE cond (MOVDconst [0]) yes no) => (BNEZ cond yes no) -(BLT (MOVDconst [0]) cond yes no) => (BGTZ cond yes no) -(BLT cond (MOVDconst [0]) yes no) => (BLTZ cond yes no) -(BGE (MOVDconst [0]) cond yes no) => (BLEZ cond yes no) -(BGE cond (MOVDconst [0]) yes no) => (BGEZ cond yes no) +(BEQ (MOVDconst [0]) cond yes no) => (BEQZ cond yes no) +(BEQ cond (MOVDconst [0]) yes no) => (BEQZ cond yes no) +(BNE (MOVDconst [0]) cond yes no) => (BNEZ cond yes no) +(BNE cond (MOVDconst [0]) yes no) => (BNEZ cond yes no) +(BLT (MOVDconst [0]) cond yes no) => (BGTZ cond yes no) +(BLT cond (MOVDconst [0]) yes no) => (BLTZ cond yes no) +(BLTU (MOVDconst [0]) cond yes no) => (BNEZ cond yes no) +(BGE (MOVDconst [0]) cond yes no) => (BLEZ cond yes no) +(BGE cond (MOVDconst [0]) yes no) => (BGEZ cond yes no) +(BGEU (MOVDconst [0]) cond yes no) => (BEQZ cond yes no) // Remove redundant NEG from SEQZ/SNEZ. (SEQZ (NEG x)) => (SEQZ x) diff --git a/src/cmd/compile/internal/ssa/rewriteRISCV64.go b/src/cmd/compile/internal/ssa/rewriteRISCV64.go index b2318e711b..182ca2d3fd 100644 --- a/src/cmd/compile/internal/ssa/rewriteRISCV64.go +++ b/src/cmd/compile/internal/ssa/rewriteRISCV64.go @@ -9403,6 +9403,18 @@ func rewriteBlockRISCV64(b *Block) bool { b.resetWithControl(BlockRISCV64BGEZ, cond) return true } + case BlockRISCV64BGEU: + // match: (BGEU (MOVDconst [0]) cond yes no) + // result: (BEQZ cond yes no) + for b.Controls[0].Op == OpRISCV64MOVDconst { + v_0 := b.Controls[0] + if auxIntToInt64(v_0.AuxInt) != 0 { + break + } + cond := b.Controls[1] + b.resetWithControl(BlockRISCV64BEQZ, cond) + return true + } case BlockRISCV64BLT: // match: (BLT (MOVDconst [0]) cond yes no) // result: (BGTZ cond yes no) @@ -9426,6 +9438,18 @@ func rewriteBlockRISCV64(b *Block) bool { b.resetWithControl(BlockRISCV64BLTZ, cond) return true } + case BlockRISCV64BLTU: + // match: (BLTU (MOVDconst [0]) cond yes no) + // result: (BNEZ cond yes no) + for b.Controls[0].Op == OpRISCV64MOVDconst { + v_0 := b.Controls[0] + if auxIntToInt64(v_0.AuxInt) != 0 { + break + } + cond := b.Controls[1] + b.resetWithControl(BlockRISCV64BNEZ, cond) + return true + } case BlockRISCV64BNE: // match: (BNE (MOVDconst [0]) cond yes no) // result: (BNEZ cond yes no) diff --git a/test/codegen/compare_and_branch.go b/test/codegen/compare_and_branch.go index c121f1d2cc..759dd26358 100644 --- a/test/codegen/compare_and_branch.go +++ b/test/codegen/compare_and_branch.go @@ -241,4 +241,14 @@ func ui64x0(x chan uint64) { for <-x < 1 { dummy() } + + // riscv64:"BNEZ" + for 0 < <-x { + dummy() + } + + // riscv64:"BEQZ" + for 0 >= <-x { + dummy() + } }