mirror of
https://github.com/intel/llvm.git
synced 2026-01-20 01:58:44 +08:00
[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:
@@ -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,
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user