Skip to content

Commit bb8998d

Browse files
committed
[RISCV] Don't custom legalize vXf16 SPLAT_VECTOR with Zvfhmin without Zfhmin.
Marking SPLAT_VECTOR as Custom enables generic DAGCombine to turn BUILD_VECTOR into SPLAT_VECTOR. We need to custom type legalize BUILD_VECTOR without Zfhmin since we don't have the scalar f16 type. If we allow SPLAT_VECTOR to be formed, we'll need to custom type legalize it too. Easiest fix is to only enable SPLAT_VECTOR with Zvfhmin+Zfhmin. There's still an issue that we need to properly support BUILD_VECTOR with Zvfhmin+Zfhmin. Should fix the new case reported in #97849. I've also changed the predicates to Zfhmin instead of ZfhminOrZhinxmin since Zhinx isn't compatible with Zvfhmin.
1 parent 7eb1a32 commit bb8998d

File tree

2 files changed

+53
-20
lines changed

2 files changed

+53
-20
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

+9-7
Original file line numberDiff line numberDiff line change
@@ -1078,7 +1078,7 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
10781078
setOperationAction({ISD::CONCAT_VECTORS, ISD::INSERT_SUBVECTOR,
10791079
ISD::EXTRACT_SUBVECTOR},
10801080
VT, Custom);
1081-
if (Subtarget.hasStdExtZfhminOrZhinxmin())
1081+
if (Subtarget.hasStdExtZfhmin())
10821082
setOperationAction(ISD::SPLAT_VECTOR, VT, Custom);
10831083
// load/store
10841084
setOperationAction({ISD::LOAD, ISD::STORE}, VT, Custom);
@@ -1327,12 +1327,14 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
13271327
ISD::VP_SINT_TO_FP, ISD::VP_UINT_TO_FP},
13281328
VT, Custom);
13291329
setOperationAction(ISD::VECTOR_SHUFFLE, VT, Custom);
1330-
// FIXME: We should prefer BUILD_VECTOR over SPLAT_VECTOR.
1331-
setOperationAction(ISD::SPLAT_VECTOR, VT, Custom);
1332-
// We need to custom legalize f16 build vectors if Zfhmin isn't
1333-
// available.
1334-
if (!Subtarget.hasStdExtZfhminOrZhinxmin())
1330+
if (Subtarget.hasStdExtZfhmin()) {
1331+
// FIXME: We should prefer BUILD_VECTOR over SPLAT_VECTOR.
1332+
setOperationAction(ISD::SPLAT_VECTOR, VT, Custom);
1333+
} else {
1334+
// We need to custom legalize f16 build vectors if Zfhmin isn't
1335+
// available.
13351336
setOperationAction(ISD::BUILD_VECTOR, MVT::f16, Custom);
1337+
}
13361338
MVT F32VecVT = MVT::getVectorVT(MVT::f32, VT.getVectorElementCount());
13371339
// Don't promote f16 vector operations to f32 if f32 vector type is
13381340
// not legal.
@@ -4001,7 +4003,7 @@ static SDValue lowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG,
40014003

40024004
// If we don't have scalar f16, we need to bitcast to an i16 vector.
40034005
if (VT.getVectorElementType() == MVT::f16 &&
4004-
!Subtarget.hasStdExtZfhminOrZhinxmin())
4006+
!Subtarget.hasStdExtZfhmin())
40054007
return lowerBUILD_VECTORvXf16(Op, DAG);
40064008

40074009
if (ISD::isBuildVectorOfConstantSDNodes(Op.getNode()) ||

llvm/test/CodeGen/RISCV/rvv/fixed-vectors-fp-splat.ll

+44-13
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,30 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
22
; RUN: llc -mtriple=riscv32 -target-abi=ilp32d -mattr=+v,+zfh,+zvfh,+f,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,CHECK-RV32
3-
; RUN: llc -mtriple=riscv64 -target-abi=lp64d -mattr=+v,+zfh,+zvfh,+f,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,CHECK-RV64
3+
; RUN: llc -mtriple=riscv64 -target-abi=lp64d -mattr=+v,+zfh,+zvfh,+f,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,CHECK-RV64,RV64-ZVFH
4+
; RUN: llc -mtriple=riscv64 -target-abi=lp64d -mattr=+v,+zvfhmin,+f,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,CHECK-RV64,RV64-ZVFHMIN
45

56
define void @splat_v8f16(ptr %x, half %y) {
6-
; CHECK-LABEL: splat_v8f16:
7-
; CHECK: # %bb.0:
8-
; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma
9-
; CHECK-NEXT: vfmv.v.f v8, fa0
10-
; CHECK-NEXT: vse16.v v8, (a0)
11-
; CHECK-NEXT: ret
7+
; CHECK-RV32-LABEL: splat_v8f16:
8+
; CHECK-RV32: # %bb.0:
9+
; CHECK-RV32-NEXT: vsetivli zero, 8, e16, m1, ta, ma
10+
; CHECK-RV32-NEXT: vfmv.v.f v8, fa0
11+
; CHECK-RV32-NEXT: vse16.v v8, (a0)
12+
; CHECK-RV32-NEXT: ret
13+
;
14+
; RV64-ZVFH-LABEL: splat_v8f16:
15+
; RV64-ZVFH: # %bb.0:
16+
; RV64-ZVFH-NEXT: vsetivli zero, 8, e16, m1, ta, ma
17+
; RV64-ZVFH-NEXT: vfmv.v.f v8, fa0
18+
; RV64-ZVFH-NEXT: vse16.v v8, (a0)
19+
; RV64-ZVFH-NEXT: ret
20+
;
21+
; RV64-ZVFHMIN-LABEL: splat_v8f16:
22+
; RV64-ZVFHMIN: # %bb.0:
23+
; RV64-ZVFHMIN-NEXT: fmv.x.w a1, fa0
24+
; RV64-ZVFHMIN-NEXT: vsetivli zero, 8, e16, m1, ta, ma
25+
; RV64-ZVFHMIN-NEXT: vmv.v.x v8, a1
26+
; RV64-ZVFHMIN-NEXT: vse16.v v8, (a0)
27+
; RV64-ZVFHMIN-NEXT: ret
1228
%a = insertelement <8 x half> poison, half %y, i32 0
1329
%b = shufflevector <8 x half> %a, <8 x half> poison, <8 x i32> zeroinitializer
1430
store <8 x half> %b, ptr %x
@@ -42,12 +58,27 @@ define void @splat_v2f64(ptr %x, double %y) {
4258
}
4359

4460
define void @splat_16f16(ptr %x, half %y) {
45-
; CHECK-LABEL: splat_16f16:
46-
; CHECK: # %bb.0:
47-
; CHECK-NEXT: vsetivli zero, 16, e16, m2, ta, ma
48-
; CHECK-NEXT: vfmv.v.f v8, fa0
49-
; CHECK-NEXT: vse16.v v8, (a0)
50-
; CHECK-NEXT: ret
61+
; CHECK-RV32-LABEL: splat_16f16:
62+
; CHECK-RV32: # %bb.0:
63+
; CHECK-RV32-NEXT: vsetivli zero, 16, e16, m2, ta, ma
64+
; CHECK-RV32-NEXT: vfmv.v.f v8, fa0
65+
; CHECK-RV32-NEXT: vse16.v v8, (a0)
66+
; CHECK-RV32-NEXT: ret
67+
;
68+
; RV64-ZVFH-LABEL: splat_16f16:
69+
; RV64-ZVFH: # %bb.0:
70+
; RV64-ZVFH-NEXT: vsetivli zero, 16, e16, m2, ta, ma
71+
; RV64-ZVFH-NEXT: vfmv.v.f v8, fa0
72+
; RV64-ZVFH-NEXT: vse16.v v8, (a0)
73+
; RV64-ZVFH-NEXT: ret
74+
;
75+
; RV64-ZVFHMIN-LABEL: splat_16f16:
76+
; RV64-ZVFHMIN: # %bb.0:
77+
; RV64-ZVFHMIN-NEXT: fmv.x.w a1, fa0
78+
; RV64-ZVFHMIN-NEXT: vsetivli zero, 16, e16, m2, ta, ma
79+
; RV64-ZVFHMIN-NEXT: vmv.v.x v8, a1
80+
; RV64-ZVFHMIN-NEXT: vse16.v v8, (a0)
81+
; RV64-ZVFHMIN-NEXT: ret
5182
%a = insertelement <16 x half> poison, half %y, i32 0
5283
%b = shufflevector <16 x half> %a, <16 x half> poison, <16 x i32> zeroinitializer
5384
store <16 x half> %b, ptr %x

0 commit comments

Comments
 (0)