[llvm] [RISCV] Fix fcanonicalize for Z*inx (PR #175984)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 14 08:31:21 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-risc-v
Author: Jacob Lin (millaker)
<details>
<summary>Changes</summary>
Previous tablegen patterns for `fcanonicalize` hardcoded standard floating point registers. This caused a crash during instruction selection for extensions that utilize integer registers. This patch generalizes the patterns to use the dynamically resolved register class `Ext.PrimaryTy`.
Existing tests in `fp-fcanonicalize.ll` have been updated to verify correctness for Zfinx, Zdinx, and Zhinx.
---
Patch is 95.29 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/175984.diff
4 Files Affected:
- (modified) llvm/lib/Target/RISCV/RISCVInstrInfoD.td (+4-2)
- (modified) llvm/lib/Target/RISCV/RISCVInstrInfoF.td (+4-2)
- (modified) llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td (+4-2)
- (modified) llvm/test/CodeGen/RISCV/fp-fcanonicalize.ll (+2260)
``````````diff
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoD.td b/llvm/lib/Target/RISCV/RISCVInstrInfoD.td
index deacd41e6469a..bc4a99f64ddb7 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoD.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoD.td
@@ -409,8 +409,10 @@ foreach Ext = DExts in {
defm : PatFprFpr_m<fmaximumnum, FMAX_D, Ext>;
defm : PatFprFpr_m<riscv_fmin, FMIN_D, Ext>;
defm : PatFprFpr_m<riscv_fmax, FMAX_D, Ext>;
- let Predicates = Ext.Predicates in
- def : Pat<(f64 (fcanonicalize FPR64:$rs1)), (FMIN_D $rs1, $rs1)>;
+ let Predicates = Ext.Predicates in {
+ def : Pat<(f64 (fcanonicalize Ext.PrimaryTy:$rs1)),
+ (!cast<Instruction>("FMIN_D"#Ext.Suffix) $rs1, $rs1)>;
+ }
}
/// Setcc
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoF.td b/llvm/lib/Target/RISCV/RISCVInstrInfoF.td
index 13b23a573da0e..d04aff724a72b 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoF.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoF.td
@@ -659,8 +659,10 @@ foreach Ext = FExts in {
defm : PatFprFpr_m<fmaximumnum, FMAX_S, Ext>;
defm : PatFprFpr_m<riscv_fmin, FMIN_S, Ext>;
defm : PatFprFpr_m<riscv_fmax, FMAX_S, Ext>;
- let Predicates = Ext.Predicates in
- def : Pat<(f32 (fcanonicalize FPR32:$rs1)), (FMIN_S $rs1, $rs1)>;
+ let Predicates = Ext.Predicates in {
+ def : Pat<(f32 (fcanonicalize Ext.PrimaryTy:$rs1)),
+ (!cast<Instruction>("FMIN_S"#Ext.Suffix) $rs1, $rs1)>;
+ }
}
/// Setcc
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td b/llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td
index c172d1739ba61..79a4a95ab3448 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td
@@ -381,8 +381,10 @@ foreach Ext = ZfhExts in {
defm : PatFprFpr_m<fmaximumnum, FMAX_H, Ext>;
defm : PatFprFpr_m<riscv_fmin, FMIN_H, Ext>;
defm : PatFprFpr_m<riscv_fmax, FMAX_H, Ext>;
- let Predicates = Ext.Predicates in
- def : Pat<(f16 (fcanonicalize FPR16:$rs1)), (FMIN_H $rs1, $rs1)>;
+ let Predicates = Ext.Predicates in {
+ def : Pat<(f16 (fcanonicalize Ext.PrimaryTy:$rs1)),
+ (!cast<Instruction>("FMIN_H"#Ext.Suffix) $rs1, $rs1)>;
+ }
}
/// Setcc
diff --git a/llvm/test/CodeGen/RISCV/fp-fcanonicalize.ll b/llvm/test/CodeGen/RISCV/fp-fcanonicalize.ll
index 87ed30c41e0e5..364aa2f24a504 100644
--- a/llvm/test/CodeGen/RISCV/fp-fcanonicalize.ll
+++ b/llvm/test/CodeGen/RISCV/fp-fcanonicalize.ll
@@ -5,6 +5,11 @@
; RUN: llc --mtriple=riscv32 < %s | FileCheck %s --check-prefixes=CHECK,CHECK-SOFT-RV32
; RUN: llc --mtriple=riscv32 --mattr=+d,+zfh < %s | FileCheck %s --check-prefixes=CHECK,CHECK-FP16-RV32
; RUN: llc --mtriple=riscv32 --mattr=+d,-zfh < %s | FileCheck %s --check-prefixes=CHECK,CHECK-NOFP16-RV32
+; RUN: llc -mtriple=riscv32 -mattr=+zfinx -verify-machineinstrs < %s | FileCheck -check-prefix=RV32ZFINX %s
+; RUN: llc -mtriple=riscv64 -mattr=+zfinx -verify-machineinstrs < %s | FileCheck -check-prefix=RV64ZFINX %s
+; RUN: llc -mtriple=riscv64 -mattr=+zdinx -verify-machineinstrs < %s | FileCheck -check-prefix=RV64ZDINX %s
+; RUN: llc -mtriple=riscv32 -mattr=+zhinx -target-abi=ilp32 -verify-machineinstrs < %s | FileCheck -check-prefix=RV32ZHINX %s
+; RUN: llc -mtriple=riscv64 -mattr=+zhinx -verify-machineinstrs < %s | FileCheck -check-prefix=RV64ZHINX %s
define half @fcanonicalize_f16(half %x) {
; CHECK-SOFT-RV64-LABEL: fcanonicalize_f16:
@@ -90,6 +95,73 @@ define half @fcanonicalize_f16(half %x) {
; CHECK-NOFP16-RV32-NEXT: addi sp, sp, 16
; CHECK-NOFP16-RV32-NEXT: .cfi_def_cfa_offset 0
; CHECK-NOFP16-RV32-NEXT: ret
+;
+; RV32ZFINX-LABEL: fcanonicalize_f16:
+; RV32ZFINX: # %bb.0:
+; RV32ZFINX-NEXT: addi sp, sp, -16
+; RV32ZFINX-NEXT: .cfi_def_cfa_offset 16
+; RV32ZFINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
+; RV32ZFINX-NEXT: .cfi_offset ra, -4
+; RV32ZFINX-NEXT: call __extendhfsf2
+; RV32ZFINX-NEXT: fmin.s a0, a0, a0
+; RV32ZFINX-NEXT: call __truncsfhf2
+; RV32ZFINX-NEXT: # kill: def $x10_w killed $x10_w def $x10
+; RV32ZFINX-NEXT: lui a1, 1048560
+; RV32ZFINX-NEXT: or a0, a0, a1
+; RV32ZFINX-NEXT: # kill: def $x10_w killed $x10_w killed $x10
+; RV32ZFINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
+; RV32ZFINX-NEXT: .cfi_restore ra
+; RV32ZFINX-NEXT: addi sp, sp, 16
+; RV32ZFINX-NEXT: .cfi_def_cfa_offset 0
+; RV32ZFINX-NEXT: ret
+;
+; RV64ZFINX-LABEL: fcanonicalize_f16:
+; RV64ZFINX: # %bb.0:
+; RV64ZFINX-NEXT: addi sp, sp, -16
+; RV64ZFINX-NEXT: .cfi_def_cfa_offset 16
+; RV64ZFINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
+; RV64ZFINX-NEXT: .cfi_offset ra, -8
+; RV64ZFINX-NEXT: call __extendhfsf2
+; RV64ZFINX-NEXT: fmin.s a0, a0, a0
+; RV64ZFINX-NEXT: call __truncsfhf2
+; RV64ZFINX-NEXT: # kill: def $x10_w killed $x10_w def $x10
+; RV64ZFINX-NEXT: lui a1, 1048560
+; RV64ZFINX-NEXT: or a0, a0, a1
+; RV64ZFINX-NEXT: # kill: def $x10_w killed $x10_w killed $x10
+; RV64ZFINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
+; RV64ZFINX-NEXT: .cfi_restore ra
+; RV64ZFINX-NEXT: addi sp, sp, 16
+; RV64ZFINX-NEXT: .cfi_def_cfa_offset 0
+; RV64ZFINX-NEXT: ret
+;
+; RV64ZDINX-LABEL: fcanonicalize_f16:
+; RV64ZDINX: # %bb.0:
+; RV64ZDINX-NEXT: addi sp, sp, -16
+; RV64ZDINX-NEXT: .cfi_def_cfa_offset 16
+; RV64ZDINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
+; RV64ZDINX-NEXT: .cfi_offset ra, -8
+; RV64ZDINX-NEXT: call __extendhfsf2
+; RV64ZDINX-NEXT: fmin.s a0, a0, a0
+; RV64ZDINX-NEXT: call __truncsfhf2
+; RV64ZDINX-NEXT: # kill: def $x10_w killed $x10_w def $x10
+; RV64ZDINX-NEXT: lui a1, 1048560
+; RV64ZDINX-NEXT: or a0, a0, a1
+; RV64ZDINX-NEXT: # kill: def $x10_w killed $x10_w killed $x10
+; RV64ZDINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
+; RV64ZDINX-NEXT: .cfi_restore ra
+; RV64ZDINX-NEXT: addi sp, sp, 16
+; RV64ZDINX-NEXT: .cfi_def_cfa_offset 0
+; RV64ZDINX-NEXT: ret
+;
+; RV32ZHINX-LABEL: fcanonicalize_f16:
+; RV32ZHINX: # %bb.0:
+; RV32ZHINX-NEXT: fmin.h a0, a0, a0
+; RV32ZHINX-NEXT: ret
+;
+; RV64ZHINX-LABEL: fcanonicalize_f16:
+; RV64ZHINX: # %bb.0:
+; RV64ZHINX-NEXT: fmin.h a0, a0, a0
+; RV64ZHINX-NEXT: ret
%z = call nnan half @llvm.canonicalize.f16(half %x)
ret half %z
}
@@ -250,6 +322,114 @@ define <2 x half> @fcanonicalize_v2f16(<2 x half> %x) {
; CHECK-NOFP16-RV32-NEXT: addi sp, sp, 16
; CHECK-NOFP16-RV32-NEXT: .cfi_def_cfa_offset 0
; CHECK-NOFP16-RV32-NEXT: ret
+;
+; RV32ZFINX-LABEL: fcanonicalize_v2f16:
+; RV32ZFINX: # %bb.0:
+; RV32ZFINX-NEXT: addi sp, sp, -16
+; RV32ZFINX-NEXT: .cfi_def_cfa_offset 16
+; RV32ZFINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
+; RV32ZFINX-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
+; RV32ZFINX-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
+; RV32ZFINX-NEXT: .cfi_offset ra, -4
+; RV32ZFINX-NEXT: .cfi_offset s0, -8
+; RV32ZFINX-NEXT: .cfi_offset s1, -12
+; RV32ZFINX-NEXT: mv s0, a1
+; RV32ZFINX-NEXT: # kill: def $x10_w killed $x10_w killed $x10
+; RV32ZFINX-NEXT: call __extendhfsf2
+; RV32ZFINX-NEXT: fmin.s a0, a0, a0
+; RV32ZFINX-NEXT: call __truncsfhf2
+; RV32ZFINX-NEXT: mv s1, a0
+; RV32ZFINX-NEXT: mv a0, s0
+; RV32ZFINX-NEXT: call __extendhfsf2
+; RV32ZFINX-NEXT: fmin.s a0, a0, a0
+; RV32ZFINX-NEXT: call __truncsfhf2
+; RV32ZFINX-NEXT: mv a1, a0
+; RV32ZFINX-NEXT: mv a0, s1
+; RV32ZFINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
+; RV32ZFINX-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
+; RV32ZFINX-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
+; RV32ZFINX-NEXT: .cfi_restore ra
+; RV32ZFINX-NEXT: .cfi_restore s0
+; RV32ZFINX-NEXT: .cfi_restore s1
+; RV32ZFINX-NEXT: addi sp, sp, 16
+; RV32ZFINX-NEXT: .cfi_def_cfa_offset 0
+; RV32ZFINX-NEXT: ret
+;
+; RV64ZFINX-LABEL: fcanonicalize_v2f16:
+; RV64ZFINX: # %bb.0:
+; RV64ZFINX-NEXT: addi sp, sp, -32
+; RV64ZFINX-NEXT: .cfi_def_cfa_offset 32
+; RV64ZFINX-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
+; RV64ZFINX-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
+; RV64ZFINX-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
+; RV64ZFINX-NEXT: .cfi_offset ra, -8
+; RV64ZFINX-NEXT: .cfi_offset s0, -16
+; RV64ZFINX-NEXT: .cfi_offset s1, -24
+; RV64ZFINX-NEXT: mv s0, a1
+; RV64ZFINX-NEXT: # kill: def $x10_w killed $x10_w killed $x10
+; RV64ZFINX-NEXT: call __extendhfsf2
+; RV64ZFINX-NEXT: fmin.s a0, a0, a0
+; RV64ZFINX-NEXT: call __truncsfhf2
+; RV64ZFINX-NEXT: mv s1, a0
+; RV64ZFINX-NEXT: mv a0, s0
+; RV64ZFINX-NEXT: call __extendhfsf2
+; RV64ZFINX-NEXT: fmin.s a0, a0, a0
+; RV64ZFINX-NEXT: call __truncsfhf2
+; RV64ZFINX-NEXT: mv a1, a0
+; RV64ZFINX-NEXT: mv a0, s1
+; RV64ZFINX-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
+; RV64ZFINX-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
+; RV64ZFINX-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
+; RV64ZFINX-NEXT: .cfi_restore ra
+; RV64ZFINX-NEXT: .cfi_restore s0
+; RV64ZFINX-NEXT: .cfi_restore s1
+; RV64ZFINX-NEXT: addi sp, sp, 32
+; RV64ZFINX-NEXT: .cfi_def_cfa_offset 0
+; RV64ZFINX-NEXT: ret
+;
+; RV64ZDINX-LABEL: fcanonicalize_v2f16:
+; RV64ZDINX: # %bb.0:
+; RV64ZDINX-NEXT: addi sp, sp, -32
+; RV64ZDINX-NEXT: .cfi_def_cfa_offset 32
+; RV64ZDINX-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
+; RV64ZDINX-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
+; RV64ZDINX-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
+; RV64ZDINX-NEXT: .cfi_offset ra, -8
+; RV64ZDINX-NEXT: .cfi_offset s0, -16
+; RV64ZDINX-NEXT: .cfi_offset s1, -24
+; RV64ZDINX-NEXT: mv s0, a1
+; RV64ZDINX-NEXT: # kill: def $x10_w killed $x10_w killed $x10
+; RV64ZDINX-NEXT: call __extendhfsf2
+; RV64ZDINX-NEXT: fmin.s a0, a0, a0
+; RV64ZDINX-NEXT: call __truncsfhf2
+; RV64ZDINX-NEXT: mv s1, a0
+; RV64ZDINX-NEXT: mv a0, s0
+; RV64ZDINX-NEXT: call __extendhfsf2
+; RV64ZDINX-NEXT: fmin.s a0, a0, a0
+; RV64ZDINX-NEXT: call __truncsfhf2
+; RV64ZDINX-NEXT: mv a1, a0
+; RV64ZDINX-NEXT: mv a0, s1
+; RV64ZDINX-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
+; RV64ZDINX-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
+; RV64ZDINX-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
+; RV64ZDINX-NEXT: .cfi_restore ra
+; RV64ZDINX-NEXT: .cfi_restore s0
+; RV64ZDINX-NEXT: .cfi_restore s1
+; RV64ZDINX-NEXT: addi sp, sp, 32
+; RV64ZDINX-NEXT: .cfi_def_cfa_offset 0
+; RV64ZDINX-NEXT: ret
+;
+; RV32ZHINX-LABEL: fcanonicalize_v2f16:
+; RV32ZHINX: # %bb.0:
+; RV32ZHINX-NEXT: fmin.h a0, a0, a0
+; RV32ZHINX-NEXT: fmin.h a1, a1, a1
+; RV32ZHINX-NEXT: ret
+;
+; RV64ZHINX-LABEL: fcanonicalize_v2f16:
+; RV64ZHINX: # %bb.0:
+; RV64ZHINX-NEXT: fmin.h a0, a0, a0
+; RV64ZHINX-NEXT: fmin.h a1, a1, a1
+; RV64ZHINX-NEXT: ret
%z = call <2 x half> @llvm.canonicalize.v2f16(<2 x half> %x)
ret <2 x half> %z
}
@@ -410,6 +590,114 @@ define <2 x half> @fcanonicalize_v2f16_nnan(<2 x half> %x) {
; CHECK-NOFP16-RV32-NEXT: addi sp, sp, 16
; CHECK-NOFP16-RV32-NEXT: .cfi_def_cfa_offset 0
; CHECK-NOFP16-RV32-NEXT: ret
+;
+; RV32ZFINX-LABEL: fcanonicalize_v2f16_nnan:
+; RV32ZFINX: # %bb.0:
+; RV32ZFINX-NEXT: addi sp, sp, -16
+; RV32ZFINX-NEXT: .cfi_def_cfa_offset 16
+; RV32ZFINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
+; RV32ZFINX-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
+; RV32ZFINX-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
+; RV32ZFINX-NEXT: .cfi_offset ra, -4
+; RV32ZFINX-NEXT: .cfi_offset s0, -8
+; RV32ZFINX-NEXT: .cfi_offset s1, -12
+; RV32ZFINX-NEXT: mv s0, a1
+; RV32ZFINX-NEXT: # kill: def $x10_w killed $x10_w killed $x10
+; RV32ZFINX-NEXT: call __extendhfsf2
+; RV32ZFINX-NEXT: fmin.s a0, a0, a0
+; RV32ZFINX-NEXT: call __truncsfhf2
+; RV32ZFINX-NEXT: mv s1, a0
+; RV32ZFINX-NEXT: mv a0, s0
+; RV32ZFINX-NEXT: call __extendhfsf2
+; RV32ZFINX-NEXT: fmin.s a0, a0, a0
+; RV32ZFINX-NEXT: call __truncsfhf2
+; RV32ZFINX-NEXT: mv a1, a0
+; RV32ZFINX-NEXT: mv a0, s1
+; RV32ZFINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
+; RV32ZFINX-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
+; RV32ZFINX-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
+; RV32ZFINX-NEXT: .cfi_restore ra
+; RV32ZFINX-NEXT: .cfi_restore s0
+; RV32ZFINX-NEXT: .cfi_restore s1
+; RV32ZFINX-NEXT: addi sp, sp, 16
+; RV32ZFINX-NEXT: .cfi_def_cfa_offset 0
+; RV32ZFINX-NEXT: ret
+;
+; RV64ZFINX-LABEL: fcanonicalize_v2f16_nnan:
+; RV64ZFINX: # %bb.0:
+; RV64ZFINX-NEXT: addi sp, sp, -32
+; RV64ZFINX-NEXT: .cfi_def_cfa_offset 32
+; RV64ZFINX-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
+; RV64ZFINX-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
+; RV64ZFINX-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
+; RV64ZFINX-NEXT: .cfi_offset ra, -8
+; RV64ZFINX-NEXT: .cfi_offset s0, -16
+; RV64ZFINX-NEXT: .cfi_offset s1, -24
+; RV64ZFINX-NEXT: mv s0, a1
+; RV64ZFINX-NEXT: # kill: def $x10_w killed $x10_w killed $x10
+; RV64ZFINX-NEXT: call __extendhfsf2
+; RV64ZFINX-NEXT: fmin.s a0, a0, a0
+; RV64ZFINX-NEXT: call __truncsfhf2
+; RV64ZFINX-NEXT: mv s1, a0
+; RV64ZFINX-NEXT: mv a0, s0
+; RV64ZFINX-NEXT: call __extendhfsf2
+; RV64ZFINX-NEXT: fmin.s a0, a0, a0
+; RV64ZFINX-NEXT: call __truncsfhf2
+; RV64ZFINX-NEXT: mv a1, a0
+; RV64ZFINX-NEXT: mv a0, s1
+; RV64ZFINX-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
+; RV64ZFINX-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
+; RV64ZFINX-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
+; RV64ZFINX-NEXT: .cfi_restore ra
+; RV64ZFINX-NEXT: .cfi_restore s0
+; RV64ZFINX-NEXT: .cfi_restore s1
+; RV64ZFINX-NEXT: addi sp, sp, 32
+; RV64ZFINX-NEXT: .cfi_def_cfa_offset 0
+; RV64ZFINX-NEXT: ret
+;
+; RV64ZDINX-LABEL: fcanonicalize_v2f16_nnan:
+; RV64ZDINX: # %bb.0:
+; RV64ZDINX-NEXT: addi sp, sp, -32
+; RV64ZDINX-NEXT: .cfi_def_cfa_offset 32
+; RV64ZDINX-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
+; RV64ZDINX-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
+; RV64ZDINX-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
+; RV64ZDINX-NEXT: .cfi_offset ra, -8
+; RV64ZDINX-NEXT: .cfi_offset s0, -16
+; RV64ZDINX-NEXT: .cfi_offset s1, -24
+; RV64ZDINX-NEXT: mv s0, a1
+; RV64ZDINX-NEXT: # kill: def $x10_w killed $x10_w killed $x10
+; RV64ZDINX-NEXT: call __extendhfsf2
+; RV64ZDINX-NEXT: fmin.s a0, a0, a0
+; RV64ZDINX-NEXT: call __truncsfhf2
+; RV64ZDINX-NEXT: mv s1, a0
+; RV64ZDINX-NEXT: mv a0, s0
+; RV64ZDINX-NEXT: call __extendhfsf2
+; RV64ZDINX-NEXT: fmin.s a0, a0, a0
+; RV64ZDINX-NEXT: call __truncsfhf2
+; RV64ZDINX-NEXT: mv a1, a0
+; RV64ZDINX-NEXT: mv a0, s1
+; RV64ZDINX-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
+; RV64ZDINX-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
+; RV64ZDINX-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
+; RV64ZDINX-NEXT: .cfi_restore ra
+; RV64ZDINX-NEXT: .cfi_restore s0
+; RV64ZDINX-NEXT: .cfi_restore s1
+; RV64ZDINX-NEXT: addi sp, sp, 32
+; RV64ZDINX-NEXT: .cfi_def_cfa_offset 0
+; RV64ZDINX-NEXT: ret
+;
+; RV32ZHINX-LABEL: fcanonicalize_v2f16_nnan:
+; RV32ZHINX: # %bb.0:
+; RV32ZHINX-NEXT: fmin.h a0, a0, a0
+; RV32ZHINX-NEXT: fmin.h a1, a1, a1
+; RV32ZHINX-NEXT: ret
+;
+; RV64ZHINX-LABEL: fcanonicalize_v2f16_nnan:
+; RV64ZHINX: # %bb.0:
+; RV64ZHINX-NEXT: fmin.h a0, a0, a0
+; RV64ZHINX-NEXT: fmin.h a1, a1, a1
+; RV64ZHINX-NEXT: ret
%z = call nnan <2 x half> @llvm.canonicalize.v2f16(<2 x half> %x)
ret <2 x half> %z
}
@@ -717,6 +1005,213 @@ define <4 x half> @fcanonicalize_v4f16(<4 x half> %x) {
; CHECK-NOFP16-RV32-NEXT: addi sp, sp, 64
; CHECK-NOFP16-RV32-NEXT: .cfi_def_cfa_offset 0
; CHECK-NOFP16-RV32-NEXT: ret
+;
+; RV32ZFINX-LABEL: fcanonicalize_v4f16:
+; RV32ZFINX: # %bb.0:
+; RV32ZFINX-NEXT: addi sp, sp, -32
+; RV32ZFINX-NEXT: .cfi_def_cfa_offset 32
+; RV32ZFINX-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
+; RV32ZFINX-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
+; RV32ZFINX-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
+; RV32ZFINX-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
+; RV32ZFINX-NEXT: sw s3, 12(sp) # 4-byte Folded Spill
+; RV32ZFINX-NEXT: sw s4, 8(sp) # 4-byte Folded Spill
+; RV32ZFINX-NEXT: .cfi_offset ra, -4
+; RV32ZFINX-NEXT: .cfi_offset s0, -8
+; RV32ZFINX-NEXT: .cfi_offset s1, -12
+; RV32ZFINX-NEXT: .cfi_offset s2, -16
+; RV32ZFINX-NEXT: .cfi_offset s3, -20
+; RV32ZFINX-NEXT: .cfi_offset s4, -24
+; RV32ZFINX-NEXT: lhu a2, 0(a1)
+; RV32ZFINX-NEXT: lhu s1, 4(a1)
+; RV32ZFINX-NEXT: lhu s2, 8(a1)
+; RV32ZFINX-NEXT: lhu s3, 12(a1)
+; RV32ZFINX-NEXT: mv s0, a0
+; RV32ZFINX-NEXT: mv a0, a2
+; RV32ZFINX-NEXT: call __extendhfsf2
+; RV32ZFINX-NEXT: fmin.s a0, a0, a0
+; RV32ZFINX-NEXT: call __truncsfhf2
+; RV32ZFINX-NEXT: mv s4, a0
+; RV32ZFINX-NEXT: mv a0, s1
+; RV32ZFINX-NEXT: call __extendhfsf2
+; RV32ZFINX-NEXT: fmin.s a0, a0, a0
+; RV32ZFINX-NEXT: call __truncsfhf2
+; RV32ZFINX-NEXT: mv s1, a0
+; RV32ZFINX-NEXT: mv a0, s2
+; RV32ZFINX-NEXT: call __extendhfsf2
+; RV32ZFINX-NEXT: fmin.s a0, a0, a0
+; RV32ZFINX-NEXT: call __truncsfhf2
+; RV32ZFINX-NEXT: mv s2, a0
+; RV32ZFINX-NEXT: mv a0, s3
+; RV32ZFINX-NEXT: call __extendhfsf2
+; RV32ZFINX-NEXT: fmin.s a0, a0, a0
+; RV32ZFINX-NEXT: call __truncsfhf2
+; RV32ZFINX-NEXT: # kill: def $x10_w killed $x10_w def $x10
+; RV32ZFINX-NEXT: sh s4, 0(s0)
+; RV32ZFINX-NEXT: sh s1, 2(s0)
+; RV32ZFINX-NEXT: sh s2, 4(s0)
+; RV32ZFINX-NEXT: sh a0, 6(s0)
+; RV32ZFINX-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
+; RV32ZFINX-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
+; RV32ZFINX-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
+; RV32ZFINX-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
+; RV32ZFINX-NEXT: lw s3, 12(sp) # 4-byte Folded Reload
+; RV32ZFINX-NEXT: lw s4, 8(sp) # 4-byte Folded Reload
+; RV32ZFINX-NEXT: .cfi_restore ra
+; RV32ZFINX-NEXT: .cfi_restore s0
+; RV32ZFINX-NEXT: .cfi_restore s1
+; RV32ZFINX-NEXT: .cfi_restore s2
+; RV32ZFINX-NEXT: .cfi_restore s3
+; RV32ZFINX-NEXT: .cfi_restore s4
+; RV32ZFINX-NEXT: addi sp, sp, 32
+; RV32ZFINX-NEXT: .cfi_def_cfa_offset 0
+; RV32ZFINX-NEXT: ret
+;
+; RV64ZFINX-LABEL: fcanonicalize_v4f16:
+; RV64ZFINX: # %bb.0:
+; RV64ZFINX-NEXT: addi sp, sp, -48
+; RV64ZFINX-NEXT: .cfi_def_cfa_offset 48
+; RV64ZFINX-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
+; RV64ZFINX-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
+; RV64ZFINX-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
+; RV64ZFINX-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
+; RV64ZFINX-NEXT: sd s3, 8(sp) # 8-byte Folded Spill
+; RV64ZFINX-NEXT: sd s4, 0(sp) # 8-byte Folded Spill
+; RV64ZFINX-NEXT: .cfi_offset ra, -8
+; RV64ZFINX-NEXT: .cfi_offset s0, -16
+; RV64ZFINX-NEXT: .cfi_offset s1, -24
+; RV64ZFINX-NEXT: .cfi_offset s2, -32
+; RV64ZFINX-NEXT: .cfi_offset s3, -40
+; RV64ZFINX-NEXT: .cfi_offset s4, -48
+; RV64ZFINX-NEXT: lhu a2, 0(a1)
+; RV64ZFINX-NEXT: lhu s1, 8(a1)
+; RV64ZFINX-NEXT: lhu s2, 16(a1)
+; RV64ZFINX-NEXT: lhu s3, 24(a1)
+; RV64ZFINX-NEXT: mv s0, a0
+; RV64ZFINX-NEXT: mv a0, a2
+; RV64ZFINX-NEXT: call __extendhfsf2
+; RV64ZFINX-NEXT: fmin.s a0, a0, a0
+; RV64ZFINX-NEXT: call __truncsfhf2
+; RV64ZFINX-NEXT: mv s4, a0
+; RV64ZFINX-NEXT: mv a0, s1
+; RV64ZFINX-NEXT: call __extendhfsf2
+; RV64ZFINX-NEXT: fmin.s a0, a0, a0
+; RV64ZFINX-NEXT: call __truncsfhf2
+; RV64ZFINX-NEXT: mv s1, a0
+; RV64ZFINX-NEXT: mv a0, s2
+; RV64ZFINX-NEXT: call __extendhfsf2
+; RV64ZFINX-NEXT: fmin.s a0, a0, a0
+; RV64ZFINX-NEXT: call __truncsfhf2
+; RV64ZFINX-NEXT: mv s2, a0
+; RV64ZFINX-NEXT: mv a0, s3
+; RV64ZFINX-NEXT: call __extendhfsf2
+; RV64ZFINX-NEXT: fmin.s a0, a0, a0
+; RV64ZFINX-NEXT: call __truncsfhf2
+; RV64ZFINX-NEXT: # kill: def $x10_w killed $x10_w def $x10
+; RV64ZFINX-NEXT: sh s4, 0(s0)
+; RV64ZFINX-NEXT: sh s1, 2(s0)
+; RV64ZFINX-NEXT: sh s2, 4(s0)
+; RV64ZFINX-NEXT: sh a0, 6(s0)
+; RV64ZFINX-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
+; RV64ZFINX-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
+; RV64ZFINX-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
+; RV64ZFINX-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
+; RV64ZFINX-NEXT: ld s3, 8(sp) # 8-byte Folded Reload
+; RV64ZFINX-NEXT: ld s4, 0(sp) # 8-byte Folded R...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/175984
More information about the llvm-commits
mailing list