Skip to content

Commit 8fbfafc

Browse files
committed
fixup! [RISCV] Handle zeroinitializer of vector tuple Type
1 parent 08abba2 commit 8fbfafc

File tree

4 files changed

+39
-32
lines changed

4 files changed

+39
-32
lines changed

llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1902,8 +1902,9 @@ SDValue SelectionDAGBuilder::getValueImpl(const Value *V) {
19021902
ISD::BITCAST, getCurSDLoc(), VT,
19031903
DAG.getNode(
19041904
ISD::SPLAT_VECTOR, getCurSDLoc(),
1905-
MVT::getScalableVectorVT(
1906-
MVT::i8, VT.getSizeInBits().getKnownMinValue() / 8),
1905+
EVT::getVectorVT(*DAG.getContext(), MVT::i8,
1906+
VT.getSizeInBits().getKnownMinValue() / 8,
1907+
true),
19071908
DAG.getConstant(0, getCurSDLoc(), MVT::getIntegerVT(8))));
19081909
}
19091910

llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -57,28 +57,6 @@ void RISCVDAGToDAGISel::PreprocessISelDAG() {
5757

5858
SDValue Result;
5959
switch (N->getOpcode()) {
60-
case ISD::BITCAST: {
61-
MVT VT = N->getSimpleValueType(0);
62-
SDLoc DL(N);
63-
SDValue VL = CurDAG->getRegister(RISCV::X0, Subtarget->getXLenVT());
64-
if (VT.isRISCVVectorTuple() &&
65-
N->getOperand(0)->getOpcode() == ISD::SPLAT_VECTOR) {
66-
unsigned NF = VT.getRISCVVectorTupleNumFields();
67-
unsigned NumScalElts = VT.getSizeInBits().getKnownMinValue() / (NF * 8);
68-
SDValue EltVal = CurDAG->getConstant(0, DL, Subtarget->getXLenVT());
69-
MVT ScalTy =
70-
MVT::getScalableVectorVT(MVT::getIntegerVT(8), NumScalElts);
71-
72-
SDValue Splat = CurDAG->getNode(RISCVISD::VMV_V_X_VL, DL, ScalTy,
73-
CurDAG->getUNDEF(ScalTy), EltVal, VL);
74-
75-
Result = CurDAG->getUNDEF(VT);
76-
for (unsigned i = 0; i < NF; ++i)
77-
Result = CurDAG->getNode(RISCVISD::TUPLE_INSERT, DL, VT, Result,
78-
Splat, CurDAG->getVectorIdxConstant(i, DL));
79-
}
80-
break;
81-
}
8260
case ISD::SPLAT_VECTOR: {
8361
// Convert integer SPLAT_VECTOR to VMV_V_X_VL and floating-point
8462
// SPLAT_VECTOR to VFMV_V_F_VL to reduce isel burden.

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18054,6 +18054,22 @@ SDValue RISCVTargetLowering::PerformDAGCombine(SDNode *N,
1805418054
SDValue N0 = N->getOperand(0);
1805518055
EVT VT = N->getValueType(0);
1805618056
EVT SrcVT = N0.getValueType();
18057+
if (VT.isRISCVVectorTuple() && N0->getOpcode() == ISD::SPLAT_VECTOR) {
18058+
SDValue VL = DAG.getRegister(RISCV::X0, Subtarget.getXLenVT());
18059+
unsigned NF = VT.getRISCVVectorTupleNumFields();
18060+
unsigned NumScalElts = VT.getSizeInBits().getKnownMinValue() / (NF * 8);
18061+
SDValue EltVal = DAG.getConstant(0, DL, Subtarget.getXLenVT());
18062+
MVT ScalTy = MVT::getScalableVectorVT(MVT::getIntegerVT(8), NumScalElts);
18063+
18064+
SDValue Splat = DAG.getNode(RISCVISD::VMV_V_X_VL, DL, ScalTy,
18065+
DAG.getUNDEF(ScalTy), EltVal, VL);
18066+
18067+
SDValue Result = DAG.getUNDEF(VT);
18068+
for (unsigned i = 0; i < NF; ++i)
18069+
Result = DAG.getNode(RISCVISD::TUPLE_INSERT, DL, VT, Result, Splat,
18070+
DAG.getVectorIdxConstant(i, DL));
18071+
return Result;
18072+
}
1805718073
// If this is a bitcast between a MVT::v4i1/v2i1/v1i1 and an illegal integer
1805818074
// type, widen both sides to avoid a trip through memory.
1805918075
if ((SrcVT == MVT::v1i1 || SrcVT == MVT::v2i1 || SrcVT == MVT::v4i1) &&

llvm/test/CodeGen/RISCV/vector-tuple-zeroinitializer.ll

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2-
; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+v \
2+
; RUN: llc -mtriple=riscv32 -mattr=+v \
33
; RUN: -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK
4-
; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+v \
4+
; RUN: llc -mtriple=riscv64 -mattr=+v \
55
; RUN: -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK
66

7-
define target("riscv.vector.tuple", <vscale x 16 x i8>, 2) @test_tuple_zero0() {
8-
; CHECK-LABEL: test_tuple_zero0:
7+
define target("riscv.vector.tuple", <vscale x 16 x i8>, 2) @test_tuple_zero_power_of_2() {
8+
; CHECK-LABEL: test_tuple_zero_power_of_2:
99
; CHECK: # %bb.0: # %entry
1010
; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma
1111
; CHECK-NEXT: vmv.v.i v8, 0
@@ -15,8 +15,20 @@ entry:
1515
ret target("riscv.vector.tuple", <vscale x 16 x i8>, 2) zeroinitializer
1616
}
1717

18-
define target("riscv.vector.tuple", <vscale x 16 x i8>, 2) @test_tuple_zero1(<vscale x 4 x i32> %a) {
19-
; CHECK-LABEL: test_tuple_zero1:
18+
define target("riscv.vector.tuple", <vscale x 16 x i8>, 3) @test_tuple_zero_non_power_of_2() {
19+
; CHECK-LABEL: test_tuple_zero_non_power_of_2:
20+
; CHECK: # %bb.0: # %entry
21+
; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma
22+
; CHECK-NEXT: vmv.v.i v8, 0
23+
; CHECK-NEXT: vmv.v.i v10, 0
24+
; CHECK-NEXT: vmv.v.i v12, 0
25+
; CHECK-NEXT: ret
26+
entry:
27+
ret target("riscv.vector.tuple", <vscale x 16 x i8>, 3) zeroinitializer
28+
}
29+
30+
define target("riscv.vector.tuple", <vscale x 16 x i8>, 2) @test_tuple_zero_insert1(<vscale x 4 x i32> %a) {
31+
; CHECK-LABEL: test_tuple_zero_insert1:
2032
; CHECK: # %bb.0: # %entry
2133
; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma
2234
; CHECK-NEXT: vmv.v.i v10, 0
@@ -26,8 +38,8 @@ entry:
2638
ret target("riscv.vector.tuple", <vscale x 16 x i8>, 2) %1
2739
}
2840

29-
define target("riscv.vector.tuple", <vscale x 16 x i8>, 2) @test_tuple_zero2(<vscale x 4 x i32> %a) {
30-
; CHECK-LABEL: test_tuple_zero2:
41+
define target("riscv.vector.tuple", <vscale x 16 x i8>, 2) @test_tuple_zero_insert2(<vscale x 4 x i32> %a) {
42+
; CHECK-LABEL: test_tuple_zero_insert2:
3143
; CHECK: # %bb.0: # %entry
3244
; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma
3345
; CHECK-NEXT: vmv.v.i v6, 0

0 commit comments

Comments
 (0)