diff options
author | Craig Topper <craig.topper@sifive.com> | 2023-12-27 21:53:27 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-27 21:53:27 -0800 |
commit | 98073057ee45bc4a9256ecc70dc3da20b0fd5d3b (patch) | |
tree | e9d1a186a7529cfa15d9d7b0878b8fefc11affd8 /clang/lib/Sema/SemaChecking.cpp | |
parent | 2dccf11b92ee97091fb08b3f3b385d2b870e41b7 (diff) | |
download | llvm-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.cpp | 21 |
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, |