Skip to content

Commit 663cd55

Browse files
committed
fixup! [RISCV] Handle zeroinitializer of vector tuple Type
1 parent 58efc9a commit 663cd55

File tree

3 files changed

+20
-16
lines changed

3 files changed

+20
-16
lines changed

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6434,9 +6434,6 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
64346434
return getNode(ISD::VECREDUCE_AND, DL, VT, N1);
64356435
break;
64366436
case ISD::SPLAT_VECTOR:
6437-
// RISC-V vector tuple type is not a vector type.
6438-
if (VT.isRISCVVectorTuple())
6439-
break;
64406437
assert(VT.isVector() && "Wrong return type!");
64416438
// FIXME: Hexagon uses i32 scalar for a floating point zero vector so allow
64426439
// that for now.

llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1899,8 +1899,12 @@ SDValue SelectionDAGBuilder::getValueImpl(const Value *V) {
18991899
if (VT.isRISCVVectorTuple()) {
19001900
assert(C->isNullValue() && "Can only zero this target type!");
19011901
return NodeMap[V] = DAG.getNode(
1902-
ISD::SPLAT_VECTOR, getCurSDLoc(), VT,
1903-
DAG.getConstant(0, getCurSDLoc(), MVT::getIntegerVT(8)));
1902+
ISD::BITCAST, getCurSDLoc(), VT,
1903+
DAG.getNode(
1904+
ISD::SPLAT_VECTOR, getCurSDLoc(),
1905+
MVT::getScalableVectorVT(
1906+
MVT::i8, VT.getSizeInBits().getKnownMinValue() / 8),
1907+
DAG.getConstant(0, getCurSDLoc(), MVT::getIntegerVT(8))));
19041908
}
19051909

19061910
VectorType *VecTy = cast<VectorType>(V->getType());

llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -57,18 +57,14 @@ void RISCVDAGToDAGISel::PreprocessISelDAG() {
5757

5858
SDValue Result;
5959
switch (N->getOpcode()) {
60-
case ISD::SPLAT_VECTOR: {
61-
// Convert integer SPLAT_VECTOR to VMV_V_X_VL and floating-point
62-
// SPLAT_VECTOR to VFMV_V_F_VL to reduce isel burden.
60+
case ISD::BITCAST: {
6361
MVT VT = N->getSimpleValueType(0);
64-
unsigned Opc =
65-
VT.isInteger() ? RISCVISD::VMV_V_X_VL : RISCVISD::VFMV_V_F_VL;
6662
SDLoc DL(N);
6763
SDValue VL = CurDAG->getRegister(RISCV::X0, Subtarget->getXLenVT());
68-
69-
if (VT.isRISCVVectorTuple()) {
64+
if (VT.isRISCVVectorTuple() &&
65+
N->getOperand(0)->getOpcode() == ISD::SPLAT_VECTOR) {
7066
unsigned NF = VT.getRISCVVectorTupleNumFields();
71-
unsigned NumScalElts = VT.getSizeInBits() / (NF * 8);
67+
unsigned NumScalElts = VT.getSizeInBits().getKnownMinValue() / (NF * 8);
7268
SDValue EltVal = CurDAG->getConstant(0, DL, Subtarget->getXLenVT());
7369
MVT ScalTy =
7470
MVT::getScalableVectorVT(MVT::getIntegerVT(8), NumScalElts);
@@ -80,10 +76,17 @@ void RISCVDAGToDAGISel::PreprocessISelDAG() {
8076
for (unsigned i = 0; i < NF; ++i)
8177
Result = CurDAG->getNode(RISCVISD::TUPLE_INSERT, DL, VT, Result,
8278
Splat, CurDAG->getVectorIdxConstant(i, DL));
83-
84-
break;
8579
}
86-
80+
break;
81+
}
82+
case ISD::SPLAT_VECTOR: {
83+
// Convert integer SPLAT_VECTOR to VMV_V_X_VL and floating-point
84+
// SPLAT_VECTOR to VFMV_V_F_VL to reduce isel burden.
85+
MVT VT = N->getSimpleValueType(0);
86+
unsigned Opc =
87+
VT.isInteger() ? RISCVISD::VMV_V_X_VL : RISCVISD::VFMV_V_F_VL;
88+
SDLoc DL(N);
89+
SDValue VL = CurDAG->getRegister(RISCV::X0, Subtarget->getXLenVT());
8790
SDValue Src = N->getOperand(0);
8891
if (VT.isInteger())
8992
Src = CurDAG->getNode(ISD::ANY_EXTEND, DL, Subtarget->getXLenVT(),

0 commit comments

Comments
 (0)