Author: eopXD Date: 2023-02-13T18:07:00-08:00 New Revision: 235e90c1d760ea38f2af6bf4de2cc9355b89d24c
URL: https://github.com/llvm/llvm-project/commit/235e90c1d760ea38f2af6bf4de2cc9355b89d24c DIFF: https://github.com/llvm/llvm-project/commit/235e90c1d760ea38f2af6bf4de2cc9355b89d24c.diff LOG: [Clang][RISCV] Guard vector float16 type correctly with semantic analysis Before this commit, vector float 16 types (e.g. `vfloat16m1_t`) of RVV is only defined when extension `zvfh` is defined. However this generate inaccurate diagnostics like: ``` error: unknown type name 'vfloat16m1_t' ``` This commit improves the compiler by guarding type check correctly under semantic analysis. Reviewed By: craig.topper Differential Revision: https://reviews.llvm.org/D143657 Added: clang/test/Sema/riscv-vector-float16-check.c Modified: clang/include/clang/AST/Type.h clang/include/clang/Basic/DiagnosticSemaKinds.td clang/lib/Sema/Sema.cpp clang/lib/Sema/SemaRISCVVectorLookup.cpp clang/utils/TableGen/RISCVVEmitter.cpp Removed: ################################################################################ diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index 180251d7f6bd..34c85c1930c8 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -2275,6 +2275,8 @@ class alignas(8) Type : public ExtQualsTypeCommonBase { bool isRVVType() const; + bool isRVVType(unsigned Bitwidth, bool IsFloat) const; + /// Return the implicit lifetime for this type, which must not be dependent. Qualifiers::ObjCLifetime getObjCARCImplicitLifetime() const; @@ -7153,6 +7155,17 @@ inline bool Type::isRVVType() const { false; // end of boolean or operation. } +inline bool Type::isRVVType(unsigned Bitwidth, bool IsFloat) const { + bool Ret = false; +#define RVV_TYPE(Name, Id, SingletonId) +#define RVV_VECTOR_TYPE(Name, Id, SingletonId, NumEls, ElBits, NF, IsSigned, \ + IsFP) \ + if (ElBits == Bitwidth && IsFloat == IsFP) \ + Ret |= isSpecificBuiltinType(BuiltinType::Id); +#include "clang/Basic/RISCVVTypes.def" + return Ret; +} + inline bool Type::isTemplateTypeParmType() const { return isa<TemplateTypeParmType>(CanonicalType); } diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index b658ad71e63a..af714de6b607 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -11738,6 +11738,9 @@ def err_riscv_builtin_requires_extension : Error< "builtin requires%select{| at least one of the following extensions to be enabled}0: %1">; def err_riscv_builtin_invalid_lmul : Error< "LMUL argument must be in the range [0,3] or [5,7]">; +def err_riscv_type_requires_extension : Error< + "RISC-V type %0 requires the '%1' extension" +>; def err_std_source_location_impl_not_found : Error< "'std::source_location::__impl' was not found; it must be defined before '__builtin_source_location' is called">; diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index f983c477ac18..fd412765447b 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -2039,6 +2039,12 @@ void Sema::checkTypeSupport(QualType Ty, SourceLocation Loc, ValueDecl *D) { targetDiag(D->getLocation(), diag::note_defined_here, FD) << D; } + if (Ty->isRVVType(/* Bitwidth */ 16, /* IsFloat */ true) && + !Context.getTargetInfo().hasFeature("experimental-zvfh")) { + Diag(Loc, diag::err_riscv_type_requires_extension, FD) + << Ty << "zvfh"; + } + // Don't allow SVE types in functions without a SVE target. if (Ty->isSVESizelessBuiltinType() && FD && FD->hasBody()) { llvm::StringMap<bool> CallerFeatureMap; diff --git a/clang/lib/Sema/SemaRISCVVectorLookup.cpp b/clang/lib/Sema/SemaRISCVVectorLookup.cpp index fedc314f2965..8b82740da14d 100644 --- a/clang/lib/Sema/SemaRISCVVectorLookup.cpp +++ b/clang/lib/Sema/SemaRISCVVectorLookup.cpp @@ -171,7 +171,6 @@ void RISCVIntrinsicManagerImpl::InitIntrinsicList() { const TargetInfo &TI = Context.getTargetInfo(); bool HasVectorFloat32 = TI.hasFeature("zve32f"); bool HasVectorFloat64 = TI.hasFeature("zve64d"); - bool HasZvfh = TI.hasFeature("experimental-zvfh"); bool HasRV64 = TI.hasFeature("64bit"); bool HasFullMultiply = TI.hasFeature("v"); @@ -223,9 +222,6 @@ void RISCVIntrinsicManagerImpl::InitIntrinsicList() { continue; // Check requirement. - if (BaseType == BasicType::Float16 && !HasZvfh) - continue; - if (BaseType == BasicType::Float32 && !HasVectorFloat32) continue; diff --git a/clang/test/Sema/riscv-vector-float16-check.c b/clang/test/Sema/riscv-vector-float16-check.c new file mode 100644 index 000000000000..48959254d2ad --- /dev/null +++ b/clang/test/Sema/riscv-vector-float16-check.c @@ -0,0 +1,8 @@ +// RUN: %clang_cc1 -triple riscv64 -target-feature +f -target-feature +d \ +// RUN: -target-feature +v -target-feature +zfh \ +// RUN: -disable-O0-optnone -o - -fsyntax-only %s -verify +// REQUIRES: riscv-registered-target +#include <riscv_vector.h> + +vfloat16m1_t foo() { /* expected-error {{RISC-V type 'vfloat16m1_t' (aka '__rvv_float16m1_t') requires the 'zvfh' extension}} */ +} /* expected-warning {{non-void function does not return a value}}*/ diff --git a/clang/utils/TableGen/RISCVVEmitter.cpp b/clang/utils/TableGen/RISCVVEmitter.cpp index 6926bbdf8d0f..2ff352ff128d 100644 --- a/clang/utils/TableGen/RISCVVEmitter.cpp +++ b/clang/utils/TableGen/RISCVVEmitter.cpp @@ -368,14 +368,13 @@ void RVVEmitter::createHeader(raw_ostream &OS) { } } } - OS << "#if defined(__riscv_zvfh)\n"; + for (int Log2LMUL : Log2LMULs) { auto T = TypeCache.computeType(BasicType::Float16, Log2LMUL, PrototypeDescriptor::Vector); if (T) printType(*T); } - OS << "#endif\n"; OS << "#if (__riscv_v_elen_fp >= 32)\n"; for (int Log2LMUL : Log2LMULs) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits