[clang] [clang:frontend] Move helper functions to common location for SemaSPIRV (PR #125045)

2025-01-30 Thread Muhammad Bassiouni via cfe-commits

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)

2025-01-30 Thread Muhammad Bassiouni via cfe-commits

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)

2025-01-30 Thread Muhammad Bassiouni via cfe-commits

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)

2025-01-30 Thread Muhammad Bassiouni via cfe-commits

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)

2025-01-30 Thread Muhammad Bassiouni via cfe-commits

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)

2025-01-30 Thread Muhammad Bassiouni via cfe-commits

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)

2025-01-30 Thread Muhammad Bassiouni via cfe-commits


@@ -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)

2025-03-07 Thread Muhammad Bassiouni via cfe-commits

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)

2025-04-05 Thread Muhammad Bassiouni via cfe-commits

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)

2025-04-05 Thread Muhammad Bassiouni via cfe-commits

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)

2025-04-03 Thread Muhammad Bassiouni via cfe-commits

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)

2025-04-03 Thread Muhammad Bassiouni via cfe-commits

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)

2025-04-04 Thread Muhammad Bassiouni via cfe-commits




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)

2025-04-04 Thread Muhammad Bassiouni via cfe-commits

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)

2025-04-04 Thread Muhammad Bassiouni via cfe-commits

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)

2025-04-04 Thread Muhammad Bassiouni via cfe-commits

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)

2025-04-04 Thread Muhammad Bassiouni via cfe-commits

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)

2025-04-04 Thread Muhammad Bassiouni via cfe-commits

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)

2025-04-04 Thread Muhammad Bassiouni via cfe-commits

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)

2025-04-04 Thread Muhammad Bassiouni via cfe-commits

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)

2025-04-04 Thread Muhammad Bassiouni via cfe-commits

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)

2025-04-04 Thread Muhammad Bassiouni via cfe-commits

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)

2025-04-04 Thread Muhammad Bassiouni via cfe-commits

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)

2025-04-04 Thread Muhammad Bassiouni via cfe-commits

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,