@@ -2325,26 +2325,25 @@ NVPTXTargetLowering::LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const {
23252325SDValue NVPTXTargetLowering::LowerBITCAST (SDValue Op, SelectionDAG &DAG) const {
23262326 // Handle bitcasting from v2i8 without hitting the default promotion
23272327 // strategy which goes through stack memory.
2328- SDLoc DL (Op);
2329-
2330- EVT ToVT = Op->getValueType (0 );
23312328 EVT FromVT = Op->getOperand (0 )->getValueType (0 );
2332-
2333- if (FromVT == MVT::v2i8) {
2334- // Pack vector elements into i16 and bitcast to final type
2335- SDValue Vec0 = DAG.getNode (ISD::EXTRACT_VECTOR_ELT, DL, MVT::i8 ,
2336- Op->getOperand (0 ), DAG.getIntPtrConstant (0 , DL));
2337- SDValue Vec1 = DAG.getNode (ISD::EXTRACT_VECTOR_ELT, DL, MVT::i8 ,
2338- Op->getOperand (0 ), DAG.getIntPtrConstant (1 , DL));
2339- SDValue Extend0 = DAG.getNode (ISD::ZERO_EXTEND, DL, MVT::i16 , Vec0);
2340- SDValue Extend1 = DAG.getNode (ISD::ZERO_EXTEND, DL, MVT::i16 , Vec1);
2341- SDValue Const8 = DAG.getConstant (8 , DL, MVT::i16 );
2342- SDValue AsInt = DAG.getNode (
2343- ISD::OR, DL, MVT::i16 ,
2344- {Extend0, DAG.getNode (ISD::SHL, DL, MVT::i16 , {Extend1, Const8})});
2345- return MaybeBitcast (DAG, DL, ToVT, AsInt);
2329+ if (FromVT != MVT::v2i8) {
2330+ return Op;
23462331 }
2347- return Op;
2332+
2333+ // Pack vector elements into i16 and bitcast to final type
2334+ SDLoc DL (Op);
2335+ SDValue Vec0 = DAG.getNode (ISD::EXTRACT_VECTOR_ELT, DL, MVT::i8 ,
2336+ Op->getOperand (0 ), DAG.getIntPtrConstant (0 , DL));
2337+ SDValue Vec1 = DAG.getNode (ISD::EXTRACT_VECTOR_ELT, DL, MVT::i8 ,
2338+ Op->getOperand (0 ), DAG.getIntPtrConstant (1 , DL));
2339+ SDValue Extend0 = DAG.getNode (ISD::ZERO_EXTEND, DL, MVT::i16 , Vec0);
2340+ SDValue Extend1 = DAG.getNode (ISD::ZERO_EXTEND, DL, MVT::i16 , Vec1);
2341+ SDValue Const8 = DAG.getConstant (8 , DL, MVT::i16 );
2342+ SDValue AsInt = DAG.getNode (
2343+ ISD::OR, DL, MVT::i16 ,
2344+ {Extend0, DAG.getNode (ISD::SHL, DL, MVT::i16 , {Extend1, Const8})});
2345+ EVT ToVT = Op->getValueType (0 );
2346+ return MaybeBitcast (DAG, DL, ToVT, AsInt);
23482347}
23492348
23502349// We can init constant f16x2/v2i16/v4i8 with a single .b32 move. Normally it
@@ -6171,19 +6170,21 @@ static void ReplaceBITCAST(SDNode *Node, SelectionDAG &DAG,
61716170 // Handle bitcasting to v2i8 without hitting the default promotion
61726171 // strategy which goes through stack memory.
61736172 SDValue Op (Node, 0 );
6174- SDLoc DL (Node);
6175-
61766173 EVT ToVT = Op->getValueType (0 );
6177- if (ToVT == MVT::v2i8) {
6178- SDValue AsInt = MaybeBitcast (DAG, DL, MVT::i16 , Op->getOperand (0 ));
6179- SDValue Vec0 = DAG.getNode (ISD::TRUNCATE, DL, MVT::i8 , AsInt);
6180- SDValue Const8 = DAG.getConstant (8 , DL, MVT::i16 );
6181- SDValue Vec1 =
6182- DAG.getNode (ISD::TRUNCATE, DL, MVT::i8 ,
6183- DAG.getNode (ISD::SRL, DL, MVT::i16 , {AsInt, Const8}));
6184- Results.push_back (
6185- DAG.getNode (ISD::BUILD_VECTOR, DL, MVT::v2i8, {Vec0, Vec1}));
6174+ if (ToVT != MVT::v2i8) {
6175+ return ;
61866176 }
6177+
6178+ // Bitcast to i16 and unpack elements into a vector
6179+ SDLoc DL (Node);
6180+ SDValue AsInt = MaybeBitcast (DAG, DL, MVT::i16 , Op->getOperand (0 ));
6181+ SDValue Vec0 = DAG.getNode (ISD::TRUNCATE, DL, MVT::i8 , AsInt);
6182+ SDValue Const8 = DAG.getConstant (8 , DL, MVT::i16 );
6183+ SDValue Vec1 =
6184+ DAG.getNode (ISD::TRUNCATE, DL, MVT::i8 ,
6185+ DAG.getNode (ISD::SRL, DL, MVT::i16 , {AsInt, Const8}));
6186+ Results.push_back (
6187+ DAG.getNode (ISD::BUILD_VECTOR, DL, MVT::v2i8, {Vec0, Vec1}));
61876188}
61886189
61896190// / ReplaceVectorLoad - Convert vector loads into multi-output scalar loads.
0 commit comments