[llvm] 91e85cc - [RISCV] Use arithmetic for select c, 0, simm12 even with zicond (#156957)
    via llvm-commits 
    llvm-commits at lists.llvm.org
       
    Thu Sep  4 14:51:17 PDT 2025
    
    
  
Author: Philip Reames
Date: 2025-09-04T14:51:14-07:00
New Revision: 91e85cc950954db04c2e4747ce4d6b523fe81238
URL: https://github.com/llvm/llvm-project/commit/91e85cc950954db04c2e4747ce4d6b523fe81238
DIFF: https://github.com/llvm/llvm-project/commit/91e85cc950954db04c2e4747ce4d6b523fe81238.diff
LOG: [RISCV] Use arithmetic for select c, 0, simm12 even with zicond (#156957)
The arithmetic expansion requires fewer registers, and is often fewer
instructions. The critical path does increase by (up to) one
instruction.
This is a sub-case of the expansion we do without zicond, but restricted
specifically to the simm12 case. In the general case where the other
source is a register using zicond is likely better. (Edit: While
technically true, this is a bit misleading, we do this in
combineSelectToBinOp which is also used in the zicond path, just further
down.)
Added: 
    
Modified: 
    llvm/lib/Target/RISCV/RISCVISelLowering.cpp
    llvm/test/CodeGen/RISCV/cmov-branch-opt.ll
    llvm/test/CodeGen/RISCV/select-const.ll
    llvm/test/CodeGen/RISCV/select.ll
Removed: 
    
################################################################################
diff  --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
index e8891538ede50..f8ec1be1fd8d6 100644
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -9240,6 +9240,10 @@ foldBinOpIntoSelectIfProfitable(SDNode *BO, SelectionDAG &DAG,
   return DAG.getSelect(DL, VT, Sel.getOperand(0), NewT, NewF);
 }
 
+static bool isSimm12Constant(SDValue V) {
+  return isa<ConstantSDNode>(V) && V->getAsAPIntVal().isSignedIntN(12);
+}
+
 SDValue RISCVTargetLowering::lowerSELECT(SDValue Op, SelectionDAG &DAG) const {
   SDValue CondV = Op.getOperand(0);
   SDValue TrueV = Op.getOperand(1);
@@ -9261,6 +9265,20 @@ SDValue RISCVTargetLowering::lowerSELECT(SDValue Op, SelectionDAG &DAG) const {
   // sequence or RISCVISD::SELECT_CC node (branch-based select).
   if ((Subtarget.hasStdExtZicond() || Subtarget.hasVendorXVentanaCondOps()) &&
       VT.isScalarInteger()) {
+
+    // select c, simm12, 0 -> andi (sub x0, c), simm12
+    if (isSimm12Constant(TrueV) && isNullConstant(FalseV)) {
+      SDValue Mask = DAG.getNegative(CondV, DL, VT);
+      return DAG.getNode(ISD::AND, DL, VT, TrueV, Mask);
+    }
+
+    // select c, 0, simm12 -> andi (addi c, -1), simm12
+    if (isNullConstant(TrueV) && isSimm12Constant(FalseV)) {
+      SDValue Mask = DAG.getNode(ISD::ADD, DL, VT, CondV,
+                                 DAG.getSignedConstant(-1, DL, XLenVT));
+      return DAG.getNode(ISD::AND, DL, VT, FalseV, Mask);
+    }
+
     // (select c, t, 0) -> (czero_eqz t, c)
     if (isNullConstant(FalseV))
       return DAG.getNode(RISCVISD::CZERO_EQZ, DL, VT, TrueV, CondV);
diff  --git a/llvm/test/CodeGen/RISCV/cmov-branch-opt.ll b/llvm/test/CodeGen/RISCV/cmov-branch-opt.ll
index 6608874286e34..351b02494ae85 100644
--- a/llvm/test/CodeGen/RISCV/cmov-branch-opt.ll
+++ b/llvm/test/CodeGen/RISCV/cmov-branch-opt.ll
@@ -149,8 +149,9 @@ define signext i32 @test4(i32 signext %x, i32 signext %y, i32 signext %z) {
 ;
 ; CMOV-ZICOND-LABEL: test4:
 ; CMOV-ZICOND:       # %bb.0:
-; CMOV-ZICOND-NEXT:    li a0, 3
-; CMOV-ZICOND-NEXT:    czero.nez a0, a0, a2
+; CMOV-ZICOND-NEXT:    snez a0, a2
+; CMOV-ZICOND-NEXT:    addi a0, a0, -1
+; CMOV-ZICOND-NEXT:    andi a0, a0, 3
 ; CMOV-ZICOND-NEXT:    ret
 ;
 ; SFB-NOZICOND-LABEL: test4:
@@ -164,8 +165,9 @@ define signext i32 @test4(i32 signext %x, i32 signext %y, i32 signext %z) {
 ;
 ; SFB-ZICOND-LABEL: test4:
 ; SFB-ZICOND:       # %bb.0:
-; SFB-ZICOND-NEXT:    li a0, 3
-; SFB-ZICOND-NEXT:    czero.nez a0, a0, a2
+; SFB-ZICOND-NEXT:    snez a0, a2
+; SFB-ZICOND-NEXT:    addi a0, a0, -1
+; SFB-ZICOND-NEXT:    andi a0, a0, 3
 ; SFB-ZICOND-NEXT:    ret
   %c = icmp eq i32 %z, 0
   %a = select i1 %c, i32 3, i32 0
diff  --git a/llvm/test/CodeGen/RISCV/select-const.ll b/llvm/test/CodeGen/RISCV/select-const.ll
index 5b5548d15abca..652018d023b86 100644
--- a/llvm/test/CodeGen/RISCV/select-const.ll
+++ b/llvm/test/CodeGen/RISCV/select-const.ll
@@ -1080,184 +1080,74 @@ define i32 @sext_or_constant2(i32 signext %x) {
 
 
 define i32 @select_0_6(i32 signext %x) {
-; RV32I-LABEL: select_0_6:
-; RV32I:       # %bb.0:
-; RV32I-NEXT:    srai a0, a0, 2
-; RV32I-NEXT:    srli a0, a0, 30
-; RV32I-NEXT:    slli a0, a0, 1
-; RV32I-NEXT:    ret
-;
-; RV32IF-LABEL: select_0_6:
-; RV32IF:       # %bb.0:
-; RV32IF-NEXT:    srai a0, a0, 2
-; RV32IF-NEXT:    srli a0, a0, 30
-; RV32IF-NEXT:    slli a0, a0, 1
-; RV32IF-NEXT:    ret
-;
-; RV32ZICOND-LABEL: select_0_6:
-; RV32ZICOND:       # %bb.0:
-; RV32ZICOND-NEXT:    srli a0, a0, 31
-; RV32ZICOND-NEXT:    li a1, 6
-; RV32ZICOND-NEXT:    czero.eqz a0, a1, a0
-; RV32ZICOND-NEXT:    ret
-;
-; RV64I-LABEL: select_0_6:
-; RV64I:       # %bb.0:
-; RV64I-NEXT:    srai a0, a0, 2
-; RV64I-NEXT:    srli a0, a0, 62
-; RV64I-NEXT:    slli a0, a0, 1
-; RV64I-NEXT:    ret
-;
-; RV64IFD-LABEL: select_0_6:
-; RV64IFD:       # %bb.0:
-; RV64IFD-NEXT:    srai a0, a0, 2
-; RV64IFD-NEXT:    srli a0, a0, 62
-; RV64IFD-NEXT:    slli a0, a0, 1
-; RV64IFD-NEXT:    ret
+; RV32-LABEL: select_0_6:
+; RV32:       # %bb.0:
+; RV32-NEXT:    srai a0, a0, 2
+; RV32-NEXT:    srli a0, a0, 30
+; RV32-NEXT:    slli a0, a0, 1
+; RV32-NEXT:    ret
 ;
-; RV64ZICOND-LABEL: select_0_6:
-; RV64ZICOND:       # %bb.0:
-; RV64ZICOND-NEXT:    srli a0, a0, 63
-; RV64ZICOND-NEXT:    li a1, 6
-; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
-; RV64ZICOND-NEXT:    ret
+; RV64-LABEL: select_0_6:
+; RV64:       # %bb.0:
+; RV64-NEXT:    srai a0, a0, 2
+; RV64-NEXT:    srli a0, a0, 62
+; RV64-NEXT:    slli a0, a0, 1
+; RV64-NEXT:    ret
   %cmp = icmp sgt i32 %x, -1
   %cond = select i1 %cmp, i32 0, i32 6
   ret i32 %cond
 }
 
 define i32 @select_6_0(i32 signext %x) {
-; RV32I-LABEL: select_6_0:
-; RV32I:       # %bb.0:
-; RV32I-NEXT:    srli a0, a0, 31
-; RV32I-NEXT:    addi a0, a0, -1
-; RV32I-NEXT:    andi a0, a0, 6
-; RV32I-NEXT:    ret
-;
-; RV32IF-LABEL: select_6_0:
-; RV32IF:       # %bb.0:
-; RV32IF-NEXT:    srli a0, a0, 31
-; RV32IF-NEXT:    addi a0, a0, -1
-; RV32IF-NEXT:    andi a0, a0, 6
-; RV32IF-NEXT:    ret
-;
-; RV32ZICOND-LABEL: select_6_0:
-; RV32ZICOND:       # %bb.0:
-; RV32ZICOND-NEXT:    srli a0, a0, 31
-; RV32ZICOND-NEXT:    li a1, 6
-; RV32ZICOND-NEXT:    czero.nez a0, a1, a0
-; RV32ZICOND-NEXT:    ret
-;
-; RV64I-LABEL: select_6_0:
-; RV64I:       # %bb.0:
-; RV64I-NEXT:    srli a0, a0, 63
-; RV64I-NEXT:    addi a0, a0, -1
-; RV64I-NEXT:    andi a0, a0, 6
-; RV64I-NEXT:    ret
-;
-; RV64IFD-LABEL: select_6_0:
-; RV64IFD:       # %bb.0:
-; RV64IFD-NEXT:    srli a0, a0, 63
-; RV64IFD-NEXT:    addi a0, a0, -1
-; RV64IFD-NEXT:    andi a0, a0, 6
-; RV64IFD-NEXT:    ret
+; RV32-LABEL: select_6_0:
+; RV32:       # %bb.0:
+; RV32-NEXT:    srli a0, a0, 31
+; RV32-NEXT:    addi a0, a0, -1
+; RV32-NEXT:    andi a0, a0, 6
+; RV32-NEXT:    ret
 ;
-; RV64ZICOND-LABEL: select_6_0:
-; RV64ZICOND:       # %bb.0:
-; RV64ZICOND-NEXT:    srli a0, a0, 63
-; RV64ZICOND-NEXT:    li a1, 6
-; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
-; RV64ZICOND-NEXT:    ret
+; RV64-LABEL: select_6_0:
+; RV64:       # %bb.0:
+; RV64-NEXT:    srli a0, a0, 63
+; RV64-NEXT:    addi a0, a0, -1
+; RV64-NEXT:    andi a0, a0, 6
+; RV64-NEXT:    ret
   %cmp = icmp sgt i32 %x, -1
   %cond = select i1 %cmp, i32 6, i32 0
   ret i32 %cond
 }
 
 define i32 @select_0_394(i32 signext %x) {
-; RV32I-LABEL: select_0_394:
-; RV32I:       # %bb.0:
-; RV32I-NEXT:    srai a0, a0, 31
-; RV32I-NEXT:    andi a0, a0, 394
-; RV32I-NEXT:    ret
-;
-; RV32IF-LABEL: select_0_394:
-; RV32IF:       # %bb.0:
-; RV32IF-NEXT:    srai a0, a0, 31
-; RV32IF-NEXT:    andi a0, a0, 394
-; RV32IF-NEXT:    ret
-;
-; RV32ZICOND-LABEL: select_0_394:
-; RV32ZICOND:       # %bb.0:
-; RV32ZICOND-NEXT:    srli a0, a0, 31
-; RV32ZICOND-NEXT:    li a1, 394
-; RV32ZICOND-NEXT:    czero.eqz a0, a1, a0
-; RV32ZICOND-NEXT:    ret
-;
-; RV64I-LABEL: select_0_394:
-; RV64I:       # %bb.0:
-; RV64I-NEXT:    srai a0, a0, 63
-; RV64I-NEXT:    andi a0, a0, 394
-; RV64I-NEXT:    ret
-;
-; RV64IFD-LABEL: select_0_394:
-; RV64IFD:       # %bb.0:
-; RV64IFD-NEXT:    srai a0, a0, 63
-; RV64IFD-NEXT:    andi a0, a0, 394
-; RV64IFD-NEXT:    ret
+; RV32-LABEL: select_0_394:
+; RV32:       # %bb.0:
+; RV32-NEXT:    srai a0, a0, 31
+; RV32-NEXT:    andi a0, a0, 394
+; RV32-NEXT:    ret
 ;
-; RV64ZICOND-LABEL: select_0_394:
-; RV64ZICOND:       # %bb.0:
-; RV64ZICOND-NEXT:    srli a0, a0, 63
-; RV64ZICOND-NEXT:    li a1, 394
-; RV64ZICOND-NEXT:    czero.eqz a0, a1, a0
-; RV64ZICOND-NEXT:    ret
+; RV64-LABEL: select_0_394:
+; RV64:       # %bb.0:
+; RV64-NEXT:    srai a0, a0, 63
+; RV64-NEXT:    andi a0, a0, 394
+; RV64-NEXT:    ret
   %cmp = icmp sgt i32 %x, -1
   %cond = select i1 %cmp, i32 0, i32 394
   ret i32 %cond
 }
 
 define i32 @select_394_0(i32 signext %x) {
-; RV32I-LABEL: select_394_0:
-; RV32I:       # %bb.0:
-; RV32I-NEXT:    srli a0, a0, 31
-; RV32I-NEXT:    addi a0, a0, -1
-; RV32I-NEXT:    andi a0, a0, 394
-; RV32I-NEXT:    ret
-;
-; RV32IF-LABEL: select_394_0:
-; RV32IF:       # %bb.0:
-; RV32IF-NEXT:    srli a0, a0, 31
-; RV32IF-NEXT:    addi a0, a0, -1
-; RV32IF-NEXT:    andi a0, a0, 394
-; RV32IF-NEXT:    ret
-;
-; RV32ZICOND-LABEL: select_394_0:
-; RV32ZICOND:       # %bb.0:
-; RV32ZICOND-NEXT:    srli a0, a0, 31
-; RV32ZICOND-NEXT:    li a1, 394
-; RV32ZICOND-NEXT:    czero.nez a0, a1, a0
-; RV32ZICOND-NEXT:    ret
-;
-; RV64I-LABEL: select_394_0:
-; RV64I:       # %bb.0:
-; RV64I-NEXT:    srli a0, a0, 63
-; RV64I-NEXT:    addi a0, a0, -1
-; RV64I-NEXT:    andi a0, a0, 394
-; RV64I-NEXT:    ret
-;
-; RV64IFD-LABEL: select_394_0:
-; RV64IFD:       # %bb.0:
-; RV64IFD-NEXT:    srli a0, a0, 63
-; RV64IFD-NEXT:    addi a0, a0, -1
-; RV64IFD-NEXT:    andi a0, a0, 394
-; RV64IFD-NEXT:    ret
+; RV32-LABEL: select_394_0:
+; RV32:       # %bb.0:
+; RV32-NEXT:    srli a0, a0, 31
+; RV32-NEXT:    addi a0, a0, -1
+; RV32-NEXT:    andi a0, a0, 394
+; RV32-NEXT:    ret
 ;
-; RV64ZICOND-LABEL: select_394_0:
-; RV64ZICOND:       # %bb.0:
-; RV64ZICOND-NEXT:    srli a0, a0, 63
-; RV64ZICOND-NEXT:    li a1, 394
-; RV64ZICOND-NEXT:    czero.nez a0, a1, a0
-; RV64ZICOND-NEXT:    ret
+; RV64-LABEL: select_394_0:
+; RV64:       # %bb.0:
+; RV64-NEXT:    srli a0, a0, 63
+; RV64-NEXT:    addi a0, a0, -1
+; RV64-NEXT:    andi a0, a0, 394
+; RV64-NEXT:    ret
   %cmp = icmp sgt i32 %x, -1
   %cond = select i1 %cmp, i32 394, i32 0
   ret i32 %cond
diff  --git a/llvm/test/CodeGen/RISCV/select.ll b/llvm/test/CodeGen/RISCV/select.ll
index 1e7bb4295938b..11585baf0bc59 100644
--- a/llvm/test/CodeGen/RISCV/select.ll
+++ b/llvm/test/CodeGen/RISCV/select.ll
@@ -25,16 +25,18 @@ define i16 @select_xor_1(i16 %A, i8 %cond) {
 ; RV64IMXVTCONDOPS-LABEL: select_xor_1:
 ; RV64IMXVTCONDOPS:       # %bb.0: # %entry
 ; RV64IMXVTCONDOPS-NEXT:    andi a1, a1, 1
-; RV64IMXVTCONDOPS-NEXT:    li a2, 43
-; RV64IMXVTCONDOPS-NEXT:    vt.maskc a1, a2, a1
+; RV64IMXVTCONDOPS-NEXT:    seqz a1, a1
+; RV64IMXVTCONDOPS-NEXT:    addi a1, a1, -1
+; RV64IMXVTCONDOPS-NEXT:    andi a1, a1, 43
 ; RV64IMXVTCONDOPS-NEXT:    xor a0, a0, a1
 ; RV64IMXVTCONDOPS-NEXT:    ret
 ;
 ; CHECKZICOND-LABEL: select_xor_1:
 ; CHECKZICOND:       # %bb.0: # %entry
 ; CHECKZICOND-NEXT:    andi a1, a1, 1
-; CHECKZICOND-NEXT:    li a2, 43
-; CHECKZICOND-NEXT:    czero.eqz a1, a2, a1
+; CHECKZICOND-NEXT:    seqz a1, a1
+; CHECKZICOND-NEXT:    addi a1, a1, -1
+; CHECKZICOND-NEXT:    andi a1, a1, 43
 ; CHECKZICOND-NEXT:    xor a0, a0, a1
 ; CHECKZICOND-NEXT:    ret
 entry:
@@ -66,19 +68,27 @@ define i16 @select_xor_1b(i16 %A, i8 %cond) {
 ;
 ; RV64IMXVTCONDOPS-LABEL: select_xor_1b:
 ; RV64IMXVTCONDOPS:       # %bb.0: # %entry
-; RV64IMXVTCONDOPS-NEXT:    andi a1, a1, 1
-; RV64IMXVTCONDOPS-NEXT:    li a2, 43
-; RV64IMXVTCONDOPS-NEXT:    vt.maskc a1, a2, a1
+; RV64IMXVTCONDOPS-NEXT:    slli a1, a1, 63
+; RV64IMXVTCONDOPS-NEXT:    srai a1, a1, 63
+; RV64IMXVTCONDOPS-NEXT:    andi a1, a1, 43
 ; RV64IMXVTCONDOPS-NEXT:    xor a0, a0, a1
 ; RV64IMXVTCONDOPS-NEXT:    ret
 ;
-; CHECKZICOND-LABEL: select_xor_1b:
-; CHECKZICOND:       # %bb.0: # %entry
-; CHECKZICOND-NEXT:    andi a1, a1, 1
-; CHECKZICOND-NEXT:    li a2, 43
-; CHECKZICOND-NEXT:    czero.eqz a1, a2, a1
-; CHECKZICOND-NEXT:    xor a0, a0, a1
-; CHECKZICOND-NEXT:    ret
+; RV32IMZICOND-LABEL: select_xor_1b:
+; RV32IMZICOND:       # %bb.0: # %entry
+; RV32IMZICOND-NEXT:    slli a1, a1, 31
+; RV32IMZICOND-NEXT:    srai a1, a1, 31
+; RV32IMZICOND-NEXT:    andi a1, a1, 43
+; RV32IMZICOND-NEXT:    xor a0, a0, a1
+; RV32IMZICOND-NEXT:    ret
+;
+; RV64IMZICOND-LABEL: select_xor_1b:
+; RV64IMZICOND:       # %bb.0: # %entry
+; RV64IMZICOND-NEXT:    slli a1, a1, 63
+; RV64IMZICOND-NEXT:    srai a1, a1, 63
+; RV64IMZICOND-NEXT:    andi a1, a1, 43
+; RV64IMZICOND-NEXT:    xor a0, a0, a1
+; RV64IMZICOND-NEXT:    ret
 entry:
  %and = and i8 %cond, 1
  %cmp10 = icmp ne i8 %and, 1
@@ -166,37 +176,13 @@ entry:
 }
 
 define i16 @select_xor_3(i16 %A, i8 %cond) {
-; RV32IM-LABEL: select_xor_3:
-; RV32IM:       # %bb.0: # %entry
-; RV32IM-NEXT:    andi a1, a1, 1
-; RV32IM-NEXT:    addi a1, a1, -1
-; RV32IM-NEXT:    andi a1, a1, 43
-; RV32IM-NEXT:    xor a0, a0, a1
-; RV32IM-NEXT:    ret
-;
-; RV64IM-LABEL: select_xor_3:
-; RV64IM:       # %bb.0: # %entry
-; RV64IM-NEXT:    andi a1, a1, 1
-; RV64IM-NEXT:    addi a1, a1, -1
-; RV64IM-NEXT:    andi a1, a1, 43
-; RV64IM-NEXT:    xor a0, a0, a1
-; RV64IM-NEXT:    ret
-;
-; RV64IMXVTCONDOPS-LABEL: select_xor_3:
-; RV64IMXVTCONDOPS:       # %bb.0: # %entry
-; RV64IMXVTCONDOPS-NEXT:    andi a1, a1, 1
-; RV64IMXVTCONDOPS-NEXT:    li a2, 43
-; RV64IMXVTCONDOPS-NEXT:    vt.maskcn a1, a2, a1
-; RV64IMXVTCONDOPS-NEXT:    xor a0, a0, a1
-; RV64IMXVTCONDOPS-NEXT:    ret
-;
-; CHECKZICOND-LABEL: select_xor_3:
-; CHECKZICOND:       # %bb.0: # %entry
-; CHECKZICOND-NEXT:    andi a1, a1, 1
-; CHECKZICOND-NEXT:    li a2, 43
-; CHECKZICOND-NEXT:    czero.nez a1, a2, a1
-; CHECKZICOND-NEXT:    xor a0, a0, a1
-; CHECKZICOND-NEXT:    ret
+; CHECK-LABEL: select_xor_3:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    andi a1, a1, 1
+; CHECK-NEXT:    addi a1, a1, -1
+; CHECK-NEXT:    andi a1, a1, 43
+; CHECK-NEXT:    xor a0, a0, a1
+; CHECK-NEXT:    ret
 entry:
  %and = and i8 %cond, 1
  %cmp10 = icmp eq i8 %and, 0
@@ -208,37 +194,13 @@ entry:
 ; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of
 ; icmp eq (and %cond, 1), 0
 define i16 @select_xor_3b(i16 %A, i8 %cond) {
-; RV32IM-LABEL: select_xor_3b:
-; RV32IM:       # %bb.0: # %entry
-; RV32IM-NEXT:    andi a1, a1, 1
-; RV32IM-NEXT:    addi a1, a1, -1
-; RV32IM-NEXT:    andi a1, a1, 43
-; RV32IM-NEXT:    xor a0, a0, a1
-; RV32IM-NEXT:    ret
-;
-; RV64IM-LABEL: select_xor_3b:
-; RV64IM:       # %bb.0: # %entry
-; RV64IM-NEXT:    andi a1, a1, 1
-; RV64IM-NEXT:    addi a1, a1, -1
-; RV64IM-NEXT:    andi a1, a1, 43
-; RV64IM-NEXT:    xor a0, a0, a1
-; RV64IM-NEXT:    ret
-;
-; RV64IMXVTCONDOPS-LABEL: select_xor_3b:
-; RV64IMXVTCONDOPS:       # %bb.0: # %entry
-; RV64IMXVTCONDOPS-NEXT:    andi a1, a1, 1
-; RV64IMXVTCONDOPS-NEXT:    li a2, 43
-; RV64IMXVTCONDOPS-NEXT:    vt.maskcn a1, a2, a1
-; RV64IMXVTCONDOPS-NEXT:    xor a0, a0, a1
-; RV64IMXVTCONDOPS-NEXT:    ret
-;
-; CHECKZICOND-LABEL: select_xor_3b:
-; CHECKZICOND:       # %bb.0: # %entry
-; CHECKZICOND-NEXT:    andi a1, a1, 1
-; CHECKZICOND-NEXT:    li a2, 43
-; CHECKZICOND-NEXT:    czero.nez a1, a2, a1
-; CHECKZICOND-NEXT:    xor a0, a0, a1
-; CHECKZICOND-NEXT:    ret
+; CHECK-LABEL: select_xor_3b:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    andi a1, a1, 1
+; CHECK-NEXT:    addi a1, a1, -1
+; CHECK-NEXT:    andi a1, a1, 43
+; CHECK-NEXT:    xor a0, a0, a1
+; CHECK-NEXT:    ret
 entry:
  %and = and i8 %cond, 1
  %cmp10 = icmp ne i8 %and, 1
@@ -730,22 +692,22 @@ define i32 @select_add_3(i1 zeroext %cond, i32 %a) {
 ;
 ; RV64IMXVTCONDOPS-LABEL: select_add_3:
 ; RV64IMXVTCONDOPS:       # %bb.0: # %entry
-; RV64IMXVTCONDOPS-NEXT:    li a2, 42
-; RV64IMXVTCONDOPS-NEXT:    vt.maskcn a0, a2, a0
+; RV64IMXVTCONDOPS-NEXT:    addi a0, a0, -1
+; RV64IMXVTCONDOPS-NEXT:    andi a0, a0, 42
 ; RV64IMXVTCONDOPS-NEXT:    addw a0, a1, a0
 ; RV64IMXVTCONDOPS-NEXT:    ret
 ;
 ; RV32IMZICOND-LABEL: select_add_3:
 ; RV32IMZICOND:       # %bb.0: # %entry
-; RV32IMZICOND-NEXT:    li a2, 42
-; RV32IMZICOND-NEXT:    czero.nez a0, a2, a0
+; RV32IMZICOND-NEXT:    addi a0, a0, -1
+; RV32IMZICOND-NEXT:    andi a0, a0, 42
 ; RV32IMZICOND-NEXT:    add a0, a1, a0
 ; RV32IMZICOND-NEXT:    ret
 ;
 ; RV64IMZICOND-LABEL: select_add_3:
 ; RV64IMZICOND:       # %bb.0: # %entry
-; RV64IMZICOND-NEXT:    li a2, 42
-; RV64IMZICOND-NEXT:    czero.nez a0, a2, a0
+; RV64IMZICOND-NEXT:    addi a0, a0, -1
+; RV64IMZICOND-NEXT:    andi a0, a0, 42
 ; RV64IMZICOND-NEXT:    addw a0, a1, a0
 ; RV64IMZICOND-NEXT:    ret
 entry:
@@ -857,22 +819,22 @@ define i32 @select_sub_3(i1 zeroext %cond, i32 %a) {
 ;
 ; RV64IMXVTCONDOPS-LABEL: select_sub_3:
 ; RV64IMXVTCONDOPS:       # %bb.0: # %entry
-; RV64IMXVTCONDOPS-NEXT:    li a2, 42
-; RV64IMXVTCONDOPS-NEXT:    vt.maskcn a0, a2, a0
+; RV64IMXVTCONDOPS-NEXT:    addi a0, a0, -1
+; RV64IMXVTCONDOPS-NEXT:    andi a0, a0, 42
 ; RV64IMXVTCONDOPS-NEXT:    subw a0, a1, a0
 ; RV64IMXVTCONDOPS-NEXT:    ret
 ;
 ; RV32IMZICOND-LABEL: select_sub_3:
 ; RV32IMZICOND:       # %bb.0: # %entry
-; RV32IMZICOND-NEXT:    li a2, 42
-; RV32IMZICOND-NEXT:    czero.nez a0, a2, a0
+; RV32IMZICOND-NEXT:    addi a0, a0, -1
+; RV32IMZICOND-NEXT:    andi a0, a0, 42
 ; RV32IMZICOND-NEXT:    sub a0, a1, a0
 ; RV32IMZICOND-NEXT:    ret
 ;
 ; RV64IMZICOND-LABEL: select_sub_3:
 ; RV64IMZICOND:       # %bb.0: # %entry
-; RV64IMZICOND-NEXT:    li a2, 42
-; RV64IMZICOND-NEXT:    czero.nez a0, a2, a0
+; RV64IMZICOND-NEXT:    addi a0, a0, -1
+; RV64IMZICOND-NEXT:    andi a0, a0, 42
 ; RV64IMZICOND-NEXT:    subw a0, a1, a0
 ; RV64IMZICOND-NEXT:    ret
 entry:
        
    
    
More information about the llvm-commits
mailing list