[llvm] [RISCV] Move combineANDOfSETCCToCZERO to isel patterns. (PR #219318)

Afonso Bordado via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 28 03:17:34 PDT 2026


================
@@ -577,6 +976,107 @@ define i64 @select_w_minsize(i64 %true, i64 %false, i1 zeroext %c) minsize {
 ; RV64ZICOND-NEXT:    mv a0, a1
 ; RV64ZICOND-NEXT:  .LBB20_2:
 ; RV64ZICOND-NEXT:    ret
+;
+; RV32XVENTANACONDOPS-LABEL: select_w_minsize:
+; RV32XVENTANACONDOPS:       # %bb.0:
+; RV32XVENTANACONDOPS-NEXT:    bnez a4, .LBB20_2
+; RV32XVENTANACONDOPS-NEXT:  # %bb.1:
+; RV32XVENTANACONDOPS-NEXT:    mv a0, a2
+; RV32XVENTANACONDOPS-NEXT:    mv a1, a3
+; RV32XVENTANACONDOPS-NEXT:  .LBB20_2:
+; RV32XVENTANACONDOPS-NEXT:    ret
+;
+; RV64XVENTANACONDOPS-LABEL: select_w_minsize:
+; RV64XVENTANACONDOPS:       # %bb.0:
+; RV64XVENTANACONDOPS-NEXT:    bnez a2, .LBB20_2
+; RV64XVENTANACONDOPS-NEXT:  # %bb.1:
+; RV64XVENTANACONDOPS-NEXT:    mv a0, a1
+; RV64XVENTANACONDOPS-NEXT:  .LBB20_2:
+; RV64XVENTANACONDOPS-NEXT:    ret
   %r = select i1 %c, i64 %true, i64 %false
   ret i64 %r
 }
+
+; (and (icmp x, C, eq), (icmp y, C, eq)) -> (czero.eqz (icmp x, 0, eq), (addi x, -C))
+define i32 @and_icmp_eq_non_zero(i64 %x, i64 %y) {
+; RV32ZICOND-LABEL: and_icmp_eq_non_zero:
+; RV32ZICOND:       # %bb.0:
+; RV32ZICOND-NEXT:    srli a3, a3, 31
+; RV32ZICOND-NEXT:    xori a0, a0, 1234
+; RV32ZICOND-NEXT:    or a0, a0, a1
+; RV32ZICOND-NEXT:    czero.nez a0, a3, a0
+; RV32ZICOND-NEXT:    ret
+;
+; RV64ZICOND-LABEL: and_icmp_eq_non_zero:
+; RV64ZICOND:       # %bb.0:
+; RV64ZICOND-NEXT:    srli a1, a1, 63
+; RV64ZICOND-NEXT:    addi a0, a0, -1234
+; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
+; RV64ZICOND-NEXT:    ret
+;
+; RV32XVENTANACONDOPS-LABEL: and_icmp_eq_non_zero:
+; RV32XVENTANACONDOPS:       # %bb.0:
+; RV32XVENTANACONDOPS-NEXT:    srli a3, a3, 31
+; RV32XVENTANACONDOPS-NEXT:    xori a0, a0, 1234
+; RV32XVENTANACONDOPS-NEXT:    or a0, a0, a1
+; RV32XVENTANACONDOPS-NEXT:    vt.maskcn a0, a3, a0
+; RV32XVENTANACONDOPS-NEXT:    ret
+;
+; RV64XVENTANACONDOPS-LABEL: and_icmp_eq_non_zero:
+; RV64XVENTANACONDOPS:       # %bb.0:
+; RV64XVENTANACONDOPS-NEXT:    srli a1, a1, 63
+; RV64XVENTANACONDOPS-NEXT:    addi a0, a0, -1234
+; RV64XVENTANACONDOPS-NEXT:    vt.maskcn a0, a1, a0
+; RV64XVENTANACONDOPS-NEXT:    ret
+
+  %3 = icmp slt i64 %y, 0
+  %4 = icmp eq i64 %x, 1234
+  %5 = and i1 %4, %3
+  %6 = zext i1 %5 to i32
+  ret i32 %6
+}
+
+; (and (icmp x, C, ne), (icmp y, C, ne)) -> (czero.eqz (icmp x, 0, ne), (addi x, -C))
+define i32 @and_icmp_ne_non_zero(i64 %x, i64 %y) {
+; RV32ZICOND-LABEL: and_icmp_ne_non_zero:
+; RV32ZICOND:       # %bb.0:
+; RV32ZICOND-NEXT:    xori a2, a2, 1234
+; RV32ZICOND-NEXT:    or a2, a2, a3
+; RV32ZICOND-NEXT:    xori a0, a0, 1234
+; RV32ZICOND-NEXT:    snez a2, a2
+; RV32ZICOND-NEXT:    or a0, a0, a1
+; RV32ZICOND-NEXT:    czero.eqz a0, a2, a0
+; RV32ZICOND-NEXT:    ret
+;
+; RV64ZICOND-LABEL: and_icmp_ne_non_zero:
+; RV64ZICOND:       # %bb.0:
+; RV64ZICOND-NEXT:    addi a1, a1, -1234
+; RV64ZICOND-NEXT:    snez a1, a1
+; RV64ZICOND-NEXT:    addi a0, a0, -1234
+; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
+; RV64ZICOND-NEXT:    ret
+;
+; RV32XVENTANACONDOPS-LABEL: and_icmp_ne_non_zero:
+; RV32XVENTANACONDOPS:       # %bb.0:
+; RV32XVENTANACONDOPS-NEXT:    xori a2, a2, 1234
+; RV32XVENTANACONDOPS-NEXT:    or a2, a2, a3
+; RV32XVENTANACONDOPS-NEXT:    xori a0, a0, 1234
+; RV32XVENTANACONDOPS-NEXT:    snez a2, a2
+; RV32XVENTANACONDOPS-NEXT:    or a0, a0, a1
+; RV32XVENTANACONDOPS-NEXT:    vt.maskc a0, a2, a0
+; RV32XVENTANACONDOPS-NEXT:    ret
+;
+; RV64XVENTANACONDOPS-LABEL: and_icmp_ne_non_zero:
+; RV64XVENTANACONDOPS:       # %bb.0:
+; RV64XVENTANACONDOPS-NEXT:    addi a1, a1, -1234
+; RV64XVENTANACONDOPS-NEXT:    snez a1, a1
+; RV64XVENTANACONDOPS-NEXT:    addi a0, a0, -1234
+; RV64XVENTANACONDOPS-NEXT:    vt.maskc a0, a1, a0
+; RV64XVENTANACONDOPS-NEXT:    ret
+
+  %3 = icmp ne i64 %y, 1234
+  %4 = icmp ne i64 %x, 1234
+  %5 = and i1 %4, %3
+  %6 = zext i1 %5 to i32
+  ret i32 %6
+}
----------------
afonso360 wrote:

Sorry about this, I didn't notice this failure on the other PR. Just to double check this was caught when running the llvm-test-suite with RVV right? I can do that before submitting in future PR's

https://github.com/llvm/llvm-project/pull/219318


More information about the llvm-commits mailing list