@@ -4567,6 +4567,10 @@ QualType ASTContext::getWebAssemblyExternrefType() const {
4567
4567
/// type.
4568
4568
QualType ASTContext::getScalableVectorType(QualType EltTy, unsigned NumElts,
4569
4569
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
+
4570
4574
if (Target->hasAArch64ACLETypes()) {
4571
4575
uint64_t EltTySize = getTypeSize(EltTy);
4572
4576
@@ -4575,29 +4579,29 @@ QualType ASTContext::getScalableVectorType(QualType EltTy, unsigned NumElts,
4575
4579
if (EltTy->hasIntegerRepresentation() && !EltTy->isBooleanType() && \
4576
4580
EltTy->hasSignedIntegerRepresentation() == IsSigned && \
4577
4581
EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4578
- return SingletonId; \
4582
+ return ScalableVecTyMap[K] = SingletonId; \
4579
4583
}
4580
4584
#define SVE_VECTOR_TYPE_FLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4581
4585
ElBits, NF) \
4582
4586
if (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() && \
4583
4587
EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4584
- return SingletonId; \
4588
+ return ScalableVecTyMap[K] = SingletonId; \
4585
4589
}
4586
4590
#define SVE_VECTOR_TYPE_BFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4587
4591
ElBits, NF) \
4588
4592
if (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \
4589
4593
EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4590
- return SingletonId; \
4594
+ return ScalableVecTyMap[K] = SingletonId; \
4591
4595
}
4592
4596
#define SVE_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4593
4597
ElBits, NF) \
4594
4598
if (EltTy->isMFloat8Type() && EltTySize == ElBits && \
4595
4599
NumElts == (NumEls * NF) && NumFields == 1) { \
4596
- return SingletonId; \
4600
+ return ScalableVecTyMap[K] = SingletonId; \
4597
4601
}
4598
4602
#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \
4599
4603
if (EltTy->isBooleanType() && NumElts == (NumEls * NF) && NumFields == 1) \
4600
- return SingletonId;
4604
+ return ScalableVecTyMap[K] = SingletonId;
4601
4605
#include "clang/Basic/AArch64ACLETypes.def"
4602
4606
} else if (Target->hasRISCVVTypes()) {
4603
4607
uint64_t EltTySize = getTypeSize(EltTy);
@@ -4611,10 +4615,10 @@ QualType ASTContext::getScalableVectorType(QualType EltTy, unsigned NumElts,
4611
4615
(EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \
4612
4616
IsBF && !IsFP)) && \
4613
4617
EltTySize == ElBits && NumElts == NumEls && NumFields == NF) \
4614
- return SingletonId;
4618
+ return ScalableVecTyMap[K] = SingletonId;
4615
4619
#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
4616
4620
if (EltTy->isBooleanType() && NumElts == NumEls) \
4617
- return SingletonId;
4621
+ return ScalableVecTyMap[K] = SingletonId;
4618
4622
#include "clang/Basic/RISCVVTypes.def"
4619
4623
}
4620
4624
return QualType();
0 commit comments