26 if (MangledName.
empty())
50 ParseRet tryParseMask(
StringRef &MangledName,
bool &IsMasked) {
69 ParseRet tryParseVLEN(
StringRef &ParseString,
unsigned &VF,
bool &IsScalable) {
102 ParseRet tryParseLinearTokenWithRuntimeStep(
StringRef &ParseString,
126 ParseRet tryParseLinearWithRuntimeStep(
StringRef &ParseString,
131 Ret = tryParseLinearTokenWithRuntimeStep(ParseString, PKind, StepOrPos,
"ls");
136 Ret = tryParseLinearTokenWithRuntimeStep(ParseString, PKind, StepOrPos,
"Rs");
141 Ret = tryParseLinearTokenWithRuntimeStep(ParseString, PKind, StepOrPos,
"Ls");
146 Ret = tryParseLinearTokenWithRuntimeStep(ParseString, PKind, StepOrPos,
"Us");
165 ParseRet tryParseCompileTimeLinearToken(
StringRef &ParseString,
190 ParseRet tryParseLinearWithCompileTimeStep(
StringRef &ParseString,
193 if (tryParseCompileTimeLinearToken(ParseString, PKind, StepOrPos,
"l") ==
198 if (tryParseCompileTimeLinearToken(ParseString, PKind, StepOrPos,
"R") ==
203 if (tryParseCompileTimeLinearToken(ParseString, PKind, StepOrPos,
"L") ==
208 if (tryParseCompileTimeLinearToken(ParseString, PKind, StepOrPos,
"U") ==
237 const ParseRet HasLinearRuntime =
238 tryParseLinearWithRuntimeStep(ParseString, PKind, StepOrPos);
240 return HasLinearRuntime;
242 const ParseRet HasLinearCompileTime =
243 tryParseLinearWithCompileTimeStep(ParseString, PKind, StepOrPos);
245 return HasLinearCompileTime;
258 ParseRet tryParseAlign(
StringRef &ParseString,
Align &Alignment) {
278 bool verifyAllVectorsHaveSameWidth(
FunctionType *Signature) {
280 if (
auto *RetTy = dyn_cast<VectorType>(Signature->
getReturnType()))
281 VecTys.push_back(RetTy);
282 for (
auto *Ty : Signature->
params())
283 if (
auto *VTy = dyn_cast<VectorType>(Ty))
284 VecTys.push_back(VTy);
286 if (VecTys.size() <= 1)
289 assert(VecTys.size() > 1 &&
"Invalid number of elements.");
302 assert(verifyAllVectorsHaveSameWidth(Signature) &&
303 "Invalid vector signature.");
305 if (
auto *RetTy = dyn_cast<VectorType>(Signature->
getReturnType()))
306 return RetTy->getElementCount();
307 for (
auto *Ty : Signature->
params())
308 if (
auto *VTy = dyn_cast<VectorType>(Ty))
319 const StringRef OriginalName = MangledName;
332 if (tryParseISA(MangledName,
ISA) != ParseRet::OK)
337 if (tryParseMask(MangledName, IsMasked) != ParseRet::OK)
343 if (tryParseVLEN(MangledName, VF, IsScalable) != ParseRet::OK)
350 const unsigned ParameterPos = Parameters.size();
353 ParamFound = tryParseParameter(MangledName, PKind, StepOrPos);
359 if (ParamFound == ParseRet::OK) {
362 const ParseRet AlignFound = tryParseAlign(MangledName, Alignment);
368 Parameters.push_back({ParameterPos, PKind, StepOrPos, Alignment});
370 }
while (ParamFound == ParseRet::OK);
374 if (Parameters.empty())
387 if (ScalarName.
empty())
391 MangledName = MangledName.
ltrim(ScalarName);
397 VectorName = MangledName;
399 if (VectorName.
empty())
411 const unsigned Pos = Parameters.size();
421 Parameters.begin(), Parameters.end(), [](
const VFParameter PK) {
422 return PK.ParamKind == VFParamKind::GlobalPredicate;
424 assert(NGlobalPreds < 2 &&
"Cannot have more than one global predicate.");
427 "The global predicate must be the last parameter");
437 const Function *
F =
M.getFunction(VectorName);
442 const ElementCount EC = getECFromSignature(
F->getFunctionType());
443 VF = EC.getKnownMinValue();
451 if (!
M.getFunction(VectorName))
455 return VFInfo({Shape, std::string(ScalarName), std::string(VectorName),
ISA});
477 " that have a textual representation in the mangled name"
478 " of the Vector Function ABI");