aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Sema/SemaChecking.cpp
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@sifive.com>2023-12-27 21:53:27 -0800
committerGitHub <noreply@github.com>2023-12-27 21:53:27 -0800
commit98073057ee45bc4a9256ecc70dc3da20b0fd5d3b (patch)
treee9d1a186a7529cfa15d9d7b0878b8fefc11affd8 /clang/lib/Sema/SemaChecking.cpp
parent2dccf11b92ee97091fb08b3f3b385d2b870e41b7 (diff)
downloadllvm-98073057ee45bc4a9256ecc70dc3da20b0fd5d3b.zip
llvm-98073057ee45bc4a9256ecc70dc3da20b0fd5d3b.tar.gz
llvm-98073057ee45bc4a9256ecc70dc3da20b0fd5d3b.tar.bz2
[RISCV] Refactor checkRVVTypeSupport to use BuiltinVectorTypeInfo. (#74949)
We can decompose the type into ElementType and MinSize and use those to perform the checks. This is more efficient than using isRVVType. This also fixes a bug that we didn't disallow vbool64_t on Zve32x.
Diffstat (limited to 'clang/lib/Sema/SemaChecking.cpp')
-rw-r--r--clang/lib/Sema/SemaChecking.cpp21
1 files changed, 12 insertions, 9 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index 66dac99..27079ef 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -6170,25 +6170,28 @@ bool Sema::CheckWebAssemblyBuiltinFunctionCall(const TargetInfo &TI,
void Sema::checkRVVTypeSupport(QualType Ty, SourceLocation Loc, Decl *D) {
const TargetInfo &TI = Context.getTargetInfo();
+
+ ASTContext::BuiltinVectorTypeInfo Info =
+ Context.getBuiltinVectorTypeInfo(Ty->castAs<BuiltinType>());
+ unsigned EltSize = Context.getTypeSize(Info.ElementType);
+ unsigned MinElts = Info.EC.getKnownMinValue();
+
// (ELEN, LMUL) pairs of (8, mf8), (16, mf4), (32, mf2), (64, m1) requires at
// least zve64x
- if ((Ty->isRVVType(/* Bitwidth */ 64, /* IsFloat */ false) ||
- Ty->isRVVType(/* ElementCount */ 1)) &&
+ if (((EltSize == 64 && Info.ElementType->isIntegerType()) || MinElts == 1) &&
!TI.hasFeature("zve64x"))
Diag(Loc, diag::err_riscv_type_requires_extension, D) << Ty << "zve64x";
- if (Ty->isRVVType(/* Bitwidth */ 16, /* IsFloat */ true) &&
- !TI.hasFeature("zvfh") && !TI.hasFeature("zvfhmin"))
+ if (Info.ElementType->isFloat16Type() && !TI.hasFeature("zvfh") &&
+ !TI.hasFeature("zvfhmin"))
Diag(Loc, diag::err_riscv_type_requires_extension, D)
<< Ty << "zvfh or zvfhmin";
- // Check if enabled zvfbfmin for BFloat16
- if (Ty->isRVVType(/* Bitwidth */ 16, /* IsFloat */ false,
- /* IsBFloat */ true) &&
+ if (Info.ElementType->isBFloat16Type() &&
!TI.hasFeature("experimental-zvfbfmin"))
Diag(Loc, diag::err_riscv_type_requires_extension, D) << Ty << "zvfbfmin";
- if (Ty->isRVVType(/* Bitwidth */ 32, /* IsFloat */ true) &&
+ if (Info.ElementType->isSpecificBuiltinType(BuiltinType::Float) &&
!TI.hasFeature("zve32f"))
Diag(Loc, diag::err_riscv_type_requires_extension, D) << Ty << "zve32f";
- if (Ty->isRVVType(/* Bitwidth */ 64, /* IsFloat */ true) &&
+ if (Info.ElementType->isSpecificBuiltinType(BuiltinType::Double) &&
!TI.hasFeature("zve64d"))
Diag(Loc, diag::err_riscv_type_requires_extension, D) << Ty << "zve64d";
// Given that caller already checked isRVVType() before calling this function,