@@ -370,7 +370,7 @@ Constant *Constant::getIntegerValue(Type *Ty, const APInt &V) {
370370
371371 // Broadcast a scalar to a vector, if necessary.
372372 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
373- C = ConstantVector::getSplat (VTy->getNumElements (), C);
373+ C = ConstantVector::getSplat (VTy->getElementCount (), C);
374374
375375 return C;
376376}
@@ -387,7 +387,7 @@ Constant *Constant::getAllOnesValue(Type *Ty) {
387387 }
388388
389389 VectorType *VTy = cast<VectorType>(Ty);
390- return ConstantVector::getSplat (VTy->getNumElements (),
390+ return ConstantVector::getSplat (VTy->getElementCount (),
391391 getAllOnesValue (VTy->getElementType ()));
392392}
393393
@@ -681,15 +681,15 @@ Constant *ConstantInt::getTrue(Type *Ty) {
681681 assert (Ty->isIntOrIntVectorTy (1 ) && " Type not i1 or vector of i1." );
682682 ConstantInt *TrueC = ConstantInt::getTrue (Ty->getContext ());
683683 if (auto *VTy = dyn_cast<VectorType>(Ty))
684- return ConstantVector::getSplat (VTy->getNumElements (), TrueC);
684+ return ConstantVector::getSplat (VTy->getElementCount (), TrueC);
685685 return TrueC;
686686}
687687
688688Constant *ConstantInt::getFalse (Type *Ty) {
689689 assert (Ty->isIntOrIntVectorTy (1 ) && " Type not i1 or vector of i1." );
690690 ConstantInt *FalseC = ConstantInt::getFalse (Ty->getContext ());
691691 if (auto *VTy = dyn_cast<VectorType>(Ty))
692- return ConstantVector::getSplat (VTy->getNumElements (), FalseC);
692+ return ConstantVector::getSplat (VTy->getElementCount (), FalseC);
693693 return FalseC;
694694}
695695
@@ -712,7 +712,7 @@ Constant *ConstantInt::get(Type *Ty, uint64_t V, bool isSigned) {
712712
713713 // For vectors, broadcast the value.
714714 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
715- return ConstantVector::getSplat (VTy->getNumElements (), C);
715+ return ConstantVector::getSplat (VTy->getElementCount (), C);
716716
717717 return C;
718718}
@@ -736,7 +736,7 @@ Constant *ConstantInt::get(Type *Ty, const APInt& V) {
736736
737737 // For vectors, broadcast the value.
738738 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
739- return ConstantVector::getSplat (VTy->getNumElements (), C);
739+ return ConstantVector::getSplat (VTy->getElementCount (), C);
740740
741741 return C;
742742}
@@ -781,7 +781,7 @@ Constant *ConstantFP::get(Type *Ty, double V) {
781781
782782 // For vectors, broadcast the value.
783783 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
784- return ConstantVector::getSplat (VTy->getNumElements (), C);
784+ return ConstantVector::getSplat (VTy->getElementCount (), C);
785785
786786 return C;
787787}
@@ -793,7 +793,7 @@ Constant *ConstantFP::get(Type *Ty, const APFloat &V) {
793793
794794 // For vectors, broadcast the value.
795795 if (auto *VTy = dyn_cast<VectorType>(Ty))
796- return ConstantVector::getSplat (VTy->getNumElements (), C);
796+ return ConstantVector::getSplat (VTy->getElementCount (), C);
797797
798798 return C;
799799}
@@ -806,7 +806,7 @@ Constant *ConstantFP::get(Type *Ty, StringRef Str) {
806806
807807 // For vectors, broadcast the value.
808808 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
809- return ConstantVector::getSplat (VTy->getNumElements (), C);
809+ return ConstantVector::getSplat (VTy->getElementCount (), C);
810810
811811 return C;
812812}
@@ -817,7 +817,7 @@ Constant *ConstantFP::getNaN(Type *Ty, bool Negative, uint64_t Payload) {
817817 Constant *C = get (Ty->getContext (), NaN);
818818
819819 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
820- return ConstantVector::getSplat (VTy->getNumElements (), C);
820+ return ConstantVector::getSplat (VTy->getElementCount (), C);
821821
822822 return C;
823823}
@@ -828,7 +828,7 @@ Constant *ConstantFP::getQNaN(Type *Ty, bool Negative, APInt *Payload) {
828828 Constant *C = get (Ty->getContext (), NaN);
829829
830830 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
831- return ConstantVector::getSplat (VTy->getNumElements (), C);
831+ return ConstantVector::getSplat (VTy->getElementCount (), C);
832832
833833 return C;
834834}
@@ -839,7 +839,7 @@ Constant *ConstantFP::getSNaN(Type *Ty, bool Negative, APInt *Payload) {
839839 Constant *C = get (Ty->getContext (), NaN);
840840
841841 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
842- return ConstantVector::getSplat (VTy->getNumElements (), C);
842+ return ConstantVector::getSplat (VTy->getElementCount (), C);
843843
844844 return C;
845845}
@@ -850,7 +850,7 @@ Constant *ConstantFP::getNegativeZero(Type *Ty) {
850850 Constant *C = get (Ty->getContext (), NegZero);
851851
852852 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
853- return ConstantVector::getSplat (VTy->getNumElements (), C);
853+ return ConstantVector::getSplat (VTy->getElementCount (), C);
854854
855855 return C;
856856}
@@ -898,7 +898,7 @@ Constant *ConstantFP::getInfinity(Type *Ty, bool Negative) {
898898 Constant *C = get (Ty->getContext (), APFloat::getInf (Semantics, Negative));
899899
900900 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
901- return ConstantVector::getSplat (VTy->getNumElements (), C);
901+ return ConstantVector::getSplat (VTy->getElementCount (), C);
902902
903903 return C;
904904}
@@ -1204,15 +1204,35 @@ Constant *ConstantVector::getImpl(ArrayRef<Constant*> V) {
12041204 return nullptr ;
12051205}
12061206
1207- Constant *ConstantVector::getSplat (unsigned NumElts, Constant *V) {
1208- // If this splat is compatible with ConstantDataVector, use it instead of
1209- // ConstantVector.
1210- if ((isa<ConstantFP>(V) || isa<ConstantInt>(V)) &&
1211- ConstantDataSequential::isElementTypeCompatible (V->getType ()))
1212- return ConstantDataVector::getSplat (NumElts, V);
1207+ Constant *ConstantVector::getSplat (ElementCount EC, Constant *V) {
1208+ if (!EC.Scalable ) {
1209+ // If this splat is compatible with ConstantDataVector, use it instead of
1210+ // ConstantVector.
1211+ if ((isa<ConstantFP>(V) || isa<ConstantInt>(V)) &&
1212+ ConstantDataSequential::isElementTypeCompatible (V->getType ()))
1213+ return ConstantDataVector::getSplat (EC.Min , V);
12131214
1214- SmallVector<Constant*, 32 > Elts (NumElts, V);
1215- return get (Elts);
1215+ SmallVector<Constant *, 32 > Elts (EC.Min , V);
1216+ return get (Elts);
1217+ }
1218+
1219+ Type *VTy = VectorType::get (V->getType (), EC);
1220+
1221+ if (V->isNullValue ())
1222+ return ConstantAggregateZero::get (VTy);
1223+ else if (isa<UndefValue>(V))
1224+ return UndefValue::get (VTy);
1225+
1226+ Type *I32Ty = Type::getInt32Ty (VTy->getContext ());
1227+
1228+ // Move scalar into vector.
1229+ Constant *UndefV = UndefValue::get (VTy);
1230+ V = ConstantExpr::getInsertElement (UndefV, V, ConstantInt::get (I32Ty, 0 ));
1231+ // Build shuffle mask to perform the splat.
1232+ Type *MaskTy = VectorType::get (I32Ty, EC);
1233+ Constant *Zeros = ConstantAggregateZero::get (MaskTy);
1234+ // Splat.
1235+ return ConstantExpr::getShuffleVector (V, UndefV, Zeros);
12161236}
12171237
12181238ConstantTokenNone *ConstantTokenNone::get (LLVMContext &Context) {
@@ -2098,15 +2118,15 @@ Constant *ConstantExpr::getGetElementPtr(Type *Ty, Constant *C,
20982118 unsigned AS = C->getType ()->getPointerAddressSpace ();
20992119 Type *ReqTy = DestTy->getPointerTo (AS);
21002120
2101- unsigned NumVecElts = 0 ;
2102- if (C->getType ()-> isVectorTy ( ))
2103- NumVecElts = C-> getType ()-> getVectorNumElements ();
2121+ ElementCount EltCount = { 0 , false } ;
2122+ if (VectorType *VecTy = dyn_cast<VectorType>( C->getType ()))
2123+ EltCount = VecTy-> getElementCount ();
21042124 else for (auto Idx : Idxs)
2105- if (Idx->getType ()-> isVectorTy ( ))
2106- NumVecElts = Idx-> getType ()-> getVectorNumElements ();
2125+ if (VectorType *VecTy = dyn_cast<VectorType>( Idx->getType ()))
2126+ EltCount = VecTy-> getElementCount ();
21072127
2108- if (NumVecElts )
2109- ReqTy = VectorType::get (ReqTy, NumVecElts );
2128+ if (EltCount. Min != 0 )
2129+ ReqTy = VectorType::get (ReqTy, EltCount );
21102130
21112131 if (OnlyIfReducedTy == ReqTy)
21122132 return nullptr ;
@@ -2117,12 +2137,12 @@ Constant *ConstantExpr::getGetElementPtr(Type *Ty, Constant *C,
21172137 ArgVec.push_back (C);
21182138 for (unsigned i = 0 , e = Idxs.size (); i != e; ++i) {
21192139 assert ((!Idxs[i]->getType ()->isVectorTy () ||
2120- Idxs[i]->getType ()->getVectorNumElements () == NumVecElts ) &&
2140+ Idxs[i]->getType ()->getVectorElementCount () == EltCount ) &&
21212141 " getelementptr index type missmatch" );
21222142
21232143 Constant *Idx = cast<Constant>(Idxs[i]);
2124- if (NumVecElts && !Idxs[i]->getType ()->isVectorTy ())
2125- Idx = ConstantVector::getSplat (NumVecElts , Idx);
2144+ if (EltCount. Min != 0 && !Idxs[i]->getType ()->isVectorTy ())
2145+ Idx = ConstantVector::getSplat (EltCount , Idx);
21262146 ArgVec.push_back (Idx);
21272147 }
21282148
@@ -2759,7 +2779,7 @@ Constant *ConstantDataVector::getSplat(unsigned NumElts, Constant *V) {
27592779 return getFP (V->getContext (), Elts);
27602780 }
27612781 }
2762- return ConstantVector::getSplat (NumElts, V);
2782+ return ConstantVector::getSplat ({ NumElts, false } , V);
27632783}
27642784
27652785
0 commit comments