[clang] [clang:frontend] Move helper functions to common location for SemaSPIRV (PR #125045)
https://github.com/bassiounix updated https://github.com/llvm/llvm-project/pull/125045 >From d938f75b1a5638f013ae2f7fb4f0ac2f6e28c6a4 Mon Sep 17 00:00:00 2001 From: Muhammad Bassiouni Date: Thu, 30 Jan 2025 12:02:25 +0200 Subject: [PATCH 1/5] [clang:frontend] Move helper functions in SemaHLSL to common location for SemaSPIRV --- clang/include/clang/Sema/Common.h | 22 +++ clang/lib/Sema/CMakeLists.txt | 1 + clang/lib/Sema/Common.cpp | 65 +++ clang/lib/Sema/SemaHLSL.cpp | 28 + clang/lib/Sema/SemaSPIRV.cpp | 52 +++-- 5 files changed, 95 insertions(+), 73 deletions(-) create mode 100644 clang/include/clang/Sema/Common.h create mode 100644 clang/lib/Sema/Common.cpp diff --git a/clang/include/clang/Sema/Common.h b/clang/include/clang/Sema/Common.h new file mode 100644 index 000..3f775df8bddb649 --- /dev/null +++ b/clang/include/clang/Sema/Common.h @@ -0,0 +1,22 @@ +#ifndef LLVM_CLANG_SEMA_COMMON_H +#define LLVM_CLANG_SEMA_COMMON_H + +#include "clang/Sema/Sema.h" + +namespace clang { + +using LLVMFnRef = llvm::function_ref; +using PairParam = std::pair; +using CheckParam = std::variant; + +bool CheckArgTypeIsCorrect( +Sema *S, Expr *Arg, QualType ExpectedType, +llvm::function_ref Check); + +bool CheckAllArgTypesAreCorrect( +Sema *SemaPtr, CallExpr *TheCall, +std::variant ExpectedType, CheckParam Check); + +} // namespace clang + +#endif diff --git a/clang/lib/Sema/CMakeLists.txt b/clang/lib/Sema/CMakeLists.txt index 19cf3a2db00fdcd..ddc340a51a3b2d1 100644 --- a/clang/lib/Sema/CMakeLists.txt +++ b/clang/lib/Sema/CMakeLists.txt @@ -17,6 +17,7 @@ add_clang_library(clangSema AnalysisBasedWarnings.cpp CheckExprLifetime.cpp CodeCompleteConsumer.cpp + Common.cpp DeclSpec.cpp DelayedDiagnostic.cpp HeuristicResolver.cpp diff --git a/clang/lib/Sema/Common.cpp b/clang/lib/Sema/Common.cpp new file mode 100644 index 000..72a9e4a2c99ae11 --- /dev/null +++ b/clang/lib/Sema/Common.cpp @@ -0,0 +1,65 @@ +#include "clang/Sema/Common.h" + +namespace clang { + +bool CheckArgTypeIsCorrect( +Sema *S, Expr *Arg, QualType ExpectedType, +llvm::function_ref Check) { + QualType PassedType = Arg->getType(); + if (Check(PassedType)) { +if (auto *VecTyA = PassedType->getAs()) + ExpectedType = S->Context.getVectorType( + ExpectedType, VecTyA->getNumElements(), VecTyA->getVectorKind()); +S->Diag(Arg->getBeginLoc(), diag::err_typecheck_convert_incompatible) +<< PassedType << ExpectedType << 1 << 0 << 0; +return true; + } + return false; +} + +bool CheckAllArgTypesAreCorrect( +Sema *SemaPtr, CallExpr *TheCall, +std::variant ExpectedType, CheckParam Check) { + unsigned int NumElts; + unsigned int expected; + if (auto *n = std::get_if(&Check)) { +if (SemaPtr->checkArgCount(TheCall, n->first)) { + return true; +} +NumElts = n->first; +expected = n->second; + } else { +NumElts = TheCall->getNumArgs(); + } + + for (unsigned i = 0; i < NumElts; i++) { +Expr *localArg = TheCall->getArg(i); +if (auto *val = std::get_if(&ExpectedType)) { + if (auto *fn = std::get_if(&Check)) { +return CheckArgTypeIsCorrect(SemaPtr, localArg, *val, *fn); + } +} + +QualType PassedType = localArg->getType(); +if (PassedType->getAs() == nullptr) { + SemaPtr->Diag(localArg->getBeginLoc(), +diag::err_typecheck_convert_incompatible) + << PassedType + << SemaPtr->Context.getVectorType(PassedType, expected, +VectorKind::Generic) + << 1 << 0 << 0; + return true; +} + } + + if (std::get_if(&Check)) { +if (auto *localArgVecTy = +TheCall->getArg(0)->getType()->getAs()) { + TheCall->setType(localArgVecTy->getElementType()); +} + } + + return false; +} + +} // namespace clang diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index d748c10455289b9..0cc71e4122666c0 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -27,6 +27,7 @@ #include "clang/Basic/SourceLocation.h" #include "clang/Basic/Specifiers.h" #include "clang/Basic/TargetInfo.h" +#include "clang/Sema/Common.h" #include "clang/Sema/Initialization.h" #include "clang/Sema/ParsedAttr.h" #include "clang/Sema/Sema.h" @@ -1996,33 +1997,6 @@ static bool CheckArgTypeMatches(Sema *S, Expr *Arg, QualType ExpectedType) { return false; } -static bool CheckArgTypeIsCorrect( -Sema *S, Expr *Arg, QualType ExpectedType, -llvm::function_ref Check) { - QualType PassedType = Arg->getType(); - if (Check(PassedType)) { -if (auto *VecTyA = PassedType->getAs()) - ExpectedType = S->Context.getVectorType( - ExpectedType, VecTyA->getNumElements(), VecTyA->getVectorKind()); -S->Diag(Arg->getBeginLoc(), diag::err_typecheck_convert_incompatible) -
[clang] [clang:frontend] Move helper functions to common location for SemaSPIRV (PR #125045)
bassiounix wrote: Huh.. this shouldn't fail! I tested locally before pushing the commits! Looks like these files aren't mine .. I guess .. https://github.com/llvm/llvm-project/pull/125045 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang:frontend] Move helper functions to common location for SemaSPIRV (PR #125045)
bassiounix wrote: > 1. If we were to introduce new helpers, then instead of making a new > header for this, these functions should just become member functions of the > `Sema` class. `Sema` or `SemaBase`? > 2. The new version of `CheckAllArgTypesAreCorrect()` is... way too > complicated, in my opinion; I have trouble trying to figure out what two > parameters that are a variant and a pair are supposed to mean from looking at > the function, and it does feel like this function wants to be at least two or > three separate functions... I'll split the implementation in 2 functions. > I think a better approach would be to leave the HLSL functions alone and just > factor out a separate helper and put it in `SemaSPIRV.cpp`, because as-is, > this pr isn’t exactly simplifying things... Since there is a common functionalities, I think I'll go with the first approach, that is, declaring them in a common class. This class is `Sema` for now as mentioned in the review. https://github.com/llvm/llvm-project/pull/125045 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang:frontend] Move helper functions to common location for SemaSPIRV (PR #125045)
https://github.com/bassiounix updated https://github.com/llvm/llvm-project/pull/125045 >From d938f75b1a5638f013ae2f7fb4f0ac2f6e28c6a4 Mon Sep 17 00:00:00 2001 From: Muhammad Bassiouni Date: Thu, 30 Jan 2025 12:02:25 +0200 Subject: [PATCH 1/3] [clang:frontend] Move helper functions in SemaHLSL to common location for SemaSPIRV --- clang/include/clang/Sema/Common.h | 22 +++ clang/lib/Sema/CMakeLists.txt | 1 + clang/lib/Sema/Common.cpp | 65 +++ clang/lib/Sema/SemaHLSL.cpp | 28 + clang/lib/Sema/SemaSPIRV.cpp | 52 +++-- 5 files changed, 95 insertions(+), 73 deletions(-) create mode 100644 clang/include/clang/Sema/Common.h create mode 100644 clang/lib/Sema/Common.cpp diff --git a/clang/include/clang/Sema/Common.h b/clang/include/clang/Sema/Common.h new file mode 100644 index 00..3f775df8bddb64 --- /dev/null +++ b/clang/include/clang/Sema/Common.h @@ -0,0 +1,22 @@ +#ifndef LLVM_CLANG_SEMA_COMMON_H +#define LLVM_CLANG_SEMA_COMMON_H + +#include "clang/Sema/Sema.h" + +namespace clang { + +using LLVMFnRef = llvm::function_ref; +using PairParam = std::pair; +using CheckParam = std::variant; + +bool CheckArgTypeIsCorrect( +Sema *S, Expr *Arg, QualType ExpectedType, +llvm::function_ref Check); + +bool CheckAllArgTypesAreCorrect( +Sema *SemaPtr, CallExpr *TheCall, +std::variant ExpectedType, CheckParam Check); + +} // namespace clang + +#endif diff --git a/clang/lib/Sema/CMakeLists.txt b/clang/lib/Sema/CMakeLists.txt index 19cf3a2db00fdc..ddc340a51a3b2d 100644 --- a/clang/lib/Sema/CMakeLists.txt +++ b/clang/lib/Sema/CMakeLists.txt @@ -17,6 +17,7 @@ add_clang_library(clangSema AnalysisBasedWarnings.cpp CheckExprLifetime.cpp CodeCompleteConsumer.cpp + Common.cpp DeclSpec.cpp DelayedDiagnostic.cpp HeuristicResolver.cpp diff --git a/clang/lib/Sema/Common.cpp b/clang/lib/Sema/Common.cpp new file mode 100644 index 00..72a9e4a2c99ae1 --- /dev/null +++ b/clang/lib/Sema/Common.cpp @@ -0,0 +1,65 @@ +#include "clang/Sema/Common.h" + +namespace clang { + +bool CheckArgTypeIsCorrect( +Sema *S, Expr *Arg, QualType ExpectedType, +llvm::function_ref Check) { + QualType PassedType = Arg->getType(); + if (Check(PassedType)) { +if (auto *VecTyA = PassedType->getAs()) + ExpectedType = S->Context.getVectorType( + ExpectedType, VecTyA->getNumElements(), VecTyA->getVectorKind()); +S->Diag(Arg->getBeginLoc(), diag::err_typecheck_convert_incompatible) +<< PassedType << ExpectedType << 1 << 0 << 0; +return true; + } + return false; +} + +bool CheckAllArgTypesAreCorrect( +Sema *SemaPtr, CallExpr *TheCall, +std::variant ExpectedType, CheckParam Check) { + unsigned int NumElts; + unsigned int expected; + if (auto *n = std::get_if(&Check)) { +if (SemaPtr->checkArgCount(TheCall, n->first)) { + return true; +} +NumElts = n->first; +expected = n->second; + } else { +NumElts = TheCall->getNumArgs(); + } + + for (unsigned i = 0; i < NumElts; i++) { +Expr *localArg = TheCall->getArg(i); +if (auto *val = std::get_if(&ExpectedType)) { + if (auto *fn = std::get_if(&Check)) { +return CheckArgTypeIsCorrect(SemaPtr, localArg, *val, *fn); + } +} + +QualType PassedType = localArg->getType(); +if (PassedType->getAs() == nullptr) { + SemaPtr->Diag(localArg->getBeginLoc(), +diag::err_typecheck_convert_incompatible) + << PassedType + << SemaPtr->Context.getVectorType(PassedType, expected, +VectorKind::Generic) + << 1 << 0 << 0; + return true; +} + } + + if (std::get_if(&Check)) { +if (auto *localArgVecTy = +TheCall->getArg(0)->getType()->getAs()) { + TheCall->setType(localArgVecTy->getElementType()); +} + } + + return false; +} + +} // namespace clang diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index d748c10455289b..0cc71e4122666c 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -27,6 +27,7 @@ #include "clang/Basic/SourceLocation.h" #include "clang/Basic/Specifiers.h" #include "clang/Basic/TargetInfo.h" +#include "clang/Sema/Common.h" #include "clang/Sema/Initialization.h" #include "clang/Sema/ParsedAttr.h" #include "clang/Sema/Sema.h" @@ -1996,33 +1997,6 @@ static bool CheckArgTypeMatches(Sema *S, Expr *Arg, QualType ExpectedType) { return false; } -static bool CheckArgTypeIsCorrect( -Sema *S, Expr *Arg, QualType ExpectedType, -llvm::function_ref Check) { - QualType PassedType = Arg->getType(); - if (Check(PassedType)) { -if (auto *VecTyA = PassedType->getAs()) - ExpectedType = S->Context.getVectorType( - ExpectedType, VecTyA->getNumElements(), VecTyA->getVectorKind()); -S->Diag(Arg->getBeginLoc(), diag::err_typecheck_convert_incompatible) -<< P
[clang] [clang:frontend] Move helper functions to common location for SemaSPIRV (PR #125045)
https://github.com/bassiounix created https://github.com/llvm/llvm-project/pull/125045 Move helper functions out of `clang/lib/Sema/SemaHLSL.cpp` into a common location for `clang/lib/Sema/SemaSPIRV.cpp` to use. Moved functions are `CheckArgTypeIsCorrect` and `CheckAllArgTypesAreCorrect`. This is a contribution to the issue #123831. >From d938f75b1a5638f013ae2f7fb4f0ac2f6e28c6a4 Mon Sep 17 00:00:00 2001 From: Muhammad Bassiouni Date: Thu, 30 Jan 2025 12:02:25 +0200 Subject: [PATCH] [clang:frontend] Move helper functions in SemaHLSL to common location for SemaSPIRV --- clang/include/clang/Sema/Common.h | 22 +++ clang/lib/Sema/CMakeLists.txt | 1 + clang/lib/Sema/Common.cpp | 65 +++ clang/lib/Sema/SemaHLSL.cpp | 28 + clang/lib/Sema/SemaSPIRV.cpp | 52 +++-- 5 files changed, 95 insertions(+), 73 deletions(-) create mode 100644 clang/include/clang/Sema/Common.h create mode 100644 clang/lib/Sema/Common.cpp diff --git a/clang/include/clang/Sema/Common.h b/clang/include/clang/Sema/Common.h new file mode 100644 index 000..3f775df8bddb649 --- /dev/null +++ b/clang/include/clang/Sema/Common.h @@ -0,0 +1,22 @@ +#ifndef LLVM_CLANG_SEMA_COMMON_H +#define LLVM_CLANG_SEMA_COMMON_H + +#include "clang/Sema/Sema.h" + +namespace clang { + +using LLVMFnRef = llvm::function_ref; +using PairParam = std::pair; +using CheckParam = std::variant; + +bool CheckArgTypeIsCorrect( +Sema *S, Expr *Arg, QualType ExpectedType, +llvm::function_ref Check); + +bool CheckAllArgTypesAreCorrect( +Sema *SemaPtr, CallExpr *TheCall, +std::variant ExpectedType, CheckParam Check); + +} // namespace clang + +#endif diff --git a/clang/lib/Sema/CMakeLists.txt b/clang/lib/Sema/CMakeLists.txt index 19cf3a2db00fdcd..ddc340a51a3b2d1 100644 --- a/clang/lib/Sema/CMakeLists.txt +++ b/clang/lib/Sema/CMakeLists.txt @@ -17,6 +17,7 @@ add_clang_library(clangSema AnalysisBasedWarnings.cpp CheckExprLifetime.cpp CodeCompleteConsumer.cpp + Common.cpp DeclSpec.cpp DelayedDiagnostic.cpp HeuristicResolver.cpp diff --git a/clang/lib/Sema/Common.cpp b/clang/lib/Sema/Common.cpp new file mode 100644 index 000..72a9e4a2c99ae11 --- /dev/null +++ b/clang/lib/Sema/Common.cpp @@ -0,0 +1,65 @@ +#include "clang/Sema/Common.h" + +namespace clang { + +bool CheckArgTypeIsCorrect( +Sema *S, Expr *Arg, QualType ExpectedType, +llvm::function_ref Check) { + QualType PassedType = Arg->getType(); + if (Check(PassedType)) { +if (auto *VecTyA = PassedType->getAs()) + ExpectedType = S->Context.getVectorType( + ExpectedType, VecTyA->getNumElements(), VecTyA->getVectorKind()); +S->Diag(Arg->getBeginLoc(), diag::err_typecheck_convert_incompatible) +<< PassedType << ExpectedType << 1 << 0 << 0; +return true; + } + return false; +} + +bool CheckAllArgTypesAreCorrect( +Sema *SemaPtr, CallExpr *TheCall, +std::variant ExpectedType, CheckParam Check) { + unsigned int NumElts; + unsigned int expected; + if (auto *n = std::get_if(&Check)) { +if (SemaPtr->checkArgCount(TheCall, n->first)) { + return true; +} +NumElts = n->first; +expected = n->second; + } else { +NumElts = TheCall->getNumArgs(); + } + + for (unsigned i = 0; i < NumElts; i++) { +Expr *localArg = TheCall->getArg(i); +if (auto *val = std::get_if(&ExpectedType)) { + if (auto *fn = std::get_if(&Check)) { +return CheckArgTypeIsCorrect(SemaPtr, localArg, *val, *fn); + } +} + +QualType PassedType = localArg->getType(); +if (PassedType->getAs() == nullptr) { + SemaPtr->Diag(localArg->getBeginLoc(), +diag::err_typecheck_convert_incompatible) + << PassedType + << SemaPtr->Context.getVectorType(PassedType, expected, +VectorKind::Generic) + << 1 << 0 << 0; + return true; +} + } + + if (std::get_if(&Check)) { +if (auto *localArgVecTy = +TheCall->getArg(0)->getType()->getAs()) { + TheCall->setType(localArgVecTy->getElementType()); +} + } + + return false; +} + +} // namespace clang diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index d748c10455289b9..0cc71e4122666c0 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -27,6 +27,7 @@ #include "clang/Basic/SourceLocation.h" #include "clang/Basic/Specifiers.h" #include "clang/Basic/TargetInfo.h" +#include "clang/Sema/Common.h" #include "clang/Sema/Initialization.h" #include "clang/Sema/ParsedAttr.h" #include "clang/Sema/Sema.h" @@ -1996,33 +1997,6 @@ static bool CheckArgTypeMatches(Sema *S, Expr *Arg, QualType ExpectedType) { return false; } -static bool CheckArgTypeIsCorrect( -Sema *S, Expr *Arg, QualType ExpectedType, -llvm::function_ref Check) { - QualType PassedType = Arg->getType(); - if (Check(PassedType)) { -
[clang] [clang:frontend] Move helper functions to common location for SemaSPIRV (PR #125045)
https://github.com/bassiounix updated https://github.com/llvm/llvm-project/pull/125045 >From d938f75b1a5638f013ae2f7fb4f0ac2f6e28c6a4 Mon Sep 17 00:00:00 2001 From: Muhammad Bassiouni Date: Thu, 30 Jan 2025 12:02:25 +0200 Subject: [PATCH 1/2] [clang:frontend] Move helper functions in SemaHLSL to common location for SemaSPIRV --- clang/include/clang/Sema/Common.h | 22 +++ clang/lib/Sema/CMakeLists.txt | 1 + clang/lib/Sema/Common.cpp | 65 +++ clang/lib/Sema/SemaHLSL.cpp | 28 + clang/lib/Sema/SemaSPIRV.cpp | 52 +++-- 5 files changed, 95 insertions(+), 73 deletions(-) create mode 100644 clang/include/clang/Sema/Common.h create mode 100644 clang/lib/Sema/Common.cpp diff --git a/clang/include/clang/Sema/Common.h b/clang/include/clang/Sema/Common.h new file mode 100644 index 000..3f775df8bddb649 --- /dev/null +++ b/clang/include/clang/Sema/Common.h @@ -0,0 +1,22 @@ +#ifndef LLVM_CLANG_SEMA_COMMON_H +#define LLVM_CLANG_SEMA_COMMON_H + +#include "clang/Sema/Sema.h" + +namespace clang { + +using LLVMFnRef = llvm::function_ref; +using PairParam = std::pair; +using CheckParam = std::variant; + +bool CheckArgTypeIsCorrect( +Sema *S, Expr *Arg, QualType ExpectedType, +llvm::function_ref Check); + +bool CheckAllArgTypesAreCorrect( +Sema *SemaPtr, CallExpr *TheCall, +std::variant ExpectedType, CheckParam Check); + +} // namespace clang + +#endif diff --git a/clang/lib/Sema/CMakeLists.txt b/clang/lib/Sema/CMakeLists.txt index 19cf3a2db00fdcd..ddc340a51a3b2d1 100644 --- a/clang/lib/Sema/CMakeLists.txt +++ b/clang/lib/Sema/CMakeLists.txt @@ -17,6 +17,7 @@ add_clang_library(clangSema AnalysisBasedWarnings.cpp CheckExprLifetime.cpp CodeCompleteConsumer.cpp + Common.cpp DeclSpec.cpp DelayedDiagnostic.cpp HeuristicResolver.cpp diff --git a/clang/lib/Sema/Common.cpp b/clang/lib/Sema/Common.cpp new file mode 100644 index 000..72a9e4a2c99ae11 --- /dev/null +++ b/clang/lib/Sema/Common.cpp @@ -0,0 +1,65 @@ +#include "clang/Sema/Common.h" + +namespace clang { + +bool CheckArgTypeIsCorrect( +Sema *S, Expr *Arg, QualType ExpectedType, +llvm::function_ref Check) { + QualType PassedType = Arg->getType(); + if (Check(PassedType)) { +if (auto *VecTyA = PassedType->getAs()) + ExpectedType = S->Context.getVectorType( + ExpectedType, VecTyA->getNumElements(), VecTyA->getVectorKind()); +S->Diag(Arg->getBeginLoc(), diag::err_typecheck_convert_incompatible) +<< PassedType << ExpectedType << 1 << 0 << 0; +return true; + } + return false; +} + +bool CheckAllArgTypesAreCorrect( +Sema *SemaPtr, CallExpr *TheCall, +std::variant ExpectedType, CheckParam Check) { + unsigned int NumElts; + unsigned int expected; + if (auto *n = std::get_if(&Check)) { +if (SemaPtr->checkArgCount(TheCall, n->first)) { + return true; +} +NumElts = n->first; +expected = n->second; + } else { +NumElts = TheCall->getNumArgs(); + } + + for (unsigned i = 0; i < NumElts; i++) { +Expr *localArg = TheCall->getArg(i); +if (auto *val = std::get_if(&ExpectedType)) { + if (auto *fn = std::get_if(&Check)) { +return CheckArgTypeIsCorrect(SemaPtr, localArg, *val, *fn); + } +} + +QualType PassedType = localArg->getType(); +if (PassedType->getAs() == nullptr) { + SemaPtr->Diag(localArg->getBeginLoc(), +diag::err_typecheck_convert_incompatible) + << PassedType + << SemaPtr->Context.getVectorType(PassedType, expected, +VectorKind::Generic) + << 1 << 0 << 0; + return true; +} + } + + if (std::get_if(&Check)) { +if (auto *localArgVecTy = +TheCall->getArg(0)->getType()->getAs()) { + TheCall->setType(localArgVecTy->getElementType()); +} + } + + return false; +} + +} // namespace clang diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index d748c10455289b9..0cc71e4122666c0 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -27,6 +27,7 @@ #include "clang/Basic/SourceLocation.h" #include "clang/Basic/Specifiers.h" #include "clang/Basic/TargetInfo.h" +#include "clang/Sema/Common.h" #include "clang/Sema/Initialization.h" #include "clang/Sema/ParsedAttr.h" #include "clang/Sema/Sema.h" @@ -1996,33 +1997,6 @@ static bool CheckArgTypeMatches(Sema *S, Expr *Arg, QualType ExpectedType) { return false; } -static bool CheckArgTypeIsCorrect( -Sema *S, Expr *Arg, QualType ExpectedType, -llvm::function_ref Check) { - QualType PassedType = Arg->getType(); - if (Check(PassedType)) { -if (auto *VecTyA = PassedType->getAs()) - ExpectedType = S->Context.getVectorType( - ExpectedType, VecTyA->getNumElements(), VecTyA->getVectorKind()); -S->Diag(Arg->getBeginLoc(), diag::err_typecheck_convert_incompatible) -
[clang] [clang:frontend] Move helper functions to common location for SemaSPIRV (PR #125045)
@@ -0,0 +1,65 @@ +#include "clang/Sema/Common.h" + +namespace clang { bassiounix wrote: fixed https://github.com/llvm/llvm-project/pull/125045 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang:frontend] Move helper functions to common location for SemaSPIRV (PR #125045)
https://github.com/bassiounix closed https://github.com/llvm/llvm-project/pull/125045 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Add `__bf16` Type Support Macros With Literal Suffix Support (PR #134214)
bassiounix wrote: I changed the commits and ran test at each step, I'm not sure why the last commit made the test failing! is `APFloat::BFloat` the reason? if so, how would I set the value? https://github.com/llvm/llvm-project/pull/134214 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Add `__bf16` Type Support Macros With Literal Suffix Support (PR #134214)
https://github.com/bassiounix updated https://github.com/llvm/llvm-project/pull/134214 >From 620bdbed2b372b97b66147684d4ded5b666c7786 Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:08:59 +0200 Subject: [PATCH 01/15] add `bf16`/`BF16` suffix support --- clang/include/clang/Lex/LiteralSupport.h | 1 + clang/lib/Lex/LiteralSupport.cpp | 17 - clang/lib/Sema/SemaExpr.cpp | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Lex/LiteralSupport.h b/clang/include/clang/Lex/LiteralSupport.h index ea5f63bc20399..1907cfc365d97 100644 --- a/clang/include/clang/Lex/LiteralSupport.h +++ b/clang/include/clang/Lex/LiteralSupport.h @@ -77,6 +77,7 @@ class NumericLiteralParser { bool isFloat : 1; // 1.0f bool isImaginary : 1; // 1.0i bool isFloat16 : 1; // 1.0f16 + bool isBFloat16 : 1; // 1.0bf16 bool isFloat128 : 1; // 1.0q bool isFract : 1; // 1.0hr/r/lr/uhr/ur/ulr bool isAccum : 1; // 1.0hk/k/lk/uhk/uk/ulk diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp index 20933cc8dee69..ab0d301a70fbd 100644 --- a/clang/lib/Lex/LiteralSupport.cpp +++ b/clang/lib/Lex/LiteralSupport.cpp @@ -917,6 +917,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isFloat = false; isImaginary = false; isFloat16 = false; + isBFloat16 = false; isFloat128 = false; MicrosoftInteger = 0; isFract = false; @@ -973,11 +974,20 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, bool isFPConstant = isFloatingLiteral(); bool HasSize = false; bool DoubleUnderscore = false; + bool isBF16 = false; // Loop over all of the characters of the suffix. If we see something bad, // we break out of the loop. for (; s != ThisTokEnd; ++s) { switch (*s) { +case 'b': +case 'B': + if (isBFloat16) break; + if (isBF16) break; + if (HasSize) break; + + isBF16 = true; + continue; case 'R': case 'r': if (!LangOpts.FixedPoint) @@ -1022,7 +1032,11 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, (LangOpts.OpenMPIsTargetDevice && Target.getTriple().isNVPTX())) && s + 2 < ThisTokEnd && s[1] == '1' && s[2] == '6') { s += 2; // success, eat up 2 characters. -isFloat16 = true; +if (isBF16) { + isBFloat16 = true; +} else { + isFloat16 = true; +} continue; } @@ -1183,6 +1197,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isSizeT = false; isFloat = false; isFloat16 = false; +isBFloat16 = false; isHalf = false; isImaginary = false; isBitInt = false; diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 3af6d6c23438f..b4210fc22ae52 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -3878,6 +3878,8 @@ ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) { Ty = !getLangOpts().HLSL ? Context.LongDoubleTy : Context.DoubleTy; else if (Literal.isFloat16) Ty = Context.Float16Ty; +else if (Literal.isBFloat16) + Ty = Context.BFloat16Ty; else if (Literal.isFloat128) Ty = Context.Float128Ty; else if (getLangOpts().HLSL) >From d55e0ca50eb50ec4a2fdb0e7ba9e3c11be70065d Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:09:22 +0200 Subject: [PATCH 02/15] add `__bf16` macros --- clang/lib/Frontend/InitPreprocessor.cpp | 25 + 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 0b54665501c76..9bca74a8b4bd6 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -96,7 +96,7 @@ static void AddImplicitIncludePCH(MacroBuilder &Builder, Preprocessor &PP, template static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal, -T IEEEQuadVal) { +T BFloatVal, T IEEEQuadVal) { if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEhalf()) return IEEEHalfVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle()) @@ -107,6 +107,8 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, return X87DoubleExtendedVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::PPCDoubleDouble()) return PPCDoubleDoubleVal; + if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::BFloat()) +return BFloatVal; assert(Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEquad()); return IEEEQuadVal; } @@ -117,29 +119,34 @@ static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix,
[clang] [clang] Add `__bf16` Type Support Macros With Literal Suffix Support (PR #134214)
https://github.com/bassiounix created https://github.com/llvm/llvm-project/pull/134214 closes #133660. I added the suffix support to this pr as the generated macros uses the `BF16` suffix. The only line I found in GCC which we don't seem to support as a macro is ```c #define __BFLT16_IS_IEC_60559__ 0 ``` we don't have `__*_IS_IEC_60559__` in our macro builder so I skipped it. cc @AaronBallman @lntue @jhuber6 >From 620bdbed2b372b97b66147684d4ded5b666c7786 Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:08:59 +0200 Subject: [PATCH 1/2] add `bf16`/`BF16` suffix support --- clang/include/clang/Lex/LiteralSupport.h | 1 + clang/lib/Lex/LiteralSupport.cpp | 17 - clang/lib/Sema/SemaExpr.cpp | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Lex/LiteralSupport.h b/clang/include/clang/Lex/LiteralSupport.h index ea5f63bc20399..1907cfc365d97 100644 --- a/clang/include/clang/Lex/LiteralSupport.h +++ b/clang/include/clang/Lex/LiteralSupport.h @@ -77,6 +77,7 @@ class NumericLiteralParser { bool isFloat : 1; // 1.0f bool isImaginary : 1; // 1.0i bool isFloat16 : 1; // 1.0f16 + bool isBFloat16 : 1; // 1.0bf16 bool isFloat128 : 1; // 1.0q bool isFract : 1; // 1.0hr/r/lr/uhr/ur/ulr bool isAccum : 1; // 1.0hk/k/lk/uhk/uk/ulk diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp index 20933cc8dee69..ab0d301a70fbd 100644 --- a/clang/lib/Lex/LiteralSupport.cpp +++ b/clang/lib/Lex/LiteralSupport.cpp @@ -917,6 +917,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isFloat = false; isImaginary = false; isFloat16 = false; + isBFloat16 = false; isFloat128 = false; MicrosoftInteger = 0; isFract = false; @@ -973,11 +974,20 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, bool isFPConstant = isFloatingLiteral(); bool HasSize = false; bool DoubleUnderscore = false; + bool isBF16 = false; // Loop over all of the characters of the suffix. If we see something bad, // we break out of the loop. for (; s != ThisTokEnd; ++s) { switch (*s) { +case 'b': +case 'B': + if (isBFloat16) break; + if (isBF16) break; + if (HasSize) break; + + isBF16 = true; + continue; case 'R': case 'r': if (!LangOpts.FixedPoint) @@ -1022,7 +1032,11 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, (LangOpts.OpenMPIsTargetDevice && Target.getTriple().isNVPTX())) && s + 2 < ThisTokEnd && s[1] == '1' && s[2] == '6') { s += 2; // success, eat up 2 characters. -isFloat16 = true; +if (isBF16) { + isBFloat16 = true; +} else { + isFloat16 = true; +} continue; } @@ -1183,6 +1197,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isSizeT = false; isFloat = false; isFloat16 = false; +isBFloat16 = false; isHalf = false; isImaginary = false; isBitInt = false; diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 3af6d6c23438f..b4210fc22ae52 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -3878,6 +3878,8 @@ ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) { Ty = !getLangOpts().HLSL ? Context.LongDoubleTy : Context.DoubleTy; else if (Literal.isFloat16) Ty = Context.Float16Ty; +else if (Literal.isBFloat16) + Ty = Context.BFloat16Ty; else if (Literal.isFloat128) Ty = Context.Float128Ty; else if (getLangOpts().HLSL) >From d55e0ca50eb50ec4a2fdb0e7ba9e3c11be70065d Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:09:22 +0200 Subject: [PATCH 2/2] add `__bf16` macros --- clang/lib/Frontend/InitPreprocessor.cpp | 25 + 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 0b54665501c76..9bca74a8b4bd6 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -96,7 +96,7 @@ static void AddImplicitIncludePCH(MacroBuilder &Builder, Preprocessor &PP, template static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal, -T IEEEQuadVal) { +T BFloatVal, T IEEEQuadVal) { if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEhalf()) return IEEEHalfVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle()) @@ -107,6 +107,8 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, return X87DoubleExtendedVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::PPCDoub
[clang] [clang] Add `__bf16` Type Support Macros With Literal Suffix Support (PR #134214)
https://github.com/bassiounix updated https://github.com/llvm/llvm-project/pull/134214 >From 620bdbed2b372b97b66147684d4ded5b666c7786 Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:08:59 +0200 Subject: [PATCH 1/3] add `bf16`/`BF16` suffix support --- clang/include/clang/Lex/LiteralSupport.h | 1 + clang/lib/Lex/LiteralSupport.cpp | 17 - clang/lib/Sema/SemaExpr.cpp | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Lex/LiteralSupport.h b/clang/include/clang/Lex/LiteralSupport.h index ea5f63bc20399..1907cfc365d97 100644 --- a/clang/include/clang/Lex/LiteralSupport.h +++ b/clang/include/clang/Lex/LiteralSupport.h @@ -77,6 +77,7 @@ class NumericLiteralParser { bool isFloat : 1; // 1.0f bool isImaginary : 1; // 1.0i bool isFloat16 : 1; // 1.0f16 + bool isBFloat16 : 1; // 1.0bf16 bool isFloat128 : 1; // 1.0q bool isFract : 1; // 1.0hr/r/lr/uhr/ur/ulr bool isAccum : 1; // 1.0hk/k/lk/uhk/uk/ulk diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp index 20933cc8dee69..ab0d301a70fbd 100644 --- a/clang/lib/Lex/LiteralSupport.cpp +++ b/clang/lib/Lex/LiteralSupport.cpp @@ -917,6 +917,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isFloat = false; isImaginary = false; isFloat16 = false; + isBFloat16 = false; isFloat128 = false; MicrosoftInteger = 0; isFract = false; @@ -973,11 +974,20 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, bool isFPConstant = isFloatingLiteral(); bool HasSize = false; bool DoubleUnderscore = false; + bool isBF16 = false; // Loop over all of the characters of the suffix. If we see something bad, // we break out of the loop. for (; s != ThisTokEnd; ++s) { switch (*s) { +case 'b': +case 'B': + if (isBFloat16) break; + if (isBF16) break; + if (HasSize) break; + + isBF16 = true; + continue; case 'R': case 'r': if (!LangOpts.FixedPoint) @@ -1022,7 +1032,11 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, (LangOpts.OpenMPIsTargetDevice && Target.getTriple().isNVPTX())) && s + 2 < ThisTokEnd && s[1] == '1' && s[2] == '6') { s += 2; // success, eat up 2 characters. -isFloat16 = true; +if (isBF16) { + isBFloat16 = true; +} else { + isFloat16 = true; +} continue; } @@ -1183,6 +1197,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isSizeT = false; isFloat = false; isFloat16 = false; +isBFloat16 = false; isHalf = false; isImaginary = false; isBitInt = false; diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 3af6d6c23438f..b4210fc22ae52 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -3878,6 +3878,8 @@ ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) { Ty = !getLangOpts().HLSL ? Context.LongDoubleTy : Context.DoubleTy; else if (Literal.isFloat16) Ty = Context.Float16Ty; +else if (Literal.isBFloat16) + Ty = Context.BFloat16Ty; else if (Literal.isFloat128) Ty = Context.Float128Ty; else if (getLangOpts().HLSL) >From d55e0ca50eb50ec4a2fdb0e7ba9e3c11be70065d Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:09:22 +0200 Subject: [PATCH 2/3] add `__bf16` macros --- clang/lib/Frontend/InitPreprocessor.cpp | 25 + 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 0b54665501c76..9bca74a8b4bd6 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -96,7 +96,7 @@ static void AddImplicitIncludePCH(MacroBuilder &Builder, Preprocessor &PP, template static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal, -T IEEEQuadVal) { +T BFloatVal, T IEEEQuadVal) { if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEhalf()) return IEEEHalfVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle()) @@ -107,6 +107,8 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, return X87DoubleExtendedVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::PPCDoubleDouble()) return PPCDoubleDoubleVal; + if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::BFloat()) +return BFloatVal; assert(Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEquad()); return IEEEQuadVal; } @@ -117,29 +119,34 @@ static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix, Norm
[clang] [clang] Add `__bf16` Type Support Macros With Literal Suffix Support (PR #134214)
bassiounix wrote: How do I do the last one, the target support part? https://github.com/llvm/llvm-project/pull/134214 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Add `__bf16` Type Support Macros With Literal Suffix Support (PR #134214)
https://github.com/bassiounix updated https://github.com/llvm/llvm-project/pull/134214 >From 620bdbed2b372b97b66147684d4ded5b666c7786 Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:08:59 +0200 Subject: [PATCH 01/11] add `bf16`/`BF16` suffix support --- clang/include/clang/Lex/LiteralSupport.h | 1 + clang/lib/Lex/LiteralSupport.cpp | 17 - clang/lib/Sema/SemaExpr.cpp | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Lex/LiteralSupport.h b/clang/include/clang/Lex/LiteralSupport.h index ea5f63bc20399..1907cfc365d97 100644 --- a/clang/include/clang/Lex/LiteralSupport.h +++ b/clang/include/clang/Lex/LiteralSupport.h @@ -77,6 +77,7 @@ class NumericLiteralParser { bool isFloat : 1; // 1.0f bool isImaginary : 1; // 1.0i bool isFloat16 : 1; // 1.0f16 + bool isBFloat16 : 1; // 1.0bf16 bool isFloat128 : 1; // 1.0q bool isFract : 1; // 1.0hr/r/lr/uhr/ur/ulr bool isAccum : 1; // 1.0hk/k/lk/uhk/uk/ulk diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp index 20933cc8dee69..ab0d301a70fbd 100644 --- a/clang/lib/Lex/LiteralSupport.cpp +++ b/clang/lib/Lex/LiteralSupport.cpp @@ -917,6 +917,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isFloat = false; isImaginary = false; isFloat16 = false; + isBFloat16 = false; isFloat128 = false; MicrosoftInteger = 0; isFract = false; @@ -973,11 +974,20 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, bool isFPConstant = isFloatingLiteral(); bool HasSize = false; bool DoubleUnderscore = false; + bool isBF16 = false; // Loop over all of the characters of the suffix. If we see something bad, // we break out of the loop. for (; s != ThisTokEnd; ++s) { switch (*s) { +case 'b': +case 'B': + if (isBFloat16) break; + if (isBF16) break; + if (HasSize) break; + + isBF16 = true; + continue; case 'R': case 'r': if (!LangOpts.FixedPoint) @@ -1022,7 +1032,11 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, (LangOpts.OpenMPIsTargetDevice && Target.getTriple().isNVPTX())) && s + 2 < ThisTokEnd && s[1] == '1' && s[2] == '6') { s += 2; // success, eat up 2 characters. -isFloat16 = true; +if (isBF16) { + isBFloat16 = true; +} else { + isFloat16 = true; +} continue; } @@ -1183,6 +1197,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isSizeT = false; isFloat = false; isFloat16 = false; +isBFloat16 = false; isHalf = false; isImaginary = false; isBitInt = false; diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 3af6d6c23438f..b4210fc22ae52 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -3878,6 +3878,8 @@ ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) { Ty = !getLangOpts().HLSL ? Context.LongDoubleTy : Context.DoubleTy; else if (Literal.isFloat16) Ty = Context.Float16Ty; +else if (Literal.isBFloat16) + Ty = Context.BFloat16Ty; else if (Literal.isFloat128) Ty = Context.Float128Ty; else if (getLangOpts().HLSL) >From d55e0ca50eb50ec4a2fdb0e7ba9e3c11be70065d Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:09:22 +0200 Subject: [PATCH 02/11] add `__bf16` macros --- clang/lib/Frontend/InitPreprocessor.cpp | 25 + 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 0b54665501c76..9bca74a8b4bd6 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -96,7 +96,7 @@ static void AddImplicitIncludePCH(MacroBuilder &Builder, Preprocessor &PP, template static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal, -T IEEEQuadVal) { +T BFloatVal, T IEEEQuadVal) { if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEhalf()) return IEEEHalfVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle()) @@ -107,6 +107,8 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, return X87DoubleExtendedVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::PPCDoubleDouble()) return PPCDoubleDoubleVal; + if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::BFloat()) +return BFloatVal; assert(Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEquad()); return IEEEQuadVal; } @@ -117,29 +119,34 @@ static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix,
[clang] [clang] Add `__bf16` Type Support Macros With Literal Suffix Support (PR #134214)
bassiounix wrote: Looks like that `BFloat16Format` for `amdgcn-amd-amdhsa` target is not properly initialized and the `hasBFloat16Type` method at [`clang/lib/Basic/Targets/AMDGPU.h`](https://github.com/llvm/llvm-project/blob/92923e517c2926eb94b7b6e403433ecf62953186/clang/lib/Basic/Targets/AMDGPU.h#L127) is using a dummy check to that is based on the triple value only. Also there's no overrides for a full type support. The global value of `BFloat16Format` in `AMDGPUTI` is properly initialized. I think `TargetInfo::adjust` at [`clang/lib/Basic/TargetInfo.cpp`](https://github.com/llvm/llvm-project/blob/92923e517c2926eb94b7b6e403433ecf62953186/clang/lib/Basic/TargetInfo.cpp#L409) may be the reason but I'm not sure https://github.com/llvm/llvm-project/pull/134214 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Add `__bf16` Type Support Macros With Literal Suffix Support (PR #134214)
https://github.com/bassiounix updated https://github.com/llvm/llvm-project/pull/134214 >From 620bdbed2b372b97b66147684d4ded5b666c7786 Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:08:59 +0200 Subject: [PATCH 01/13] add `bf16`/`BF16` suffix support --- clang/include/clang/Lex/LiteralSupport.h | 1 + clang/lib/Lex/LiteralSupport.cpp | 17 - clang/lib/Sema/SemaExpr.cpp | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Lex/LiteralSupport.h b/clang/include/clang/Lex/LiteralSupport.h index ea5f63bc20399..1907cfc365d97 100644 --- a/clang/include/clang/Lex/LiteralSupport.h +++ b/clang/include/clang/Lex/LiteralSupport.h @@ -77,6 +77,7 @@ class NumericLiteralParser { bool isFloat : 1; // 1.0f bool isImaginary : 1; // 1.0i bool isFloat16 : 1; // 1.0f16 + bool isBFloat16 : 1; // 1.0bf16 bool isFloat128 : 1; // 1.0q bool isFract : 1; // 1.0hr/r/lr/uhr/ur/ulr bool isAccum : 1; // 1.0hk/k/lk/uhk/uk/ulk diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp index 20933cc8dee69..ab0d301a70fbd 100644 --- a/clang/lib/Lex/LiteralSupport.cpp +++ b/clang/lib/Lex/LiteralSupport.cpp @@ -917,6 +917,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isFloat = false; isImaginary = false; isFloat16 = false; + isBFloat16 = false; isFloat128 = false; MicrosoftInteger = 0; isFract = false; @@ -973,11 +974,20 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, bool isFPConstant = isFloatingLiteral(); bool HasSize = false; bool DoubleUnderscore = false; + bool isBF16 = false; // Loop over all of the characters of the suffix. If we see something bad, // we break out of the loop. for (; s != ThisTokEnd; ++s) { switch (*s) { +case 'b': +case 'B': + if (isBFloat16) break; + if (isBF16) break; + if (HasSize) break; + + isBF16 = true; + continue; case 'R': case 'r': if (!LangOpts.FixedPoint) @@ -1022,7 +1032,11 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, (LangOpts.OpenMPIsTargetDevice && Target.getTriple().isNVPTX())) && s + 2 < ThisTokEnd && s[1] == '1' && s[2] == '6') { s += 2; // success, eat up 2 characters. -isFloat16 = true; +if (isBF16) { + isBFloat16 = true; +} else { + isFloat16 = true; +} continue; } @@ -1183,6 +1197,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isSizeT = false; isFloat = false; isFloat16 = false; +isBFloat16 = false; isHalf = false; isImaginary = false; isBitInt = false; diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 3af6d6c23438f..b4210fc22ae52 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -3878,6 +3878,8 @@ ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) { Ty = !getLangOpts().HLSL ? Context.LongDoubleTy : Context.DoubleTy; else if (Literal.isFloat16) Ty = Context.Float16Ty; +else if (Literal.isBFloat16) + Ty = Context.BFloat16Ty; else if (Literal.isFloat128) Ty = Context.Float128Ty; else if (getLangOpts().HLSL) >From d55e0ca50eb50ec4a2fdb0e7ba9e3c11be70065d Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:09:22 +0200 Subject: [PATCH 02/13] add `__bf16` macros --- clang/lib/Frontend/InitPreprocessor.cpp | 25 + 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 0b54665501c76..9bca74a8b4bd6 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -96,7 +96,7 @@ static void AddImplicitIncludePCH(MacroBuilder &Builder, Preprocessor &PP, template static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal, -T IEEEQuadVal) { +T BFloatVal, T IEEEQuadVal) { if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEhalf()) return IEEEHalfVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle()) @@ -107,6 +107,8 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, return X87DoubleExtendedVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::PPCDoubleDouble()) return PPCDoubleDoubleVal; + if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::BFloat()) +return BFloatVal; assert(Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEquad()); return IEEEQuadVal; } @@ -117,29 +119,34 @@ static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix,
[clang] [clang] Add `__bf16` Type Support Macros With Literal Suffix Support (PR #134214)
https://github.com/bassiounix updated https://github.com/llvm/llvm-project/pull/134214 >From 620bdbed2b372b97b66147684d4ded5b666c7786 Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:08:59 +0200 Subject: [PATCH 01/14] add `bf16`/`BF16` suffix support --- clang/include/clang/Lex/LiteralSupport.h | 1 + clang/lib/Lex/LiteralSupport.cpp | 17 - clang/lib/Sema/SemaExpr.cpp | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Lex/LiteralSupport.h b/clang/include/clang/Lex/LiteralSupport.h index ea5f63bc20399..1907cfc365d97 100644 --- a/clang/include/clang/Lex/LiteralSupport.h +++ b/clang/include/clang/Lex/LiteralSupport.h @@ -77,6 +77,7 @@ class NumericLiteralParser { bool isFloat : 1; // 1.0f bool isImaginary : 1; // 1.0i bool isFloat16 : 1; // 1.0f16 + bool isBFloat16 : 1; // 1.0bf16 bool isFloat128 : 1; // 1.0q bool isFract : 1; // 1.0hr/r/lr/uhr/ur/ulr bool isAccum : 1; // 1.0hk/k/lk/uhk/uk/ulk diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp index 20933cc8dee69..ab0d301a70fbd 100644 --- a/clang/lib/Lex/LiteralSupport.cpp +++ b/clang/lib/Lex/LiteralSupport.cpp @@ -917,6 +917,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isFloat = false; isImaginary = false; isFloat16 = false; + isBFloat16 = false; isFloat128 = false; MicrosoftInteger = 0; isFract = false; @@ -973,11 +974,20 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, bool isFPConstant = isFloatingLiteral(); bool HasSize = false; bool DoubleUnderscore = false; + bool isBF16 = false; // Loop over all of the characters of the suffix. If we see something bad, // we break out of the loop. for (; s != ThisTokEnd; ++s) { switch (*s) { +case 'b': +case 'B': + if (isBFloat16) break; + if (isBF16) break; + if (HasSize) break; + + isBF16 = true; + continue; case 'R': case 'r': if (!LangOpts.FixedPoint) @@ -1022,7 +1032,11 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, (LangOpts.OpenMPIsTargetDevice && Target.getTriple().isNVPTX())) && s + 2 < ThisTokEnd && s[1] == '1' && s[2] == '6') { s += 2; // success, eat up 2 characters. -isFloat16 = true; +if (isBF16) { + isBFloat16 = true; +} else { + isFloat16 = true; +} continue; } @@ -1183,6 +1197,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isSizeT = false; isFloat = false; isFloat16 = false; +isBFloat16 = false; isHalf = false; isImaginary = false; isBitInt = false; diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 3af6d6c23438f..b4210fc22ae52 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -3878,6 +3878,8 @@ ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) { Ty = !getLangOpts().HLSL ? Context.LongDoubleTy : Context.DoubleTy; else if (Literal.isFloat16) Ty = Context.Float16Ty; +else if (Literal.isBFloat16) + Ty = Context.BFloat16Ty; else if (Literal.isFloat128) Ty = Context.Float128Ty; else if (getLangOpts().HLSL) >From d55e0ca50eb50ec4a2fdb0e7ba9e3c11be70065d Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:09:22 +0200 Subject: [PATCH 02/14] add `__bf16` macros --- clang/lib/Frontend/InitPreprocessor.cpp | 25 + 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 0b54665501c76..9bca74a8b4bd6 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -96,7 +96,7 @@ static void AddImplicitIncludePCH(MacroBuilder &Builder, Preprocessor &PP, template static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal, -T IEEEQuadVal) { +T BFloatVal, T IEEEQuadVal) { if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEhalf()) return IEEEHalfVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle()) @@ -107,6 +107,8 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, return X87DoubleExtendedVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::PPCDoubleDouble()) return PPCDoubleDoubleVal; + if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::BFloat()) +return BFloatVal; assert(Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEquad()); return IEEEQuadVal; } @@ -117,29 +119,34 @@ static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix,
[clang] [clang] Add `__bf16` Type Support Macros With Literal Suffix Support (PR #134214)
https://github.com/bassiounix updated https://github.com/llvm/llvm-project/pull/134214 >From 620bdbed2b372b97b66147684d4ded5b666c7786 Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:08:59 +0200 Subject: [PATCH 01/16] add `bf16`/`BF16` suffix support --- clang/include/clang/Lex/LiteralSupport.h | 1 + clang/lib/Lex/LiteralSupport.cpp | 17 - clang/lib/Sema/SemaExpr.cpp | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Lex/LiteralSupport.h b/clang/include/clang/Lex/LiteralSupport.h index ea5f63bc20399..1907cfc365d97 100644 --- a/clang/include/clang/Lex/LiteralSupport.h +++ b/clang/include/clang/Lex/LiteralSupport.h @@ -77,6 +77,7 @@ class NumericLiteralParser { bool isFloat : 1; // 1.0f bool isImaginary : 1; // 1.0i bool isFloat16 : 1; // 1.0f16 + bool isBFloat16 : 1; // 1.0bf16 bool isFloat128 : 1; // 1.0q bool isFract : 1; // 1.0hr/r/lr/uhr/ur/ulr bool isAccum : 1; // 1.0hk/k/lk/uhk/uk/ulk diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp index 20933cc8dee69..ab0d301a70fbd 100644 --- a/clang/lib/Lex/LiteralSupport.cpp +++ b/clang/lib/Lex/LiteralSupport.cpp @@ -917,6 +917,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isFloat = false; isImaginary = false; isFloat16 = false; + isBFloat16 = false; isFloat128 = false; MicrosoftInteger = 0; isFract = false; @@ -973,11 +974,20 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, bool isFPConstant = isFloatingLiteral(); bool HasSize = false; bool DoubleUnderscore = false; + bool isBF16 = false; // Loop over all of the characters of the suffix. If we see something bad, // we break out of the loop. for (; s != ThisTokEnd; ++s) { switch (*s) { +case 'b': +case 'B': + if (isBFloat16) break; + if (isBF16) break; + if (HasSize) break; + + isBF16 = true; + continue; case 'R': case 'r': if (!LangOpts.FixedPoint) @@ -1022,7 +1032,11 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, (LangOpts.OpenMPIsTargetDevice && Target.getTriple().isNVPTX())) && s + 2 < ThisTokEnd && s[1] == '1' && s[2] == '6') { s += 2; // success, eat up 2 characters. -isFloat16 = true; +if (isBF16) { + isBFloat16 = true; +} else { + isFloat16 = true; +} continue; } @@ -1183,6 +1197,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isSizeT = false; isFloat = false; isFloat16 = false; +isBFloat16 = false; isHalf = false; isImaginary = false; isBitInt = false; diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 3af6d6c23438f..b4210fc22ae52 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -3878,6 +3878,8 @@ ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) { Ty = !getLangOpts().HLSL ? Context.LongDoubleTy : Context.DoubleTy; else if (Literal.isFloat16) Ty = Context.Float16Ty; +else if (Literal.isBFloat16) + Ty = Context.BFloat16Ty; else if (Literal.isFloat128) Ty = Context.Float128Ty; else if (getLangOpts().HLSL) >From d55e0ca50eb50ec4a2fdb0e7ba9e3c11be70065d Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:09:22 +0200 Subject: [PATCH 02/16] add `__bf16` macros --- clang/lib/Frontend/InitPreprocessor.cpp | 25 + 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 0b54665501c76..9bca74a8b4bd6 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -96,7 +96,7 @@ static void AddImplicitIncludePCH(MacroBuilder &Builder, Preprocessor &PP, template static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal, -T IEEEQuadVal) { +T BFloatVal, T IEEEQuadVal) { if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEhalf()) return IEEEHalfVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle()) @@ -107,6 +107,8 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, return X87DoubleExtendedVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::PPCDoubleDouble()) return PPCDoubleDoubleVal; + if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::BFloat()) +return BFloatVal; assert(Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEquad()); return IEEEQuadVal; } @@ -117,29 +119,34 @@ static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix,
[clang] [clang] Add `__bf16` Type Support Macros With Literal Suffix Support (PR #134214)
https://github.com/bassiounix updated https://github.com/llvm/llvm-project/pull/134214 >From 620bdbed2b372b97b66147684d4ded5b666c7786 Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:08:59 +0200 Subject: [PATCH 01/17] add `bf16`/`BF16` suffix support --- clang/include/clang/Lex/LiteralSupport.h | 1 + clang/lib/Lex/LiteralSupport.cpp | 17 - clang/lib/Sema/SemaExpr.cpp | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Lex/LiteralSupport.h b/clang/include/clang/Lex/LiteralSupport.h index ea5f63bc20399..1907cfc365d97 100644 --- a/clang/include/clang/Lex/LiteralSupport.h +++ b/clang/include/clang/Lex/LiteralSupport.h @@ -77,6 +77,7 @@ class NumericLiteralParser { bool isFloat : 1; // 1.0f bool isImaginary : 1; // 1.0i bool isFloat16 : 1; // 1.0f16 + bool isBFloat16 : 1; // 1.0bf16 bool isFloat128 : 1; // 1.0q bool isFract : 1; // 1.0hr/r/lr/uhr/ur/ulr bool isAccum : 1; // 1.0hk/k/lk/uhk/uk/ulk diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp index 20933cc8dee69..ab0d301a70fbd 100644 --- a/clang/lib/Lex/LiteralSupport.cpp +++ b/clang/lib/Lex/LiteralSupport.cpp @@ -917,6 +917,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isFloat = false; isImaginary = false; isFloat16 = false; + isBFloat16 = false; isFloat128 = false; MicrosoftInteger = 0; isFract = false; @@ -973,11 +974,20 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, bool isFPConstant = isFloatingLiteral(); bool HasSize = false; bool DoubleUnderscore = false; + bool isBF16 = false; // Loop over all of the characters of the suffix. If we see something bad, // we break out of the loop. for (; s != ThisTokEnd; ++s) { switch (*s) { +case 'b': +case 'B': + if (isBFloat16) break; + if (isBF16) break; + if (HasSize) break; + + isBF16 = true; + continue; case 'R': case 'r': if (!LangOpts.FixedPoint) @@ -1022,7 +1032,11 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, (LangOpts.OpenMPIsTargetDevice && Target.getTriple().isNVPTX())) && s + 2 < ThisTokEnd && s[1] == '1' && s[2] == '6') { s += 2; // success, eat up 2 characters. -isFloat16 = true; +if (isBF16) { + isBFloat16 = true; +} else { + isFloat16 = true; +} continue; } @@ -1183,6 +1197,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isSizeT = false; isFloat = false; isFloat16 = false; +isBFloat16 = false; isHalf = false; isImaginary = false; isBitInt = false; diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 3af6d6c23438f..b4210fc22ae52 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -3878,6 +3878,8 @@ ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) { Ty = !getLangOpts().HLSL ? Context.LongDoubleTy : Context.DoubleTy; else if (Literal.isFloat16) Ty = Context.Float16Ty; +else if (Literal.isBFloat16) + Ty = Context.BFloat16Ty; else if (Literal.isFloat128) Ty = Context.Float128Ty; else if (getLangOpts().HLSL) >From d55e0ca50eb50ec4a2fdb0e7ba9e3c11be70065d Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:09:22 +0200 Subject: [PATCH 02/17] add `__bf16` macros --- clang/lib/Frontend/InitPreprocessor.cpp | 25 + 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 0b54665501c76..9bca74a8b4bd6 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -96,7 +96,7 @@ static void AddImplicitIncludePCH(MacroBuilder &Builder, Preprocessor &PP, template static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal, -T IEEEQuadVal) { +T BFloatVal, T IEEEQuadVal) { if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEhalf()) return IEEEHalfVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle()) @@ -107,6 +107,8 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, return X87DoubleExtendedVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::PPCDoubleDouble()) return PPCDoubleDoubleVal; + if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::BFloat()) +return BFloatVal; assert(Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEquad()); return IEEEQuadVal; } @@ -117,29 +119,34 @@ static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix,
[clang] [clang] Add `__bf16` Type Support Macros With Literal Suffix Support (PR #134214)
https://github.com/bassiounix updated https://github.com/llvm/llvm-project/pull/134214 >From 620bdbed2b372b97b66147684d4ded5b666c7786 Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:08:59 +0200 Subject: [PATCH 01/17] add `bf16`/`BF16` suffix support --- clang/include/clang/Lex/LiteralSupport.h | 1 + clang/lib/Lex/LiteralSupport.cpp | 17 - clang/lib/Sema/SemaExpr.cpp | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Lex/LiteralSupport.h b/clang/include/clang/Lex/LiteralSupport.h index ea5f63bc20399..1907cfc365d97 100644 --- a/clang/include/clang/Lex/LiteralSupport.h +++ b/clang/include/clang/Lex/LiteralSupport.h @@ -77,6 +77,7 @@ class NumericLiteralParser { bool isFloat : 1; // 1.0f bool isImaginary : 1; // 1.0i bool isFloat16 : 1; // 1.0f16 + bool isBFloat16 : 1; // 1.0bf16 bool isFloat128 : 1; // 1.0q bool isFract : 1; // 1.0hr/r/lr/uhr/ur/ulr bool isAccum : 1; // 1.0hk/k/lk/uhk/uk/ulk diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp index 20933cc8dee69..ab0d301a70fbd 100644 --- a/clang/lib/Lex/LiteralSupport.cpp +++ b/clang/lib/Lex/LiteralSupport.cpp @@ -917,6 +917,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isFloat = false; isImaginary = false; isFloat16 = false; + isBFloat16 = false; isFloat128 = false; MicrosoftInteger = 0; isFract = false; @@ -973,11 +974,20 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, bool isFPConstant = isFloatingLiteral(); bool HasSize = false; bool DoubleUnderscore = false; + bool isBF16 = false; // Loop over all of the characters of the suffix. If we see something bad, // we break out of the loop. for (; s != ThisTokEnd; ++s) { switch (*s) { +case 'b': +case 'B': + if (isBFloat16) break; + if (isBF16) break; + if (HasSize) break; + + isBF16 = true; + continue; case 'R': case 'r': if (!LangOpts.FixedPoint) @@ -1022,7 +1032,11 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, (LangOpts.OpenMPIsTargetDevice && Target.getTriple().isNVPTX())) && s + 2 < ThisTokEnd && s[1] == '1' && s[2] == '6') { s += 2; // success, eat up 2 characters. -isFloat16 = true; +if (isBF16) { + isBFloat16 = true; +} else { + isFloat16 = true; +} continue; } @@ -1183,6 +1197,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isSizeT = false; isFloat = false; isFloat16 = false; +isBFloat16 = false; isHalf = false; isImaginary = false; isBitInt = false; diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 3af6d6c23438f..b4210fc22ae52 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -3878,6 +3878,8 @@ ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) { Ty = !getLangOpts().HLSL ? Context.LongDoubleTy : Context.DoubleTy; else if (Literal.isFloat16) Ty = Context.Float16Ty; +else if (Literal.isBFloat16) + Ty = Context.BFloat16Ty; else if (Literal.isFloat128) Ty = Context.Float128Ty; else if (getLangOpts().HLSL) >From d55e0ca50eb50ec4a2fdb0e7ba9e3c11be70065d Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:09:22 +0200 Subject: [PATCH 02/17] add `__bf16` macros --- clang/lib/Frontend/InitPreprocessor.cpp | 25 + 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 0b54665501c76..9bca74a8b4bd6 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -96,7 +96,7 @@ static void AddImplicitIncludePCH(MacroBuilder &Builder, Preprocessor &PP, template static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal, -T IEEEQuadVal) { +T BFloatVal, T IEEEQuadVal) { if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEhalf()) return IEEEHalfVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle()) @@ -107,6 +107,8 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, return X87DoubleExtendedVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::PPCDoubleDouble()) return PPCDoubleDoubleVal; + if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::BFloat()) +return BFloatVal; assert(Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEquad()); return IEEEQuadVal; } @@ -117,29 +119,34 @@ static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix,
[clang] [clang] Add `__bf16` Type Support Macros With Literal Suffix Support (PR #134214)
https://github.com/bassiounix updated https://github.com/llvm/llvm-project/pull/134214 >From 620bdbed2b372b97b66147684d4ded5b666c7786 Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:08:59 +0200 Subject: [PATCH 01/17] add `bf16`/`BF16` suffix support --- clang/include/clang/Lex/LiteralSupport.h | 1 + clang/lib/Lex/LiteralSupport.cpp | 17 - clang/lib/Sema/SemaExpr.cpp | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Lex/LiteralSupport.h b/clang/include/clang/Lex/LiteralSupport.h index ea5f63bc20399..1907cfc365d97 100644 --- a/clang/include/clang/Lex/LiteralSupport.h +++ b/clang/include/clang/Lex/LiteralSupport.h @@ -77,6 +77,7 @@ class NumericLiteralParser { bool isFloat : 1; // 1.0f bool isImaginary : 1; // 1.0i bool isFloat16 : 1; // 1.0f16 + bool isBFloat16 : 1; // 1.0bf16 bool isFloat128 : 1; // 1.0q bool isFract : 1; // 1.0hr/r/lr/uhr/ur/ulr bool isAccum : 1; // 1.0hk/k/lk/uhk/uk/ulk diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp index 20933cc8dee69..ab0d301a70fbd 100644 --- a/clang/lib/Lex/LiteralSupport.cpp +++ b/clang/lib/Lex/LiteralSupport.cpp @@ -917,6 +917,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isFloat = false; isImaginary = false; isFloat16 = false; + isBFloat16 = false; isFloat128 = false; MicrosoftInteger = 0; isFract = false; @@ -973,11 +974,20 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, bool isFPConstant = isFloatingLiteral(); bool HasSize = false; bool DoubleUnderscore = false; + bool isBF16 = false; // Loop over all of the characters of the suffix. If we see something bad, // we break out of the loop. for (; s != ThisTokEnd; ++s) { switch (*s) { +case 'b': +case 'B': + if (isBFloat16) break; + if (isBF16) break; + if (HasSize) break; + + isBF16 = true; + continue; case 'R': case 'r': if (!LangOpts.FixedPoint) @@ -1022,7 +1032,11 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, (LangOpts.OpenMPIsTargetDevice && Target.getTriple().isNVPTX())) && s + 2 < ThisTokEnd && s[1] == '1' && s[2] == '6') { s += 2; // success, eat up 2 characters. -isFloat16 = true; +if (isBF16) { + isBFloat16 = true; +} else { + isFloat16 = true; +} continue; } @@ -1183,6 +1197,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isSizeT = false; isFloat = false; isFloat16 = false; +isBFloat16 = false; isHalf = false; isImaginary = false; isBitInt = false; diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 3af6d6c23438f..b4210fc22ae52 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -3878,6 +3878,8 @@ ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) { Ty = !getLangOpts().HLSL ? Context.LongDoubleTy : Context.DoubleTy; else if (Literal.isFloat16) Ty = Context.Float16Ty; +else if (Literal.isBFloat16) + Ty = Context.BFloat16Ty; else if (Literal.isFloat128) Ty = Context.Float128Ty; else if (getLangOpts().HLSL) >From d55e0ca50eb50ec4a2fdb0e7ba9e3c11be70065d Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:09:22 +0200 Subject: [PATCH 02/17] add `__bf16` macros --- clang/lib/Frontend/InitPreprocessor.cpp | 25 + 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 0b54665501c76..9bca74a8b4bd6 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -96,7 +96,7 @@ static void AddImplicitIncludePCH(MacroBuilder &Builder, Preprocessor &PP, template static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal, -T IEEEQuadVal) { +T BFloatVal, T IEEEQuadVal) { if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEhalf()) return IEEEHalfVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle()) @@ -107,6 +107,8 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, return X87DoubleExtendedVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::PPCDoubleDouble()) return PPCDoubleDoubleVal; + if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::BFloat()) +return BFloatVal; assert(Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEquad()); return IEEEQuadVal; } @@ -117,29 +119,34 @@ static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix,
[clang] [clang] Add `__bf16` Type Support Macros With Literal Suffix Support (PR #134214)
https://github.com/bassiounix updated https://github.com/llvm/llvm-project/pull/134214 >From 620bdbed2b372b97b66147684d4ded5b666c7786 Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:08:59 +0200 Subject: [PATCH 01/12] add `bf16`/`BF16` suffix support --- clang/include/clang/Lex/LiteralSupport.h | 1 + clang/lib/Lex/LiteralSupport.cpp | 17 - clang/lib/Sema/SemaExpr.cpp | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Lex/LiteralSupport.h b/clang/include/clang/Lex/LiteralSupport.h index ea5f63bc20399..1907cfc365d97 100644 --- a/clang/include/clang/Lex/LiteralSupport.h +++ b/clang/include/clang/Lex/LiteralSupport.h @@ -77,6 +77,7 @@ class NumericLiteralParser { bool isFloat : 1; // 1.0f bool isImaginary : 1; // 1.0i bool isFloat16 : 1; // 1.0f16 + bool isBFloat16 : 1; // 1.0bf16 bool isFloat128 : 1; // 1.0q bool isFract : 1; // 1.0hr/r/lr/uhr/ur/ulr bool isAccum : 1; // 1.0hk/k/lk/uhk/uk/ulk diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp index 20933cc8dee69..ab0d301a70fbd 100644 --- a/clang/lib/Lex/LiteralSupport.cpp +++ b/clang/lib/Lex/LiteralSupport.cpp @@ -917,6 +917,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isFloat = false; isImaginary = false; isFloat16 = false; + isBFloat16 = false; isFloat128 = false; MicrosoftInteger = 0; isFract = false; @@ -973,11 +974,20 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, bool isFPConstant = isFloatingLiteral(); bool HasSize = false; bool DoubleUnderscore = false; + bool isBF16 = false; // Loop over all of the characters of the suffix. If we see something bad, // we break out of the loop. for (; s != ThisTokEnd; ++s) { switch (*s) { +case 'b': +case 'B': + if (isBFloat16) break; + if (isBF16) break; + if (HasSize) break; + + isBF16 = true; + continue; case 'R': case 'r': if (!LangOpts.FixedPoint) @@ -1022,7 +1032,11 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, (LangOpts.OpenMPIsTargetDevice && Target.getTriple().isNVPTX())) && s + 2 < ThisTokEnd && s[1] == '1' && s[2] == '6') { s += 2; // success, eat up 2 characters. -isFloat16 = true; +if (isBF16) { + isBFloat16 = true; +} else { + isFloat16 = true; +} continue; } @@ -1183,6 +1197,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isSizeT = false; isFloat = false; isFloat16 = false; +isBFloat16 = false; isHalf = false; isImaginary = false; isBitInt = false; diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 3af6d6c23438f..b4210fc22ae52 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -3878,6 +3878,8 @@ ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) { Ty = !getLangOpts().HLSL ? Context.LongDoubleTy : Context.DoubleTy; else if (Literal.isFloat16) Ty = Context.Float16Ty; +else if (Literal.isBFloat16) + Ty = Context.BFloat16Ty; else if (Literal.isFloat128) Ty = Context.Float128Ty; else if (getLangOpts().HLSL) >From d55e0ca50eb50ec4a2fdb0e7ba9e3c11be70065d Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:09:22 +0200 Subject: [PATCH 02/12] add `__bf16` macros --- clang/lib/Frontend/InitPreprocessor.cpp | 25 + 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 0b54665501c76..9bca74a8b4bd6 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -96,7 +96,7 @@ static void AddImplicitIncludePCH(MacroBuilder &Builder, Preprocessor &PP, template static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal, -T IEEEQuadVal) { +T BFloatVal, T IEEEQuadVal) { if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEhalf()) return IEEEHalfVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle()) @@ -107,6 +107,8 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, return X87DoubleExtendedVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::PPCDoubleDouble()) return PPCDoubleDoubleVal; + if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::BFloat()) +return BFloatVal; assert(Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEquad()); return IEEEQuadVal; } @@ -117,29 +119,34 @@ static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix,
[clang] [clang] Add `__bf16` Type Support Macros With Literal Suffix Support (PR #134214)
https://github.com/bassiounix updated https://github.com/llvm/llvm-project/pull/134214 >From 620bdbed2b372b97b66147684d4ded5b666c7786 Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:08:59 +0200 Subject: [PATCH 01/10] add `bf16`/`BF16` suffix support --- clang/include/clang/Lex/LiteralSupport.h | 1 + clang/lib/Lex/LiteralSupport.cpp | 17 - clang/lib/Sema/SemaExpr.cpp | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Lex/LiteralSupport.h b/clang/include/clang/Lex/LiteralSupport.h index ea5f63bc20399..1907cfc365d97 100644 --- a/clang/include/clang/Lex/LiteralSupport.h +++ b/clang/include/clang/Lex/LiteralSupport.h @@ -77,6 +77,7 @@ class NumericLiteralParser { bool isFloat : 1; // 1.0f bool isImaginary : 1; // 1.0i bool isFloat16 : 1; // 1.0f16 + bool isBFloat16 : 1; // 1.0bf16 bool isFloat128 : 1; // 1.0q bool isFract : 1; // 1.0hr/r/lr/uhr/ur/ulr bool isAccum : 1; // 1.0hk/k/lk/uhk/uk/ulk diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp index 20933cc8dee69..ab0d301a70fbd 100644 --- a/clang/lib/Lex/LiteralSupport.cpp +++ b/clang/lib/Lex/LiteralSupport.cpp @@ -917,6 +917,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isFloat = false; isImaginary = false; isFloat16 = false; + isBFloat16 = false; isFloat128 = false; MicrosoftInteger = 0; isFract = false; @@ -973,11 +974,20 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, bool isFPConstant = isFloatingLiteral(); bool HasSize = false; bool DoubleUnderscore = false; + bool isBF16 = false; // Loop over all of the characters of the suffix. If we see something bad, // we break out of the loop. for (; s != ThisTokEnd; ++s) { switch (*s) { +case 'b': +case 'B': + if (isBFloat16) break; + if (isBF16) break; + if (HasSize) break; + + isBF16 = true; + continue; case 'R': case 'r': if (!LangOpts.FixedPoint) @@ -1022,7 +1032,11 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, (LangOpts.OpenMPIsTargetDevice && Target.getTriple().isNVPTX())) && s + 2 < ThisTokEnd && s[1] == '1' && s[2] == '6') { s += 2; // success, eat up 2 characters. -isFloat16 = true; +if (isBF16) { + isBFloat16 = true; +} else { + isFloat16 = true; +} continue; } @@ -1183,6 +1197,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isSizeT = false; isFloat = false; isFloat16 = false; +isBFloat16 = false; isHalf = false; isImaginary = false; isBitInt = false; diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 3af6d6c23438f..b4210fc22ae52 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -3878,6 +3878,8 @@ ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) { Ty = !getLangOpts().HLSL ? Context.LongDoubleTy : Context.DoubleTy; else if (Literal.isFloat16) Ty = Context.Float16Ty; +else if (Literal.isBFloat16) + Ty = Context.BFloat16Ty; else if (Literal.isFloat128) Ty = Context.Float128Ty; else if (getLangOpts().HLSL) >From d55e0ca50eb50ec4a2fdb0e7ba9e3c11be70065d Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:09:22 +0200 Subject: [PATCH 02/10] add `__bf16` macros --- clang/lib/Frontend/InitPreprocessor.cpp | 25 + 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 0b54665501c76..9bca74a8b4bd6 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -96,7 +96,7 @@ static void AddImplicitIncludePCH(MacroBuilder &Builder, Preprocessor &PP, template static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal, -T IEEEQuadVal) { +T BFloatVal, T IEEEQuadVal) { if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEhalf()) return IEEEHalfVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle()) @@ -107,6 +107,8 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, return X87DoubleExtendedVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::PPCDoubleDouble()) return PPCDoubleDoubleVal; + if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::BFloat()) +return BFloatVal; assert(Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEquad()); return IEEEQuadVal; } @@ -117,29 +119,34 @@ static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix,
[clang] [clang] Add `__bf16` Type Support Macros With Literal Suffix Support (PR #134214)
https://github.com/bassiounix updated https://github.com/llvm/llvm-project/pull/134214 >From 620bdbed2b372b97b66147684d4ded5b666c7786 Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:08:59 +0200 Subject: [PATCH 01/18] add `bf16`/`BF16` suffix support --- clang/include/clang/Lex/LiteralSupport.h | 1 + clang/lib/Lex/LiteralSupport.cpp | 17 - clang/lib/Sema/SemaExpr.cpp | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Lex/LiteralSupport.h b/clang/include/clang/Lex/LiteralSupport.h index ea5f63bc20399..1907cfc365d97 100644 --- a/clang/include/clang/Lex/LiteralSupport.h +++ b/clang/include/clang/Lex/LiteralSupport.h @@ -77,6 +77,7 @@ class NumericLiteralParser { bool isFloat : 1; // 1.0f bool isImaginary : 1; // 1.0i bool isFloat16 : 1; // 1.0f16 + bool isBFloat16 : 1; // 1.0bf16 bool isFloat128 : 1; // 1.0q bool isFract : 1; // 1.0hr/r/lr/uhr/ur/ulr bool isAccum : 1; // 1.0hk/k/lk/uhk/uk/ulk diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp index 20933cc8dee69..ab0d301a70fbd 100644 --- a/clang/lib/Lex/LiteralSupport.cpp +++ b/clang/lib/Lex/LiteralSupport.cpp @@ -917,6 +917,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isFloat = false; isImaginary = false; isFloat16 = false; + isBFloat16 = false; isFloat128 = false; MicrosoftInteger = 0; isFract = false; @@ -973,11 +974,20 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, bool isFPConstant = isFloatingLiteral(); bool HasSize = false; bool DoubleUnderscore = false; + bool isBF16 = false; // Loop over all of the characters of the suffix. If we see something bad, // we break out of the loop. for (; s != ThisTokEnd; ++s) { switch (*s) { +case 'b': +case 'B': + if (isBFloat16) break; + if (isBF16) break; + if (HasSize) break; + + isBF16 = true; + continue; case 'R': case 'r': if (!LangOpts.FixedPoint) @@ -1022,7 +1032,11 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, (LangOpts.OpenMPIsTargetDevice && Target.getTriple().isNVPTX())) && s + 2 < ThisTokEnd && s[1] == '1' && s[2] == '6') { s += 2; // success, eat up 2 characters. -isFloat16 = true; +if (isBF16) { + isBFloat16 = true; +} else { + isFloat16 = true; +} continue; } @@ -1183,6 +1197,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, isSizeT = false; isFloat = false; isFloat16 = false; +isBFloat16 = false; isHalf = false; isImaginary = false; isBitInt = false; diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 3af6d6c23438f..b4210fc22ae52 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -3878,6 +3878,8 @@ ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) { Ty = !getLangOpts().HLSL ? Context.LongDoubleTy : Context.DoubleTy; else if (Literal.isFloat16) Ty = Context.Float16Ty; +else if (Literal.isBFloat16) + Ty = Context.BFloat16Ty; else if (Literal.isFloat128) Ty = Context.Float128Ty; else if (getLangOpts().HLSL) >From d55e0ca50eb50ec4a2fdb0e7ba9e3c11be70065d Mon Sep 17 00:00:00 2001 From: bassiounix Date: Thu, 3 Apr 2025 10:09:22 +0200 Subject: [PATCH 02/18] add `__bf16` macros --- clang/lib/Frontend/InitPreprocessor.cpp | 25 + 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 0b54665501c76..9bca74a8b4bd6 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -96,7 +96,7 @@ static void AddImplicitIncludePCH(MacroBuilder &Builder, Preprocessor &PP, template static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal, -T IEEEQuadVal) { +T BFloatVal, T IEEEQuadVal) { if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEhalf()) return IEEEHalfVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle()) @@ -107,6 +107,8 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, return X87DoubleExtendedVal; if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::PPCDoubleDouble()) return PPCDoubleDoubleVal; + if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::BFloat()) +return BFloatVal; assert(Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEquad()); return IEEEQuadVal; } @@ -117,29 +119,34 @@ static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix,