diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index d5b08649cbca3..9c247b3c439a8 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -85,7 +85,6 @@ #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 #include @@ -9581,7 +9580,14 @@ bool ASTContext::areLaxCompatibleSveTypes(QualType FirstType, 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, diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index da105e3d6ad28..06efb3dfef8e6 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -8320,31 +8320,32 @@ static void HandleRISCVRVVVectorBitsTypeAttr(QualType &CurType, 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(RVVVectorSizeInBits.getZExtValue()); + ASTContext::BuiltinVectorTypeInfo Info = + S.Context.getBuiltinVectorTypeInfo(CurType->getAs()); + 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.