Skip to content

Commit 92037f8

Browse files
committed
Fixups
1 parent d8ca293 commit 92037f8

File tree

2 files changed

+27
-20
lines changed

2 files changed

+27
-20
lines changed

llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,8 +1073,8 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
10731073
SDValue WidenVecRes_Unary(SDNode *N);
10741074
SDValue WidenVecRes_InregOp(SDNode *N);
10751075
SDValue WidenVecRes_UnaryOpWithTwoResults(SDNode *N, unsigned ResNo);
1076-
void ReplaceOtherWidenResult(SDNode *N, SDNode *WidenNode,
1077-
unsigned WidenResNo);
1076+
void ReplaceOtherWidenResults(SDNode *N, SDNode *WidenNode,
1077+
unsigned WidenResNo);
10781078

10791079
// Widen Vector Operand.
10801080
bool WidenVectorOperand(SDNode *N, unsigned OpNo);

llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

55335536
SDValue 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

Comments
 (0)