[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] 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: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-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,
   

[clang] [libc] [libc][math] fix-exp (PR #148670)

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

https://github.com/bassiounix updated 
https://github.com/llvm/llvm-project/pull/148670

>From 30f3a33cea2cfcbe61663102d47dcc74ff43ccb3 Mon Sep 17 00:00:00 2001
From: bassiounix 
Date: Mon, 14 Jul 2025 19:50:42 +0300
Subject: [PATCH 1/2] [libc][math] fix-exp

---
 libc/src/__support/FPUtil/PolyEval.h | 8 
 libc/src/__support/FPUtil/multiply_add.h | 8 
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/libc/src/__support/FPUtil/PolyEval.h 
b/libc/src/__support/FPUtil/PolyEval.h
index 41104620ed61d..105b3f2698897 100644
--- a/libc/src/__support/FPUtil/PolyEval.h
+++ b/libc/src/__support/FPUtil/PolyEval.h
@@ -25,19 +25,19 @@ namespace LIBC_NAMESPACE_DECL {
 namespace fputil {
 
 template 
-LIBC_INLINE cpp::enable_if_t<(sizeof(T) > sizeof(void *)), T>
+LIBC_INLINE static constexpr cpp::enable_if_t<(sizeof(T) > sizeof(void *)), T>
 polyeval(const T &, const T &a0) {
   return a0;
 }
 
 template 
-LIBC_INLINE cpp::enable_if_t<(sizeof(T) <= sizeof(void *)), T> polyeval(T,
-T a0) {
+LIBC_INLINE static constexpr cpp::enable_if_t<(sizeof(T) <= sizeof(void *)), T>
+polyeval(T, T a0) {
   return a0;
 }
 
 template 
-LIBC_INLINE cpp::enable_if_t<(sizeof(T) > sizeof(void *)), T>
+LIBC_INLINE static constexpr cpp::enable_if_t<(sizeof(T) > sizeof(void *)), T>
 polyeval(const T &x, const T &a0, const Ts &...a) {
   return multiply_add(x, polyeval(x, a...), a0);
 }
diff --git a/libc/src/__support/FPUtil/multiply_add.h 
b/libc/src/__support/FPUtil/multiply_add.h
index 8260702e2c9f4..5f759f86227cb 100644
--- a/libc/src/__support/FPUtil/multiply_add.h
+++ b/libc/src/__support/FPUtil/multiply_add.h
@@ -23,13 +23,13 @@ namespace fputil {
 // which uses FMA instructions to speed up if available.
 
 template 
-LIBC_INLINE cpp::enable_if_t<(sizeof(T) > sizeof(void *)), T>
+LIBC_INLINE static constexpr cpp::enable_if_t<(sizeof(T) > sizeof(void *)), T>
 multiply_add(const T &x, const T &y, const T &z) {
   return x * y + z;
 }
 
 template 
-LIBC_INLINE cpp::enable_if_t<(sizeof(T) <= sizeof(void *)), T>
+LIBC_INLINE static constexpr cpp::enable_if_t<(sizeof(T) <= sizeof(void *)), T>
 multiply_add(T x, T y, T z) {
   return x * y + z;
 }
@@ -47,7 +47,7 @@ namespace LIBC_NAMESPACE_DECL {
 namespace fputil {
 
 #ifdef LIBC_TARGET_CPU_HAS_FMA_FLOAT
-LIBC_INLINE float multiply_add(float x, float y, float z) {
+LIBC_INLINE static constexpr float multiply_add(float x, float y, float z) {
 #if __has_builtin(__builtin_elementwise_fma)
   return __builtin_elementwise_fma(x, y, z);
 #else
@@ -57,7 +57,7 @@ LIBC_INLINE float multiply_add(float x, float y, float z) {
 #endif // LIBC_TARGET_CPU_HAS_FMA_FLOAT
 
 #ifdef LIBC_TARGET_CPU_HAS_FMA_DOUBLE
-LIBC_INLINE double multiply_add(double x, double y, double z) {
+LIBC_INLINE static constexpr double multiply_add(double x, double y, double z) 
{
 #if __has_builtin(__builtin_elementwise_fma)
   return __builtin_elementwise_fma(x, y, z);
 #else

>From c7311382041e08bbd2fe53d64bc809cde6831f10 Mon Sep 17 00:00:00 2001
From: bassiounix 
Date: Mon, 14 Jul 2025 20:23:08 +0300
Subject: [PATCH 2/2] make builtins constexpr

---
 clang/lib/CodeGen/CGBuiltin.cpp | 4 ++--
 clang/lib/CodeGen/CGBuiltin.h   | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 5f2eb76e7bacb..506654d01f64e 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -602,7 +602,7 @@ Value *emitUnaryMaybeConstrainedFPBuiltin(CodeGenFunction 
&CGF,
 
 // Emit an intrinsic that has 2 operands of the same type as its result.
 // Depending on mode, this may be a constrained floating-point intrinsic.
-static Value *emitBinaryMaybeConstrainedFPBuiltin(CodeGenFunction &CGF,
+static constexpr Value *emitBinaryMaybeConstrainedFPBuiltin(CodeGenFunction 
&CGF,
 const CallExpr *E, unsigned IntrinsicID,
 unsigned ConstrainedIntrinsicID) {
   llvm::Value *Src0 = CGF.EmitScalarExpr(E->getArg(0));
@@ -640,7 +640,7 @@ emitBinaryExpMaybeConstrainedFPBuiltin(CodeGenFunction 
&CGF, const CallExpr *E,
 
 // Emit an intrinsic that has 3 operands of the same type as its result.
 // Depending on mode, this may be a constrained floating-point intrinsic.
-static Value *emitTernaryMaybeConstrainedFPBuiltin(CodeGenFunction &CGF,
+static constexpr Value *emitTernaryMaybeConstrainedFPBuiltin(CodeGenFunction 
&CGF,
  const CallExpr *E, unsigned IntrinsicID,
  unsigned ConstrainedIntrinsicID) {
   llvm::Value *Src0 = CGF.EmitScalarExpr(E->getArg(0));
diff --git a/clang/lib/CodeGen/CGBuiltin.h b/clang/lib/CodeGen/CGBuiltin.h
index 667bce845f5c0..aafc78ce77dff 100644
--- a/clang/lib/CodeGen/CGBuiltin.h
+++ b/clang/lib/CodeGen/CGBuiltin.h
@@ -60,7 +60,7 @@ enum class clang::CodeGen::CodeGenFunction::MSVCIntrin {
 // matching th