@@ -4435,19 +4435,22 @@ SDValue DAGTypeLegalizer::SplitVecOp_VECTOR_HISTOGRAM(SDNode *N) {
44354435// Result Vector Widening
44364436// ===----------------------------------------------------------------------===//
44374437
4438- void DAGTypeLegalizer::ReplaceOtherWidenResult (SDNode *N, SDNode *WidenNode,
4439- unsigned WidenResNo) {
4440- assert (N->getNumValues () == 2 && " expected node with two results" );
4441- unsigned OtherNo = 1 - WidenResNo;
4442- EVT OtherVT = N->getValueType (OtherNo);
4443- if (getTypeAction (OtherVT) == TargetLowering::TypeWidenVector) {
4444- SetWidenedVector (SDValue (N, OtherNo), SDValue (WidenNode, OtherNo));
4445- } else {
4446- SDLoc DL (N);
4447- SDValue OtherVal = DAG.getNode (ISD::EXTRACT_SUBVECTOR, DL, OtherVT,
4448- SDValue (WidenNode, OtherNo),
4438+ void DAGTypeLegalizer::ReplaceOtherWidenResults (SDNode *N, SDNode *WidenNode,
4439+ unsigned WidenResNo) {
4440+ unsigned NumResults = N->getNumValues ();
4441+ for (unsigned ResNo = 0 ; ResNo < NumResults; ResNo++) {
4442+ if (ResNo == WidenResNo)
4443+ continue ;
4444+ EVT ResVT = N->getValueType (ResNo);
4445+ if (getTypeAction (ResVT) == TargetLowering::TypeWidenVector) {
4446+ SetWidenedVector (SDValue (N, ResNo), SDValue (WidenNode, ResNo));
4447+ } else {
4448+ SDLoc DL (N);
4449+ SDValue ResVal = DAG.getNode (ISD::EXTRACT_SUBVECTOR, DL, ResVT,
4450+ SDValue (WidenNode, ResNo),
44494451 DAG.getVectorIdxConstant (0 , DL));
4450- ReplaceValueWith (SDValue (N, OtherNo), OtherVal);
4452+ ReplaceValueWith (SDValue (N, ResNo), ResVal);
4453+ }
44514454 }
44524455}
44534456
@@ -4470,8 +4473,8 @@ void DAGTypeLegalizer::WidenVectorResult(SDNode *N, unsigned ResNo) {
44704473 if (!TLI.isOperationLegalOrCustomOrPromote (N->getOpcode (), WideVecVT) &&
44714474 TLI.isOperationExpand (N->getOpcode (), VT.getScalarType ())) {
44724475 Res = DAG.UnrollVectorOp (N, WideVecVT.getVectorNumElements ());
4473- if (N->getNumValues () == 2 )
4474- ReplaceOtherWidenResult (N, Res.getNode (), ResNo);
4476+ if (N->getNumValues () > 1 )
4477+ ReplaceOtherWidenResults (N, Res.getNode (), ResNo);
44754478 return true ;
44764479 }
44774480 return false ;
@@ -5532,23 +5535,27 @@ SDValue DAGTypeLegalizer::WidenVecRes_InregOp(SDNode *N) {
55325535
55335536SDValue DAGTypeLegalizer::WidenVecRes_UnaryOpWithTwoResults (SDNode *N,
55345537 unsigned ResNo) {
5538+ EVT VT0 = N->getValueType (0 );
5539+ EVT VT1 = N->getValueType (1 );
5540+
5541+ assert (VT0.isVector () && VT1.isVector () &&
5542+ VT0.getVectorElementCount () == VT1.getVectorElementCount () &&
5543+ " expected both results to be vectors of matching element count" );
5544+
55355545 LLVMContext &Ctx = *DAG.getContext ();
55365546 SDValue InOp = GetWidenedVector (N->getOperand (0 ));
55375547
55385548 EVT WidenVT = TLI.getTypeToTransformTo (Ctx, N->getValueType (ResNo));
55395549 ElementCount WidenEC = WidenVT.getVectorElementCount ();
55405550
5541- EVT VT0 = N->getValueType (0 );
5542- EVT VT1 = N->getValueType (1 );
5543-
55445551 EVT WidenVT0 = EVT::getVectorVT (Ctx, VT0.getVectorElementType (), WidenEC);
55455552 EVT WidenVT1 = EVT::getVectorVT (Ctx, VT1.getVectorElementType (), WidenEC);
55465553
55475554 SDNode *WidenNode =
55485555 DAG.getNode (N->getOpcode (), SDLoc (N), {WidenVT0, WidenVT1}, InOp)
55495556 .getNode ();
55505557
5551- ReplaceOtherWidenResult (N, WidenNode, ResNo);
5558+ ReplaceOtherWidenResults (N, WidenNode, ResNo);
55525559 return SDValue (WidenNode, ResNo);
55535560}
55545561
0 commit comments