Skip to content

Commit 084f5c2

Browse files
committed
[RISCV] Add tests cases to show missed opportunity to turn vfmv.s.f into vmv.s.x when source is FP constant materialized in GPR.
We end up creating the constant in GPR, move to FPR, then move to vector. We should go directly from GPR to vector.
1 parent 107185f commit 084f5c2

File tree

1 file changed

+49
-2
lines changed

1 file changed

+49
-2
lines changed

llvm/test/CodeGen/RISCV/rvv/vfmv.s.f.ll

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
22
; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+v,+zfh,+zvfh \
3-
; RUN: -verify-machineinstrs -target-abi=ilp32d | FileCheck %s
3+
; RUN: -verify-machineinstrs -target-abi=ilp32d | FileCheck %s --check-prefixes=CHECK,RV32
44
; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+v,+zfh,+zvfh \
5-
; RUN: -verify-machineinstrs -target-abi=lp64d | FileCheck %s
5+
; RUN: -verify-machineinstrs -target-abi=lp64d | FileCheck %s --check-prefixes=CHECK,RV64
66

77
declare <vscale x 1 x half> @llvm.riscv.vfmv.s.f.nxv1f16(<vscale x 1 x half>, half, iXLen)
88

@@ -363,3 +363,50 @@ entry:
363363
%a = call <vscale x 8 x double> @llvm.riscv.vfmv.s.f.nxv8f64(<vscale x 8 x double> %0, double 0.0, iXLen %1)
364364
ret <vscale x 8 x double> %a
365365
}
366+
367+
define <vscale x 1 x half> @intrinsic_vfmv.s.f_f_nxv1f16_negzero(<vscale x 1 x half> %0, iXLen %1) nounwind {
368+
; CHECK-LABEL: intrinsic_vfmv.s.f_f_nxv1f16_negzero:
369+
; CHECK: # %bb.0: # %entry
370+
; CHECK-NEXT: lui a1, 1048568
371+
; CHECK-NEXT: fmv.h.x fa5, a1
372+
; CHECK-NEXT: vsetvli zero, a0, e16, mf4, tu, ma
373+
; CHECK-NEXT: vfmv.s.f v8, fa5
374+
; CHECK-NEXT: ret
375+
entry:
376+
%a = call <vscale x 1 x half> @llvm.riscv.vfmv.s.f.nxv1f16(<vscale x 1 x half> %0, half -0.0, iXLen %1)
377+
ret <vscale x 1 x half> %a
378+
}
379+
380+
define <vscale x 1 x float> @intrinsic_vfmv.s.f_f_nxv1f32_negzero(<vscale x 1 x float> %0, iXLen %1) nounwind {
381+
; CHECK-LABEL: intrinsic_vfmv.s.f_f_nxv1f32_negzero:
382+
; CHECK: # %bb.0: # %entry
383+
; CHECK-NEXT: lui a1, 524288
384+
; CHECK-NEXT: fmv.w.x fa5, a1
385+
; CHECK-NEXT: vsetvli zero, a0, e32, mf2, tu, ma
386+
; CHECK-NEXT: vfmv.s.f v8, fa5
387+
; CHECK-NEXT: ret
388+
entry:
389+
%a = call <vscale x 1 x float> @llvm.riscv.vfmv.s.f.nxv1f32(<vscale x 1 x float> %0, float -0.0, iXLen %1)
390+
ret <vscale x 1 x float> %a
391+
}
392+
393+
define <vscale x 1 x double> @intrinsic_vfmv.s.f_f_nxv1f64_negzero(<vscale x 1 x double> %0, iXLen %1) nounwind {
394+
; RV32-LABEL: intrinsic_vfmv.s.f_f_nxv1f64_negzero:
395+
; RV32: # %bb.0: # %entry
396+
; RV32-NEXT: fcvt.d.w fa5, zero
397+
; RV32-NEXT: fneg.d fa5, fa5
398+
; RV32-NEXT: vsetvli zero, a0, e64, m1, tu, ma
399+
; RV32-NEXT: vfmv.s.f v8, fa5
400+
; RV32-NEXT: ret
401+
;
402+
; RV64-LABEL: intrinsic_vfmv.s.f_f_nxv1f64_negzero:
403+
; RV64: # %bb.0: # %entry
404+
; RV64-NEXT: fmv.d.x fa5, zero
405+
; RV64-NEXT: fneg.d fa5, fa5
406+
; RV64-NEXT: vsetvli zero, a0, e64, m1, tu, ma
407+
; RV64-NEXT: vfmv.s.f v8, fa5
408+
; RV64-NEXT: ret
409+
entry:
410+
%a = call <vscale x 1 x double> @llvm.riscv.vfmv.s.f.nxv1f64(<vscale x 1 x double> %0, double -0.0, iXLen %1)
411+
ret <vscale x 1 x double> %a
412+
}

0 commit comments

Comments
 (0)