[llvm] [RISCV][ISelLowering] Use Zicond for FP selects on Zfinx/Zdinx (PR #169299)

via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 25 00:59:43 PST 2025


fennecJ wrote:

I have updated the selection logic to skip cases requiring register splitting (e.g., f64 on RV32).

Consequently, the output for select_f64_fcmp
```asm
define double @select_f64_fcmp(double %a, double %b, double %c, double %d) nounwind {
entry:
  %cmp = fcmp ogt double %a, %b
  %sel = select i1 %cmp, double %c, double %d
  ret double %sel
}
```
is now identical for both `RV32ZDINX_ZICOND` and `RV32ZDINX_NOZICOND`:

```asm
; RV32ZDINX_ZICOND-LABEL: select_f64_fcmp:
; RV32ZDINX_ZICOND:       # %bb.0: # %entry
; RV32ZDINX_ZICOND-NEXT:    flt.d a0, a2, a0
; RV32ZDINX_ZICOND-NEXT:    bnez a0, .LBB2_2
; RV32ZDINX_ZICOND-NEXT:  # %bb.1: # %entry
; RV32ZDINX_ZICOND-NEXT:    mv a4, a6
; RV32ZDINX_ZICOND-NEXT:    mv a5, a7
; RV32ZDINX_ZICOND-NEXT:  .LBB2_2: # %entry
; RV32ZDINX_ZICOND-NEXT:    mv a0, a4
; RV32ZDINX_ZICOND-NEXT:    mv a1, a5
; RV32ZDINX_ZICOND-NEXT:    ret
;
; RV32ZDINX_NOZICOND-LABEL: select_f64_fcmp:
; RV32ZDINX_NOZICOND:       # %bb.0: # %entry
; RV32ZDINX_NOZICOND-NEXT:    flt.d a0, a2, a0
; RV32ZDINX_NOZICOND-NEXT:    bnez a0, .LBB2_2
; RV32ZDINX_NOZICOND-NEXT:  # %bb.1: # %entry
; RV32ZDINX_NOZICOND-NEXT:    mv a4, a6
; RV32ZDINX_NOZICOND-NEXT:    mv a5, a7
; RV32ZDINX_NOZICOND-NEXT:  .LBB2_2: # %entry
; RV32ZDINX_NOZICOND-NEXT:    mv a0, a4
; RV32ZDINX_NOZICOND-NEXT:    mv a1, a5
; RV32ZDINX_NOZICOND-NEXT:    ret
```
Note: For `RV32ZFINX_ZICOND`, the czero instructions seem to be pre-existing/unrelated, as they remain even if I remove the whole FP ISel logic.

```
; RV32ZFINX_ZICOND-LABEL: select_f64_fcmp:
; RV32ZFINX_ZICOND:       # %bb.0: # %entry
; RV32ZFINX_ZICOND-NEXT:    addi sp, sp, -32
; RV32ZFINX_ZICOND-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
; RV32ZFINX_ZICOND-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
; RV32ZFINX_ZICOND-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
; RV32ZFINX_ZICOND-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
; RV32ZFINX_ZICOND-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
; RV32ZFINX_ZICOND-NEXT:    mv s0, a7
; RV32ZFINX_ZICOND-NEXT:    mv s1, a6
; RV32ZFINX_ZICOND-NEXT:    mv s2, a5
; RV32ZFINX_ZICOND-NEXT:    mv s3, a4
; RV32ZFINX_ZICOND-NEXT:    call __gtdf2
; RV32ZFINX_ZICOND-NEXT:    sgtz a0, a0
; RV32ZFINX_ZICOND-NEXT:    czero.nez a1, s1, a0
; RV32ZFINX_ZICOND-NEXT:    czero.eqz a2, s3, a0
; RV32ZFINX_ZICOND-NEXT:    czero.nez a3, s0, a0
; RV32ZFINX_ZICOND-NEXT:    czero.eqz a4, s2, a0
; RV32ZFINX_ZICOND-NEXT:    or a0, a2, a1
; RV32ZFINX_ZICOND-NEXT:    or a1, a4, a3
; RV32ZFINX_ZICOND-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
; RV32ZFINX_ZICOND-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
; RV32ZFINX_ZICOND-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
; RV32ZFINX_ZICOND-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
; RV32ZFINX_ZICOND-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
; RV32ZFINX_ZICOND-NEXT:    addi sp, sp, 32
; RV32ZFINX_ZICOND-NEXT:    ret
```

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


More information about the llvm-commits mailing list