[llvm] [RISCV] Use short forward branch for ISD::ABS. (PR #72958)

via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 20 22:19:17 PST 2023


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-risc-v

Author: Craig Topper (topperc)

<details>
<summary>Changes</summary>

We can use short forward branch to conditionally negate if the value is negative.

---

Patch is 38.55 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/72958.diff


3 Files Affected:

- (modified) llvm/lib/Target/RISCV/RISCVISelLowering.cpp (+6-1) 
- (modified) llvm/lib/Target/RISCV/RISCVInstrInfo.td (+13) 
- (modified) llvm/test/CodeGen/RISCV/short-forward-branch-opt.ll (+807-199) 


``````````diff
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
index 26190337eb3bd1b..d3df513813f270c 100644
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -396,9 +396,14 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
       setOperationAction(ISD::CTLZ, MVT::i32, Expand);
   }
 
-  if (!RV64LegalI32 && Subtarget.is64Bit())
+  if (!RV64LegalI32 && Subtarget.is64Bit() &&
+      !Subtarget.hasShortForwardBranchOpt())
     setOperationAction(ISD::ABS, MVT::i32, Custom);
 
+  // We can use PseudoCCSUB to implement ABS.
+  if (Subtarget.hasShortForwardBranchOpt())
+    setOperationAction(ISD::ABS, XLenVT, Legal);
+
   if (!Subtarget.hasVendorXTHeadCondMov())
     setOperationAction(ISD::SELECT, XLenVT, Custom);
 
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td
index af34e026bed1488..0f1d1d4cb23cee3 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td
@@ -1242,6 +1242,10 @@ def anyext_oneuse : unop_oneuse<anyext>;
 def ext_oneuse    : unop_oneuse<ext>;
 def fpext_oneuse  : unop_oneuse<any_fpextend>;
 
+def 33signbits_node : PatLeaf<(i64 GPR:$src), [{
+  return CurDAG->ComputeNumSignBits(SDValue(N, 0)) > 32;
+}]>;
+
 /// Simple arithmetic operations
 
 def : PatGprGpr<add, ADD>;
@@ -2002,6 +2006,15 @@ def : Pat<(binop_allwusers<add> GPR:$rs1, (AddiPair:$rs2)),
                  (AddiPairImmSmall AddiPair:$rs2))>;
 }
 
+let Predicates = [HasShortForwardBranchOpt] in
+def : Pat<(XLenVT (abs GPR:$rs1)),
+          (PseudoCCSUB (XLenVT GPR:$rs1), (XLenVT X0), /* COND_LT */ 2,
+           (XLenVT GPR:$rs1), (XLenVT X0), (XLenVT GPR:$rs1))>;
+let Predicates = [HasShortForwardBranchOpt, IsRV64] in
+def : Pat<(sext_inreg (abs 33signbits_node:$rs1), i32),
+          (PseudoCCSUBW (i64 GPR:$rs1), (i64 X0), /* COND_LT */ 2,
+           (XLenVT GPR:$rs1), (i64 X0), (i64 GPR:$rs1))>;
+
 //===----------------------------------------------------------------------===//
 // Experimental RV64 i32 legalization patterns.
 //===----------------------------------------------------------------------===//
diff --git a/llvm/test/CodeGen/RISCV/short-forward-branch-opt.ll b/llvm/test/CodeGen/RISCV/short-forward-branch-opt.ll
index a91f726eb06df2e..725b8fd6eeea6b3 100644
--- a/llvm/test/CodeGen/RISCV/short-forward-branch-opt.ll
+++ b/llvm/test/CodeGen/RISCV/short-forward-branch-opt.ll
@@ -2,9 +2,11 @@
 ; RUN: llc -mtriple=riscv64 -mattr=+c -verify-machineinstrs < %s \
 ; RUN:   | FileCheck -check-prefix=NOSFB %s
 ; RUN: llc -mtriple=riscv64 -mcpu=sifive-u74 -verify-machineinstrs < %s \
-; RUN:   | FileCheck -check-prefixes=SFB,NOZICOND %s
+; RUN:   | FileCheck -check-prefixes=SFB,NOZICOND,RV64SFB %s
 ; RUN: llc -mtriple=riscv64 -mcpu=sifive-u74 -mattr=+experimental-zicond \
 ; RUN:   -verify-machineinstrs < %s | FileCheck -check-prefixes=SFB,ZICOND %s
+; RUN: llc -mtriple=riscv32 -mcpu=sifive-e76 -verify-machineinstrs < %s \
+; RUN:   | FileCheck -check-prefixes=SFB,NOZICOND,RV32SFB %s
 
 ; The sifive-7-series can predicate a mv.
 
@@ -65,18 +67,44 @@ define signext i32 @test3(i32 signext %v, i32 signext %w, i32 signext %x, i32 si
 ; NOSFB-NEXT:    addw a0, a1, a2
 ; NOSFB-NEXT:    ret
 ;
-; SFB-LABEL: test3:
-; SFB:       # %bb.0:
-; SFB-NEXT:    bnez a4, .LBB2_2
-; SFB-NEXT:  # %bb.1:
-; SFB-NEXT:    mv a0, a1
-; SFB-NEXT:  .LBB2_2:
-; SFB-NEXT:    beqz a4, .LBB2_4
-; SFB-NEXT:  # %bb.3:
-; SFB-NEXT:    mv a2, a3
-; SFB-NEXT:  .LBB2_4:
-; SFB-NEXT:    addw a0, a0, a2
-; SFB-NEXT:    ret
+; RV64SFB-LABEL: test3:
+; RV64SFB:       # %bb.0:
+; RV64SFB-NEXT:    bnez a4, .LBB2_2
+; RV64SFB-NEXT:  # %bb.1:
+; RV64SFB-NEXT:    mv a0, a1
+; RV64SFB-NEXT:  .LBB2_2:
+; RV64SFB-NEXT:    beqz a4, .LBB2_4
+; RV64SFB-NEXT:  # %bb.3:
+; RV64SFB-NEXT:    mv a2, a3
+; RV64SFB-NEXT:  .LBB2_4:
+; RV64SFB-NEXT:    addw a0, a0, a2
+; RV64SFB-NEXT:    ret
+;
+; ZICOND-LABEL: test3:
+; ZICOND:       # %bb.0:
+; ZICOND-NEXT:    bnez a4, .LBB2_2
+; ZICOND-NEXT:  # %bb.1:
+; ZICOND-NEXT:    mv a0, a1
+; ZICOND-NEXT:  .LBB2_2:
+; ZICOND-NEXT:    beqz a4, .LBB2_4
+; ZICOND-NEXT:  # %bb.3:
+; ZICOND-NEXT:    mv a2, a3
+; ZICOND-NEXT:  .LBB2_4:
+; ZICOND-NEXT:    addw a0, a0, a2
+; ZICOND-NEXT:    ret
+;
+; RV32SFB-LABEL: test3:
+; RV32SFB:       # %bb.0:
+; RV32SFB-NEXT:    bnez a4, .LBB2_2
+; RV32SFB-NEXT:  # %bb.1:
+; RV32SFB-NEXT:    mv a0, a1
+; RV32SFB-NEXT:  .LBB2_2:
+; RV32SFB-NEXT:    beqz a4, .LBB2_4
+; RV32SFB-NEXT:  # %bb.3:
+; RV32SFB-NEXT:    mv a2, a3
+; RV32SFB-NEXT:  .LBB2_4:
+; RV32SFB-NEXT:    add a0, a0, a2
+; RV32SFB-NEXT:    ret
   %c = icmp eq i32 %z, 0
   %a = select i1 %c, i32 %w, i32 %v
   %b = select i1 %c, i32 %x, i32 %y
@@ -413,31 +441,83 @@ define void @sextw_removal_ccor(i1 %c, i32 signext %arg, i32 signext %arg1, i32
 ; NOSFB-NEXT:    addi sp, sp, 32
 ; NOSFB-NEXT:    ret
 ;
-; SFB-LABEL: sextw_removal_ccor:
-; SFB:       # %bb.0: # %bb
-; SFB-NEXT:    addi sp, sp, -32
-; SFB-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
-; SFB-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
-; SFB-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
-; SFB-NEXT:    mv s0, a3
-; SFB-NEXT:    andi a0, a0, 1
-; SFB-NEXT:    mv s1, a2
-; SFB-NEXT:    beqz a0, .LBB15_4
-; SFB-NEXT:  # %bb.3: # %bb
-; SFB-NEXT:    or s0, a3, a1
-; SFB-NEXT:  .LBB15_4: # %bb
-; SFB-NEXT:  .LBB15_1: # %bb2
-; SFB-NEXT:    # =>This Inner Loop Header: Depth=1
-; SFB-NEXT:    mv a0, s0
-; SFB-NEXT:    call bar at plt
-; SFB-NEXT:    sllw s0, s0, s1
-; SFB-NEXT:    bnez a0, .LBB15_1
-; SFB-NEXT:  # %bb.2: # %bb7
-; SFB-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
-; SFB-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
-; SFB-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
-; SFB-NEXT:    addi sp, sp, 32
-; SFB-NEXT:    ret
+; RV64SFB-LABEL: sextw_removal_ccor:
+; RV64SFB:       # %bb.0: # %bb
+; RV64SFB-NEXT:    addi sp, sp, -32
+; RV64SFB-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
+; RV64SFB-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
+; RV64SFB-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
+; RV64SFB-NEXT:    mv s0, a3
+; RV64SFB-NEXT:    andi a0, a0, 1
+; RV64SFB-NEXT:    mv s1, a2
+; RV64SFB-NEXT:    beqz a0, .LBB15_4
+; RV64SFB-NEXT:  # %bb.3: # %bb
+; RV64SFB-NEXT:    or s0, a3, a1
+; RV64SFB-NEXT:  .LBB15_4: # %bb
+; RV64SFB-NEXT:  .LBB15_1: # %bb2
+; RV64SFB-NEXT:    # =>This Inner Loop Header: Depth=1
+; RV64SFB-NEXT:    mv a0, s0
+; RV64SFB-NEXT:    call bar at plt
+; RV64SFB-NEXT:    sllw s0, s0, s1
+; RV64SFB-NEXT:    bnez a0, .LBB15_1
+; RV64SFB-NEXT:  # %bb.2: # %bb7
+; RV64SFB-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
+; RV64SFB-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
+; RV64SFB-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
+; RV64SFB-NEXT:    addi sp, sp, 32
+; RV64SFB-NEXT:    ret
+;
+; ZICOND-LABEL: sextw_removal_ccor:
+; ZICOND:       # %bb.0: # %bb
+; ZICOND-NEXT:    addi sp, sp, -32
+; ZICOND-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
+; ZICOND-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
+; ZICOND-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
+; ZICOND-NEXT:    mv s0, a3
+; ZICOND-NEXT:    andi a0, a0, 1
+; ZICOND-NEXT:    mv s1, a2
+; ZICOND-NEXT:    beqz a0, .LBB15_4
+; ZICOND-NEXT:  # %bb.3: # %bb
+; ZICOND-NEXT:    or s0, a3, a1
+; ZICOND-NEXT:  .LBB15_4: # %bb
+; ZICOND-NEXT:  .LBB15_1: # %bb2
+; ZICOND-NEXT:    # =>This Inner Loop Header: Depth=1
+; ZICOND-NEXT:    mv a0, s0
+; ZICOND-NEXT:    call bar at plt
+; ZICOND-NEXT:    sllw s0, s0, s1
+; ZICOND-NEXT:    bnez a0, .LBB15_1
+; ZICOND-NEXT:  # %bb.2: # %bb7
+; ZICOND-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
+; ZICOND-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
+; ZICOND-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
+; ZICOND-NEXT:    addi sp, sp, 32
+; ZICOND-NEXT:    ret
+;
+; RV32SFB-LABEL: sextw_removal_ccor:
+; RV32SFB:       # %bb.0: # %bb
+; RV32SFB-NEXT:    addi sp, sp, -16
+; RV32SFB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
+; RV32SFB-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
+; RV32SFB-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
+; RV32SFB-NEXT:    mv s0, a3
+; RV32SFB-NEXT:    andi a0, a0, 1
+; RV32SFB-NEXT:    mv s1, a2
+; RV32SFB-NEXT:    beqz a0, .LBB15_4
+; RV32SFB-NEXT:  # %bb.3: # %bb
+; RV32SFB-NEXT:    or s0, a3, a1
+; RV32SFB-NEXT:  .LBB15_4: # %bb
+; RV32SFB-NEXT:  .LBB15_1: # %bb2
+; RV32SFB-NEXT:    # =>This Inner Loop Header: Depth=1
+; RV32SFB-NEXT:    mv a0, s0
+; RV32SFB-NEXT:    call bar at plt
+; RV32SFB-NEXT:    sll s0, s0, s1
+; RV32SFB-NEXT:    bnez a0, .LBB15_1
+; RV32SFB-NEXT:  # %bb.2: # %bb7
+; RV32SFB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
+; RV32SFB-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
+; RV32SFB-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
+; RV32SFB-NEXT:    addi sp, sp, 16
+; RV32SFB-NEXT:    ret
 bb:
   %sel = select i1 %c, i32 %arg, i32 0
   %or = or i32 %sel, %arg2
@@ -480,31 +560,83 @@ define void @sextw_removal_ccaddw(i1 %c, i32 signext %arg, i32 signext %arg1, i3
 ; NOSFB-NEXT:    addi sp, sp, 32
 ; NOSFB-NEXT:    ret
 ;
-; SFB-LABEL: sextw_removal_ccaddw:
-; SFB:       # %bb.0: # %bb
-; SFB-NEXT:    addi sp, sp, -32
-; SFB-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
-; SFB-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
-; SFB-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
-; SFB-NEXT:    mv s0, a1
-; SFB-NEXT:    andi a0, a0, 1
-; SFB-NEXT:    mv s1, a2
-; SFB-NEXT:    beqz a0, .LBB16_4
-; SFB-NEXT:  # %bb.3: # %bb
-; SFB-NEXT:    addw s0, a1, a3
-; SFB-NEXT:  .LBB16_4: # %bb
-; SFB-NEXT:  .LBB16_1: # %bb2
-; SFB-NEXT:    # =>This Inner Loop Header: Depth=1
-; SFB-NEXT:    mv a0, s0
-; SFB-NEXT:    call bar at plt
-; SFB-NEXT:    sllw s0, s0, s1
-; SFB-NEXT:    bnez a0, .LBB16_1
-; SFB-NEXT:  # %bb.2: # %bb7
-; SFB-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
-; SFB-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
-; SFB-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
-; SFB-NEXT:    addi sp, sp, 32
-; SFB-NEXT:    ret
+; RV64SFB-LABEL: sextw_removal_ccaddw:
+; RV64SFB:       # %bb.0: # %bb
+; RV64SFB-NEXT:    addi sp, sp, -32
+; RV64SFB-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
+; RV64SFB-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
+; RV64SFB-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
+; RV64SFB-NEXT:    mv s0, a1
+; RV64SFB-NEXT:    andi a0, a0, 1
+; RV64SFB-NEXT:    mv s1, a2
+; RV64SFB-NEXT:    beqz a0, .LBB16_4
+; RV64SFB-NEXT:  # %bb.3: # %bb
+; RV64SFB-NEXT:    addw s0, a1, a3
+; RV64SFB-NEXT:  .LBB16_4: # %bb
+; RV64SFB-NEXT:  .LBB16_1: # %bb2
+; RV64SFB-NEXT:    # =>This Inner Loop Header: Depth=1
+; RV64SFB-NEXT:    mv a0, s0
+; RV64SFB-NEXT:    call bar at plt
+; RV64SFB-NEXT:    sllw s0, s0, s1
+; RV64SFB-NEXT:    bnez a0, .LBB16_1
+; RV64SFB-NEXT:  # %bb.2: # %bb7
+; RV64SFB-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
+; RV64SFB-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
+; RV64SFB-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
+; RV64SFB-NEXT:    addi sp, sp, 32
+; RV64SFB-NEXT:    ret
+;
+; ZICOND-LABEL: sextw_removal_ccaddw:
+; ZICOND:       # %bb.0: # %bb
+; ZICOND-NEXT:    addi sp, sp, -32
+; ZICOND-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
+; ZICOND-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
+; ZICOND-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
+; ZICOND-NEXT:    mv s0, a1
+; ZICOND-NEXT:    andi a0, a0, 1
+; ZICOND-NEXT:    mv s1, a2
+; ZICOND-NEXT:    beqz a0, .LBB16_4
+; ZICOND-NEXT:  # %bb.3: # %bb
+; ZICOND-NEXT:    addw s0, a1, a3
+; ZICOND-NEXT:  .LBB16_4: # %bb
+; ZICOND-NEXT:  .LBB16_1: # %bb2
+; ZICOND-NEXT:    # =>This Inner Loop Header: Depth=1
+; ZICOND-NEXT:    mv a0, s0
+; ZICOND-NEXT:    call bar at plt
+; ZICOND-NEXT:    sllw s0, s0, s1
+; ZICOND-NEXT:    bnez a0, .LBB16_1
+; ZICOND-NEXT:  # %bb.2: # %bb7
+; ZICOND-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
+; ZICOND-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
+; ZICOND-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
+; ZICOND-NEXT:    addi sp, sp, 32
+; ZICOND-NEXT:    ret
+;
+; RV32SFB-LABEL: sextw_removal_ccaddw:
+; RV32SFB:       # %bb.0: # %bb
+; RV32SFB-NEXT:    addi sp, sp, -16
+; RV32SFB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
+; RV32SFB-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
+; RV32SFB-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
+; RV32SFB-NEXT:    mv s0, a1
+; RV32SFB-NEXT:    andi a0, a0, 1
+; RV32SFB-NEXT:    mv s1, a2
+; RV32SFB-NEXT:    beqz a0, .LBB16_4
+; RV32SFB-NEXT:  # %bb.3: # %bb
+; RV32SFB-NEXT:    add s0, a1, a3
+; RV32SFB-NEXT:  .LBB16_4: # %bb
+; RV32SFB-NEXT:  .LBB16_1: # %bb2
+; RV32SFB-NEXT:    # =>This Inner Loop Header: Depth=1
+; RV32SFB-NEXT:    mv a0, s0
+; RV32SFB-NEXT:    call bar at plt
+; RV32SFB-NEXT:    sll s0, s0, s1
+; RV32SFB-NEXT:    bnez a0, .LBB16_1
+; RV32SFB-NEXT:  # %bb.2: # %bb7
+; RV32SFB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
+; RV32SFB-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
+; RV32SFB-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
+; RV32SFB-NEXT:    addi sp, sp, 16
+; RV32SFB-NEXT:    ret
 bb:
   %sel = select i1 %c, i32 %arg2, i32 0
   %or = add i32 %sel, %arg
@@ -531,14 +663,32 @@ define i32 @select_sllw(i32 %A, i32 %B, i32 %C, i1 zeroext %cond) {
 ; NOSFB-NEXT:    mv a0, a2
 ; NOSFB-NEXT:    ret
 ;
-; SFB-LABEL: select_sllw:
-; SFB:       # %bb.0: # %entry
-; SFB-NEXT:    bnez a3, .LBB17_2
-; SFB-NEXT:  # %bb.1: # %entry
-; SFB-NEXT:    sllw a2, a0, a1
-; SFB-NEXT:  .LBB17_2: # %entry
-; SFB-NEXT:    mv a0, a2
-; SFB-NEXT:    ret
+; RV64SFB-LABEL: select_sllw:
+; RV64SFB:       # %bb.0: # %entry
+; RV64SFB-NEXT:    bnez a3, .LBB17_2
+; RV64SFB-NEXT:  # %bb.1: # %entry
+; RV64SFB-NEXT:    sllw a2, a0, a1
+; RV64SFB-NEXT:  .LBB17_2: # %entry
+; RV64SFB-NEXT:    mv a0, a2
+; RV64SFB-NEXT:    ret
+;
+; ZICOND-LABEL: select_sllw:
+; ZICOND:       # %bb.0: # %entry
+; ZICOND-NEXT:    bnez a3, .LBB17_2
+; ZICOND-NEXT:  # %bb.1: # %entry
+; ZICOND-NEXT:    sllw a2, a0, a1
+; ZICOND-NEXT:  .LBB17_2: # %entry
+; ZICOND-NEXT:    mv a0, a2
+; ZICOND-NEXT:    ret
+;
+; RV32SFB-LABEL: select_sllw:
+; RV32SFB:       # %bb.0: # %entry
+; RV32SFB-NEXT:    bnez a3, .LBB17_2
+; RV32SFB-NEXT:  # %bb.1: # %entry
+; RV32SFB-NEXT:    sll a2, a0, a1
+; RV32SFB-NEXT:  .LBB17_2: # %entry
+; RV32SFB-NEXT:    mv a0, a2
+; RV32SFB-NEXT:    ret
 entry:
  %0 = shl i32 %A, %B
  %1 = select i1 %cond, i32 %C, i32 %0
@@ -555,14 +705,32 @@ define i32 @select_srlw(i32 %A, i32 %B, i32 %C, i1 zeroext %cond) {
 ; NOSFB-NEXT:    mv a0, a2
 ; NOSFB-NEXT:    ret
 ;
-; SFB-LABEL: select_srlw:
-; SFB:       # %bb.0: # %entry
-; SFB-NEXT:    bnez a3, .LBB18_2
-; SFB-NEXT:  # %bb.1: # %entry
-; SFB-NEXT:    srlw a2, a0, a1
-; SFB-NEXT:  .LBB18_2: # %entry
-; SFB-NEXT:    mv a0, a2
-; SFB-NEXT:    ret
+; RV64SFB-LABEL: select_srlw:
+; RV64SFB:       # %bb.0: # %entry
+; RV64SFB-NEXT:    bnez a3, .LBB18_2
+; RV64SFB-NEXT:  # %bb.1: # %entry
+; RV64SFB-NEXT:    srlw a2, a0, a1
+; RV64SFB-NEXT:  .LBB18_2: # %entry
+; RV64SFB-NEXT:    mv a0, a2
+; RV64SFB-NEXT:    ret
+;
+; ZICOND-LABEL: select_srlw:
+; ZICOND:       # %bb.0: # %entry
+; ZICOND-NEXT:    bnez a3, .LBB18_2
+; ZICOND-NEXT:  # %bb.1: # %entry
+; ZICOND-NEXT:    srlw a2, a0, a1
+; ZICOND-NEXT:  .LBB18_2: # %entry
+; ZICOND-NEXT:    mv a0, a2
+; ZICOND-NEXT:    ret
+;
+; RV32SFB-LABEL: select_srlw:
+; RV32SFB:       # %bb.0: # %entry
+; RV32SFB-NEXT:    bnez a3, .LBB18_2
+; RV32SFB-NEXT:  # %bb.1: # %entry
+; RV32SFB-NEXT:    srl a2, a0, a1
+; RV32SFB-NEXT:  .LBB18_2: # %entry
+; RV32SFB-NEXT:    mv a0, a2
+; RV32SFB-NEXT:    ret
 entry:
  %0 = lshr i32 %A, %B
  %1 = select i1 %cond, i32 %C, i32 %0
@@ -579,14 +747,32 @@ define i32 @select_sraw(i32 %A, i32 %B, i32 %C, i1 zeroext %cond) {
 ; NOSFB-NEXT:    mv a0, a2
 ; NOSFB-NEXT:    ret
 ;
-; SFB-LABEL: select_sraw:
-; SFB:       # %bb.0: # %entry
-; SFB-NEXT:    bnez a3, .LBB19_2
-; SFB-NEXT:  # %bb.1: # %entry
-; SFB-NEXT:    sraw a2, a0, a1
-; SFB-NEXT:  .LBB19_2: # %entry
-; SFB-NEXT:    mv a0, a2
-; SFB-NEXT:    ret
+; RV64SFB-LABEL: select_sraw:
+; RV64SFB:       # %bb.0: # %entry
+; RV64SFB-NEXT:    bnez a3, .LBB19_2
+; RV64SFB-NEXT:  # %bb.1: # %entry
+; RV64SFB-NEXT:    sraw a2, a0, a1
+; RV64SFB-NEXT:  .LBB19_2: # %entry
+; RV64SFB-NEXT:    mv a0, a2
+; RV64SFB-NEXT:    ret
+;
+; ZICOND-LABEL: select_sraw:
+; ZICOND:       # %bb.0: # %entry
+; ZICOND-NEXT:    bnez a3, .LBB19_2
+; ZICOND-NEXT:  # %bb.1: # %entry
+; ZICOND-NEXT:    sraw a2, a0, a1
+; ZICOND-NEXT:  .LBB19_2: # %entry
+; ZICOND-NEXT:    mv a0, a2
+; ZICOND-NEXT:    ret
+;
+; RV32SFB-LABEL: select_sraw:
+; RV32SFB:       # %bb.0: # %entry
+; RV32SFB-NEXT:    bnez a3, .LBB19_2
+; RV32SFB-NEXT:  # %bb.1: # %entry
+; RV32SFB-NEXT:    sra a2, a0, a1
+; RV32SFB-NEXT:  .LBB19_2: # %entry
+; RV32SFB-NEXT:    mv a0, a2
+; RV32SFB-NEXT:    ret
 entry:
  %0 = ashr i32 %A, %B
  %1 = select i1 %cond, i32 %C, i32 %0
@@ -603,14 +789,51 @@ define i64 @select_sll(i64 %A, i64 %B, i64 %C, i1 zeroext %cond) {
 ; NOSFB-NEXT:    mv a0, a2
 ; NOSFB-NEXT:    ret
 ;
-; SFB-LABEL: select_sll:
-; SFB:       # %bb.0: # %entry
-; SFB-NEXT:    bnez a3, .LBB20_2
-; SFB-NEXT:  # %bb.1: # %entry
-; SFB-NEXT:    sll a2, a0, a1
-; SFB-NEXT:  .LBB20_2: # %entry
-; SFB-NEXT:    mv a0, a2
-; SFB-NEXT:    ret
+; RV64SFB-LABEL: select_sll:
+; RV64SFB:       # %bb.0: # %entry
+; RV64SFB-NEXT:    bnez a3, .LBB20_2
+; RV64SFB-NEXT:  # %bb.1: # %entry
+; RV64SFB-NEXT:    sll a2, a0, a1
+; RV64SFB-NEXT:  .LBB20_2: # %entry
+; RV64SFB-NEXT:    mv a0, a2
+; RV64SFB-NEXT:    ret
+;
+; ZICOND-LABEL: select_sll:
+; ZICOND:       # %bb.0: # %entry
+; ZICOND-NEXT:    bnez a3, .LBB20_2
+; ZICOND-NEXT:  # %bb.1: # %entry
+; ZICOND-NEXT:    sll a2, a0, a1
+; ZICOND-NEXT:  .LBB20_2: # %entry
+; ZICOND-NEXT:    mv a0, a2
+; ZICOND-NEXT:    ret
+;
+; RV32SFB-LABEL: select_sll:
+; RV32SFB:       # %bb.0: # %entry
+; RV32SFB-NEXT:    sll a3, a0, a2
+; RV32SFB-NEXT:    not a7, a2
+; RV32SFB-NEXT:    srli a0, a0, 1
+; RV32SFB-NEXT:    sll t0, a1, a2
+; RV32SFB-NEXT:    srl a0, a0, a7
+; RV32SFB-NEXT:    addi a2, a2, -32
+; RV32SFB-NEXT:    mv a1, a3
+; RV32SFB-NEXT:    bgez a2, .LBB20_2
+; RV32SFB-NEXT:  # %bb.1: # %entry
+; RV32SFB-NEXT:    or a1, t0, a0
+; RV32SFB-NEXT:  .LBB20_2: # %entry
+; RV32SFB-NEXT:    bltz a2, .LBB20_4
+; RV32SFB-NEXT:  # %bb.3: # %entry
+; RV32SFB-NEXT:    li a3, 0
+; RV32SFB-NEXT:  .LBB20_4: # %entry
+; RV32SFB-NEXT:    beqz a6, .LBB20_6
+; RV32SFB-NEXT:  # %bb.5: # %entry
+; RV32SFB-NEXT:    mv a1, a5
+; RV32SFB-NEXT:  .LBB20_6: # %entry
+; RV32SFB-NEXT:    beqz a6, .LBB20_8
+; RV32SFB-NEXT:  # %bb.7: # %entry
+; RV32SFB-NEXT:    mv a3, a4
+; RV32SFB-NEXT:  .LBB20_8: # %entry
+; RV32SFB-NEXT:    mv a0, a3
+; RV32SFB-NEXT:    ret
 entry:
  %0 = shl i64 %A, %B
  %1 = select i1 %cond, i64 %C, i64 %0
@@ -627,14 +850,51 @@ define i64 @select_srl(i64 %A, i64 %B, i64 %C, i1 zeroext %cond) {
 ; NOSFB-NEXT:    mv a0, a2
 ; NOSFB-NEXT:    ret
 ;
-; SFB-LABEL: select_srl:
-; SFB:       # %bb.0: # %entry
-; SFB-NEXT:    bnez a3, .LBB21_2
-; SFB-NEXT:  # %bb.1: # %entry
-; SFB-NEXT:    srl a2, a0, a1
-; SFB-NEXT:  .LBB21_2: # %entry
-; SFB-NEXT:    mv a0, a2
-; SFB-NEXT:    ret
+; RV64SFB-LABEL: select_srl:
+; RV64SFB:       # %bb.0: # %entry
+; RV64SFB-NEXT:    bnez a3, .LBB21_2
+; RV64SFB-NEXT:  # %bb.1: # %entry
+; RV64SFB-NEXT:    srl a2, a0, a1
+; RV64SFB-NEXT:  .LBB21_2: # %entry
+; RV64SFB-NEXT:    mv a0, a2
+; RV64SFB-NEXT:    ret
+;
+; ZICOND-LABEL: select_srl:
+; ZICOND:       # %bb.0: # %entry
+; ZICOND-NEXT:    bnez a3, .LBB21_2
+; ZICOND-NEXT:  # %bb.1: # %entry
+; ZICOND-NEXT:    srl a2, a0, a1
+; ZICOND-NEXT:  .LBB21_2: # %entry
+; ZICOND-NEXT:    mv a0, a2
+; ZICOND-NEXT:    ret
+;
+; RV32SFB-LABEL: select_srl:
+; RV32SFB:       # %bb.0: # %entry
+; RV32SFB-NEXT:    srl a3, a1, a2
+; RV32SFB-NEXT:    not a7, a2
+; RV32SFB-NEXT:    slli a1, a1, 1
+; RV32SFB-NEXT:    srl t0, a0, a2
+; RV32SFB-NEXT:    sll a1, a1, a7
+; RV32SFB-NEXT:    addi a2, a2, -32
+; RV32SFB-NEXT:    mv a0, a3
+; RV32SFB-NEXT:    bgez a2, .LBB21_2
+; RV32SFB-NEXT:  # %bb.1: # %entry
+; RV32SFB-NEXT:    or a0, t0, a1
+; RV32SFB-NEXT:  .LBB21_2: # %entry
+; RV32SFB-NEXT:    bltz a2, .LBB21_4
+; RV32SFB-NEXT:  # %bb.3: # %entry
+; RV32SFB-NEXT:    li a3, 0
+; RV32SFB-NEXT:  .LBB21_4: # %entry
+; RV32SFB-NEXT:    beqz a6, .LBB21_6
+; RV32SFB-NEXT:  # %bb.5: # %entry
+; RV32SFB-NEXT:    mv a0, a4
+; RV32SFB-NEXT:  .LBB21_6: # %entry
+; RV32SFB-NEXT:    beqz a6, .LBB21_8
+; RV32SFB-NEXT:  # %bb.7: # %entry
+; RV32SFB-NEXT:    mv a3, a5
+; RV32SFB-NEXT:  .LBB21_8: # %entry
+; RV32SFB-NEXT:    mv...
[truncated]

``````````

</details>


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


More information about the llvm-commits mailing list