Skip to content

Commit ed6dc62

Browse files
authored
DAG: Handle equal size element build_vector promotion (#76213)
1 parent 5841140 commit ed6dc62

File tree

1 file changed

+7
-3
lines changed

1 file changed

+7
-3
lines changed

llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4908,7 +4908,9 @@ void SelectionDAGLegalize::ConvertNodeToLibcall(SDNode *Node) {
49084908
static MVT getPromotedVectorElementType(const TargetLowering &TLI,
49094909
MVT EltVT, MVT NewEltVT) {
49104910
unsigned OldEltsPerNewElt = EltVT.getSizeInBits() / NewEltVT.getSizeInBits();
4911-
MVT MidVT = MVT::getVectorVT(NewEltVT, OldEltsPerNewElt);
4911+
MVT MidVT = OldEltsPerNewElt == 1
4912+
? NewEltVT
4913+
: MVT::getVectorVT(NewEltVT, OldEltsPerNewElt);
49124914
assert(TLI.isTypeLegal(MidVT) && "unexpected");
49134915
return MidVT;
49144916
}
@@ -5395,7 +5397,7 @@ void SelectionDAGLegalize::PromoteNode(SDNode *Node) {
53955397

53965398
assert(NVT.isVector() && OVT.getSizeInBits() == NVT.getSizeInBits() &&
53975399
"Invalid promote type for build_vector");
5398-
assert(NewEltVT.bitsLT(EltVT) && "not handled");
5400+
assert(NewEltVT.bitsLE(EltVT) && "not handled");
53995401

54005402
MVT MidVT = getPromotedVectorElementType(TLI, EltVT, NewEltVT);
54015403

@@ -5406,7 +5408,9 @@ void SelectionDAGLegalize::PromoteNode(SDNode *Node) {
54065408
}
54075409

54085410
SDLoc SL(Node);
5409-
SDValue Concat = DAG.getNode(ISD::CONCAT_VECTORS, SL, NVT, NewOps);
5411+
SDValue Concat =
5412+
DAG.getNode(MidVT == NewEltVT ? ISD::BUILD_VECTOR : ISD::CONCAT_VECTORS,
5413+
SL, NVT, NewOps);
54105414
SDValue CvtVec = DAG.getNode(ISD::BITCAST, SL, OVT, Concat);
54115415
Results.push_back(CvtVec);
54125416
break;

0 commit comments

Comments
 (0)