[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.
This commit is contained in:
Craig Topper
2023-05-18 10:09:50 -07:00
parent d3b3304222
commit 3f43abc9e7
2 changed files with 25 additions and 18 deletions

View File

@@ -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 <algorithm>
#include <cassert>
@@ -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,

View File

@@ -8320,18 +8320,6 @@ static void HandleRISCVRVVVectorBitsTypeAttr(QualType &CurType,
if (!verifyValidIntegerConstantExpr(S, Attr, RVVVectorSizeInBits))
return;
unsigned VecSize = static_cast<unsigned>(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<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.
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.