#include "llvm/Support/MD5.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/raw_ostream.h"
-#include "llvm/TargetParser/RISCVTargetParser.h"
#include "llvm/TargetParser/Triple.h"
#include <algorithm>
#include <cassert>
static uint64_t getRVVTypeSize(ASTContext &Context, const BuiltinType *Ty) {
assert(Ty->isRVVVLSBuiltinType() && "Invalid RVV Type");
auto VScale = Context.getTargetInfo().getVScaleRange(Context.getLangOpts());
- return VScale ? VScale->first * llvm::RISCV::RVVBitsPerBlock : 0;
+ if (!VScale)
+ return 0;
+
+ ASTContext::BuiltinVectorTypeInfo Info = Context.getBuiltinVectorTypeInfo(Ty);
+
+ unsigned EltSize = Context.getTypeSize(Info.ElementType);
+ unsigned MinElts = Info.EC.getKnownMinValue();
+ return VScale->first * MinElts * EltSize;
}
bool ASTContext::areCompatibleRVVTypes(QualType FirstType,
if (!verifyValidIntegerConstantExpr(S, Attr, RVVVectorSizeInBits))
return;
+ // Attribute can only be attached to a single RVV vector type.
+ if (!CurType->isRVVVLSBuiltinType()) {
+ S.Diag(Attr.getLoc(), diag::err_attribute_invalid_rvv_type)
+ << Attr << CurType;
+ Attr.setInvalid();
+ return;
+ }
+
unsigned VecSize = static_cast<unsigned>(RVVVectorSizeInBits.getZExtValue());
+ ASTContext::BuiltinVectorTypeInfo Info =
+ S.Context.getBuiltinVectorTypeInfo(CurType->getAs<BuiltinType>());
+ unsigned EltSize = S.Context.getTypeSize(Info.ElementType);
+ unsigned MinElts = Info.EC.getKnownMinValue();
+
// The attribute vector size must match -mrvv-vector-bits.
- // FIXME: Add support for types with LMUL!=1. Need to make sure size passed
- // to attribute is equal to LMUL*VScaleMin*RVVBitsPerBlock.
- if (VecSize != VScale->first * llvm::RISCV::RVVBitsPerBlock) {
+ if (VecSize != VScale->first * MinElts * EltSize) {
S.Diag(Attr.getLoc(), diag::err_attribute_bad_rvv_vector_size)
<< VecSize << VScale->first * llvm::RISCV::RVVBitsPerBlock;
Attr.setInvalid();
return;
}
- // Attribute can only be attached to a single RVV vector type.
- if (!CurType->isRVVVLSBuiltinType()) {
- S.Diag(Attr.getLoc(), diag::err_attribute_invalid_rvv_type)
- << Attr << CurType;
- Attr.setInvalid();
- return;
- }
-
- QualType EltType = CurType->getRVVEltType(S.Context);
- unsigned TypeSize = S.Context.getTypeSize(EltType);
VectorType::VectorKind VecKind = VectorType::RVVFixedLengthDataVector;
- VecSize /= TypeSize;
- CurType = S.Context.getVectorType(EltType, VecSize, VecKind);
+ VecSize /= EltSize;
+ CurType = S.Context.getVectorType(Info.ElementType, VecSize, VecKind);
}
/// Handle OpenCL Access Qualifier Attribute.