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 | 33 +++++++++++++++++---------------- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index d5b08649cbca..9c247b3c439a 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 da105e3d6ad2..06efb3dfef8e 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -8320,18 +8320,6 @@ static void HandleRISCVRVVVectorBitsTypeAttr(QualType &CurType, if (!verifyValidIntegerConstantExpr(S, Attr, RVVVectorSizeInBits)) return; - unsigned VecSize = static_cast(RVVVectorSizeInBits.getZExtValue()); - - // 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) { - 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) @@ -8340,11 +8328,24 @@ static void HandleRISCVRVVVectorBitsTypeAttr(QualType &CurType, return; } - QualType EltType = CurType->getRVVEltType(S.Context); - unsigned TypeSize = S.Context.getTypeSize(EltType); + 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. + 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; + } + 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.