@@ -4567,6 +4567,10 @@ QualType ASTContext::getWebAssemblyExternrefType() const {
45674567/// type.
45684568QualType ASTContext::getScalableVectorType(QualType EltTy, unsigned NumElts,
45694569 unsigned NumFields) const {
4570+ auto K = llvm::ScalableVecTyKey{EltTy, NumElts, NumFields};
4571+ if (auto It = ScalableVecTyMap.find(K); It != ScalableVecTyMap.end())
4572+ return It->second;
4573+
45704574 if (Target->hasAArch64ACLETypes()) {
45714575 uint64_t EltTySize = getTypeSize(EltTy);
45724576
@@ -4575,29 +4579,29 @@ QualType ASTContext::getScalableVectorType(QualType EltTy, unsigned NumElts,
45754579 if (EltTy->hasIntegerRepresentation() && !EltTy->isBooleanType() && \
45764580 EltTy->hasSignedIntegerRepresentation() == IsSigned && \
45774581 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4578- return SingletonId; \
4582+ return ScalableVecTyMap[K] = SingletonId; \
45794583 }
45804584#define SVE_VECTOR_TYPE_FLOAT(Name, MangledName, Id, SingletonId, NumEls, \
45814585 ElBits, NF) \
45824586 if (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() && \
45834587 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4584- return SingletonId; \
4588+ return ScalableVecTyMap[K] = SingletonId; \
45854589 }
45864590#define SVE_VECTOR_TYPE_BFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
45874591 ElBits, NF) \
45884592 if (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \
45894593 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4590- return SingletonId; \
4594+ return ScalableVecTyMap[K] = SingletonId; \
45914595 }
45924596#define SVE_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
45934597 ElBits, NF) \
45944598 if (EltTy->isMFloat8Type() && EltTySize == ElBits && \
45954599 NumElts == (NumEls * NF) && NumFields == 1) { \
4596- return SingletonId; \
4600+ return ScalableVecTyMap[K] = SingletonId; \
45974601 }
45984602#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \
45994603 if (EltTy->isBooleanType() && NumElts == (NumEls * NF) && NumFields == 1) \
4600- return SingletonId;
4604+ return ScalableVecTyMap[K] = SingletonId;
46014605#include "clang/Basic/AArch64ACLETypes.def"
46024606 } else if (Target->hasRISCVVTypes()) {
46034607 uint64_t EltTySize = getTypeSize(EltTy);
@@ -4611,10 +4615,10 @@ QualType ASTContext::getScalableVectorType(QualType EltTy, unsigned NumElts,
46114615 (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \
46124616 IsBF && !IsFP)) && \
46134617 EltTySize == ElBits && NumElts == NumEls && NumFields == NF) \
4614- return SingletonId;
4618+ return ScalableVecTyMap[K] = SingletonId;
46154619#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
46164620 if (EltTy->isBooleanType() && NumElts == NumEls) \
4617- return SingletonId;
4621+ return ScalableVecTyMap[K] = SingletonId;
46184622#include "clang/Basic/RISCVVTypes.def"
46194623 }
46204624 return QualType();
0 commit comments