Skip to content

Commit

Permalink
[RISCV] Reduce dependency on RISCV::RVVBitsPerBlock for calculating v…
Browse files Browse the repository at this point in the history
…ector 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.
  • Loading branch information
topperc committed May 18, 2023
1 parent d3b3304 commit 3f43abc
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 17 deletions.
10 changes: 8 additions & 2 deletions clang/lib/AST/ASTContext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -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,
Expand Down
31 changes: 16 additions & 15 deletions clang/lib/Sema/SemaType.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<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.
// 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.
Expand Down

0 comments on commit 3f43abc

Please sign in to comment.