From 3f43abc9e78cce99741f7c8cf54552c95cc98d9f Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Thu, 18 May 2023 10:09:50 -0700 Subject: [PATCH] [RISCV] Reduce dependency on RISCV::RVVBitsPerBlock for calculating vector size for -mrvv-vector-bits. We can use the minimum value of the BuiltinType's ElementCount and the element size. This needs to be done to support LMUL!=1 types anyway. I did have to make an ordering change in the error checks in HandleRISCVRVVVectorBitsTypeAttr to check if the type is an RVV VLS type before checking the size. --- clang/lib/AST/ASTContext.cpp | 10 ++++++++-- clang/lib/Sema/SemaType.cpp | 31 ++++++++++++++++--------------- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index d5b0864..9c247b3 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 da105e3..06efb3d 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. -- 2.7.4