@@ -57,18 +57,14 @@ void RISCVDAGToDAGISel::PreprocessISelDAG() {
57
57
58
58
SDValue Result;
59
59
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: {
63
61
MVT VT = N->getSimpleValueType (0 );
64
- unsigned Opc =
65
- VT.isInteger () ? RISCVISD::VMV_V_X_VL : RISCVISD::VFMV_V_F_VL;
66
62
SDLoc DL (N);
67
63
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 ) {
70
66
unsigned NF = VT.getRISCVVectorTupleNumFields ();
71
- unsigned NumScalElts = VT.getSizeInBits () / (NF * 8 );
67
+ unsigned NumScalElts = VT.getSizeInBits (). getKnownMinValue () / (NF * 8 );
72
68
SDValue EltVal = CurDAG->getConstant (0 , DL, Subtarget->getXLenVT ());
73
69
MVT ScalTy =
74
70
MVT::getScalableVectorVT (MVT::getIntegerVT (8 ), NumScalElts);
@@ -80,10 +76,17 @@ void RISCVDAGToDAGISel::PreprocessISelDAG() {
80
76
for (unsigned i = 0 ; i < NF; ++i)
81
77
Result = CurDAG->getNode (RISCVISD::TUPLE_INSERT, DL, VT, Result,
82
78
Splat, CurDAG->getVectorIdxConstant (i, DL));
83
-
84
- break ;
85
79
}
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 ());
87
90
SDValue Src = N->getOperand (0 );
88
91
if (VT.isInteger ())
89
92
Src = CurDAG->getNode (ISD::ANY_EXTEND, DL, Subtarget->getXLenVT (),
0 commit comments