diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoZb.td b/llvm/lib/Target/RISCV/RISCVInstrInfoZb.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoZb.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoZb.td @@ -850,6 +850,13 @@ def : Pat<(xor GPR:$rs1, (not GPR:$rs2)), (XNOR GPR:$rs1, GPR:$rs2)>; } // Predicates = [HasStdExtZbbOrZbpOrZbkb] +let Predicates = [HasStdExtZbb] in { +def : Pat<(or (setult GPR:$rs1, GPR:$rs3), (setult GPR:$rs2, GPR:$rs3)), + (SLTU (MINU GPR:$rs1, GPR:$rs2), GPR:$rs3)>; +def : Pat<(and (setuge GPR:$rs1, GPR:$rs3), (setuge GPR:$rs2, GPR:$rs3)), + (XORI (SLTU (MINU GPR:$rs1, GPR:$rs2), GPR:$rs3), 1)>; +} // Predicates = [HasStdExtZbb] + let Predicates = [HasStdExtZbbOrZbpOrZbkb] in { def : PatGprGpr, ROL>; def : PatGprGpr, ROR>; diff --git a/llvm/test/CodeGen/RISCV/minu.ll b/llvm/test/CodeGen/RISCV/minu.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/minu.ll @@ -0,0 +1,14 @@ +; RUN: llc -march=riscv64 -mattr=+v,+zbb -O3 < %s \ +; RUN: | FileCheck %s + + +define i1 @test(i64 %c, i64 %a, i64 %b) { +entry: + %cmp0 = icmp ult i64 %a, %c + %cmp1 = icmp ult i64 %b, %c + %res = or i1 %cmp0, %cmp1 +; CHECK: minu [[REG1:a[0-9]+]], [[REG1]], [[REG2:a[0-9]+]] +; CHECK: sltu [[REG0:a[0-9]+]], [[REG1]], [[REG0]] + ret i1 %res +} + diff --git a/llvm/test/CodeGen/RISCV/minu_xori.ll b/llvm/test/CodeGen/RISCV/minu_xori.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/minu_xori.ll @@ -0,0 +1,15 @@ +; RUN: llc -march=riscv64 -mattr=+v,+zbb -O3 < %s \ +; RUN: | FileCheck %s + + +define i1 @test(i64 %c, i64 %a, i64 %b) { +entry: + %cmp0 = icmp uge i64 %a, %c + %cmp1 = icmp uge i64 %b, %c + %res = and i1 %cmp0, %cmp1 +; CHECK: minu [[REG1:a[0-9]+]], [[REG1]], [[REG2:a[0-9]+]] +; CHECK: sltu [[REG0:a[0-9]+]], [[REG1]], [[REG0]] +; CHECK: xori [[REG0]], [[REG0]], 1 + ret i1 %res +} +