[clang] 05eb59e - [OpenCL] Add support of __opencl_c_program_scope_global_variables feature macro

2021-07-15 Thread Anton Zabaznov via cfe-commits

Author: Anton Zabaznov
Date: 2021-07-15T17:21:19+03:00
New Revision: 05eb59e1d0ea7505539434a32ccc5c3dc2097597

URL: 
https://github.com/llvm/llvm-project/commit/05eb59e1d0ea7505539434a32ccc5c3dc2097597
DIFF: 
https://github.com/llvm/llvm-project/commit/05eb59e1d0ea7505539434a32ccc5c3dc2097597.diff

LOG: [OpenCL] Add support of __opencl_c_program_scope_global_variables feature 
macro

Reviewed By: Anastasia

Differential Revision: https://reviews.llvm.org/D103191

Added: 


Modified: 
clang/include/clang/Basic/OpenCLOptions.h
clang/lib/Sema/SemaDecl.cpp
clang/test/CodeGenOpenCL/addr-space-struct-arg.cl
clang/test/SemaOpenCL/storageclass.cl

Removed: 




diff  --git a/clang/include/clang/Basic/OpenCLOptions.h 
b/clang/include/clang/Basic/OpenCLOptions.h
index 41db6b712a631..1a035626fade4 100644
--- a/clang/include/clang/Basic/OpenCLOptions.h
+++ b/clang/include/clang/Basic/OpenCLOptions.h
@@ -67,7 +67,23 @@ static inline bool isOpenCLVersionContainedInMask(const 
LangOptions &LO,
 
 /// OpenCL supported extensions and optional core features
 class OpenCLOptions {
+
 public:
+  // OpenCL C v1.2 s6.5 - All program scope variables must be declared in the
+  // __constant address space.
+  // OpenCL C v2.0 s6.5.1 - Variables defined at program scope and static
+  // variables inside a function can also be declared in the global
+  // address space.
+  // OpenCL C v3.0 s6.7.1 - Variables at program scope or static or extern
+  // variables inside functions can be declared in global address space if
+  // the __opencl_c_program_scope_global_variables feature is supported
+  // C++ for OpenCL inherits rule from OpenCL C v2.0.
+  bool areProgramScopeVariablesSupported(const LangOptions &Opts) const {
+return Opts.OpenCLCPlusPlus || Opts.OpenCLVersion == 200 ||
+   (Opts.OpenCLVersion == 300 &&
+isSupported("__opencl_c_program_scope_global_variables", Opts));
+  }
+
   struct OpenCLOptionInfo {
 // Does this option have pragma.
 bool WithPragma = false;

diff  --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index c2dcdf0b8d1f6..b25c3650b1607 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -6424,7 +6424,11 @@ void Sema::deduceOpenCLAddressSpace(ValueDecl *Decl) {
 if (Type->isSamplerT() || Type->isVoidType())
   return;
 LangAS ImplAS = LangAS::opencl_private;
-if ((getLangOpts().OpenCLCPlusPlus || getLangOpts().OpenCLVersion >= 200) 
&&
+// OpenCL C v3.0 s6.7.8 - For OpenCL C 2.0 or with the
+// __opencl_c_program_scope_global_variables feature, the address space
+// for a variable at program scope or a static or extern variable inside
+// a function are inferred to be __global.
+if (getOpenCLOptions().areProgramScopeVariablesSupported(getLangOpts()) &&
 Var->hasGlobalStorage())
   ImplAS = LangAS::opencl_global;
 // If the original type from a decayed type is an array type and that array
@@ -8018,23 +8022,16 @@ void Sema::CheckVariableDeclarationType(VarDecl *NewVD) 
{
   }
 }
 
-// OpenCL C v1.2 s6.5 - All program scope variables must be declared in the
-// __constant address space.
-// OpenCL C v2.0 s6.5.1 - Variables defined at program scope and static
-// variables inside a function can also be declared in the global
-// address space.
-// C++ for OpenCL inherits rule from OpenCL C v2.0.
 // FIXME: Adding local AS in C++ for OpenCL might make sense.
 if (NewVD->isFileVarDecl() || NewVD->isStaticLocal() ||
 NewVD->hasExternalStorage()) {
-  if (!T->isSamplerT() &&
-  !T->isDependentType() &&
+  if (!T->isSamplerT() && !T->isDependentType() &&
   !(T.getAddressSpace() == LangAS::opencl_constant ||
 (T.getAddressSpace() == LangAS::opencl_global &&
- (getLangOpts().OpenCLVersion == 200 ||
-  getLangOpts().OpenCLCPlusPlus {
+ getOpenCLOptions().areProgramScopeVariablesSupported(
+ getLangOpts() {
 int Scope = NewVD->isStaticLocal() | NewVD->hasExternalStorage() << 1;
-if (getLangOpts().OpenCLVersion == 200 || 
getLangOpts().OpenCLCPlusPlus)
+if 
(getOpenCLOptions().areProgramScopeVariablesSupported(getLangOpts()))
   Diag(NewVD->getLocation(), 
diag::err_opencl_global_invalid_addr_space)
   << Scope << "global or constant";
 else

diff  --git a/clang/test/CodeGenOpenCL/addr-space-struct-arg.cl 
b/clang/test/CodeGenOpenCL/addr-space-struct-arg.cl
index 21e0f2b057475..d24c9c5f85a4b 100644
--- a/clang/test/CodeGenOpenCL/addr-space-struct-arg.cl
+++ b/clang/test/CodeGenOpenCL/addr-space-struct-arg.cl
@@ -2,6 +2,8 @@
 // RUN: %clang_cc1 %s -emit-llvm -o - -O0 -triple amdgcn | FileCheck 
-enable-var-scope -check-prefixes=ALL,AMDGCN %s
 // RUN: %clang_cc1 %s -emit-llvm -o - -cl-std=CL2.0 -O0 -tripl

[clang] f16a4fc - [OpenCL] Add support of __opencl_c_3d_image_writes feature macro

2021-07-29 Thread Anton Zabaznov via cfe-commits

Author: Anton Zabaznov
Date: 2021-07-30T04:54:28+03:00
New Revision: f16a4fcbe510d17b3f361d446eaf223208ded2bd

URL: 
https://github.com/llvm/llvm-project/commit/f16a4fcbe510d17b3f361d446eaf223208ded2bd
DIFF: 
https://github.com/llvm/llvm-project/commit/f16a4fcbe510d17b3f361d446eaf223208ded2bd.diff

LOG: [OpenCL] Add support of __opencl_c_3d_image_writes feature macro

This feature requires support of __opencl_c_images, so diagnostics for that is 
provided as well.
Also, ensure that cl_khr_3d_image_writes feature macro is set to the same value.

Reviewed By: Anastasia

Differential Revision: https://reviews.llvm.org/D106260

Added: 


Modified: 
clang/include/clang/Basic/DiagnosticSemaKinds.td
clang/lib/Basic/OpenCLOptions.cpp
clang/lib/Basic/Targets/AMDGPU.h
clang/lib/Sema/SemaType.cpp
clang/test/Misc/opencl-c-3.0.incorrect_options.cl
clang/test/SemaOpenCL/unsupported-image.cl

Removed: 




diff  --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index a777f08de890..71e7ffdbe8a0 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -10106,8 +10106,6 @@ def err_opencl_requires_extension : Error<
 def ext_opencl_double_without_pragma : Extension<
   "Clang permits use of type 'double' regardless pragma if 'cl_khr_fp64' is"
   " supported">;
-def err_opencl_double_requires_extension :  Error<
-"use of type 'double' requires %select{cl_khr_fp64|cl_khr_fp64 and 
__opencl_c_fp64}0 support">;
 def warn_opencl_generic_address_space_arg : Warning<
   "passing non-generic address space pointer to %0"
   " may cause dynamic conversion affecting performance">,

diff  --git a/clang/lib/Basic/OpenCLOptions.cpp 
b/clang/lib/Basic/OpenCLOptions.cpp
index 2e215b185f66..f4f474fade4d 100644
--- a/clang/lib/Basic/OpenCLOptions.cpp
+++ b/clang/lib/Basic/OpenCLOptions.cpp
@@ -111,7 +111,8 @@ bool OpenCLOptions::diagnoseUnsupportedFeatureDependencies(
   // Feature pairs. First feature in a pair requires the second one to be
   // supported.
   static const llvm::StringMap DependentFeaturesMap = {
-  {"__opencl_c_read_write_images", "__opencl_c_images"}};
+  {"__opencl_c_read_write_images", "__opencl_c_images"},
+  {"__opencl_c_3d_image_writes", "__opencl_c_images"}};
 
   auto OpenCLFeaturesMap = TI.getSupportedOpenCLOpts();
 
@@ -130,7 +131,8 @@ bool OpenCLOptions::diagnoseFeatureExtensionDifferences(
 const TargetInfo &TI, DiagnosticsEngine &Diags) {
   // Extensions and equivalent feature pairs.
   static const llvm::StringMap FeatureExtensionMap = {
-  {"cl_khr_fp64", "__opencl_c_fp64"}};
+  {"cl_khr_fp64", "__opencl_c_fp64"},
+  {"cl_khr_3d_image_writes", "__opencl_c_3d_image_writes"}};
 
   auto OpenCLFeaturesMap = TI.getSupportedOpenCLOpts();
 

diff  --git a/clang/lib/Basic/Targets/AMDGPU.h 
b/clang/lib/Basic/Targets/AMDGPU.h
index 244a6e044690..2e580ecf2425 100644
--- a/clang/lib/Basic/Targets/AMDGPU.h
+++ b/clang/lib/Basic/Targets/AMDGPU.h
@@ -310,9 +310,12 @@ class LLVM_LIBRARY_VISIBILITY AMDGPUTargetInfo final : 
public TargetInfo {
   Opts["cl_khr_mipmap_image"] = true;
   Opts["cl_khr_mipmap_image_writes"] = true;
   Opts["cl_khr_subgroups"] = true;
-  Opts["cl_khr_3d_image_writes"] = true;
   Opts["cl_amd_media_ops"] = true;
   Opts["cl_amd_media_ops2"] = true;
+
+  Opts["__opencl_c_images"] = true;
+  Opts["__opencl_c_3d_image_writes"] = true;
+  Opts["cl_khr_3d_image_writes"] = true;
 }
   }
 

diff  --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index 058c22936dbe..173f61aeb95a 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/lib/Sema/SemaType.cpp
@@ -1525,18 +1525,20 @@ static QualType 
ConvertDeclSpecToType(TypeProcessingState &state) {
 break;
   case DeclSpec::TST_float:   Result = Context.FloatTy; break;
   case DeclSpec::TST_double:
+if (DS.getTypeSpecWidth() == TypeSpecifierWidth::Long)
+  Result = Context.LongDoubleTy;
+else
+  Result = Context.DoubleTy;
 if (S.getLangOpts().OpenCL) {
   if (!S.getOpenCLOptions().isSupported("cl_khr_fp64", S.getLangOpts()))
-S.Diag(DS.getTypeSpecTypeLoc(),
-   diag::err_opencl_double_requires_extension)
-<< (S.getLangOpts().OpenCLVersion >= 300);
+S.Diag(DS.getTypeSpecTypeLoc(), diag::err_opencl_requires_extension)
+<< 0 << Result
+<< (S.getLangOpts().OpenCLVersion == 300
+? "cl_khr_fp64 and __opencl_c_fp64"
+: "cl_khr_fp64");
   else if (!S.getOpenCLOptions().isAvailableOption("cl_khr_fp64", 
S.getLangOpts()))
 S.Diag(DS.getTypeSpecTypeLoc(), 
diag::ext_opencl_double_without_pragma);
 }
-if (DS.getTypeSpecWidth() == TypeSpecifierWidth::Long)
-  Result = Context.LongDoubleTy;
-else
-  

[clang] d1e4b25 - [OpenCL] Add support of __opencl_c_pipes feature macro.

2021-07-29 Thread Anton Zabaznov via cfe-commits

Author: Anton Zabaznov
Date: 2021-07-30T05:27:55+03:00
New Revision: d1e4b25756730576996457ba7324e9bf210e3693

URL: 
https://github.com/llvm/llvm-project/commit/d1e4b25756730576996457ba7324e9bf210e3693
DIFF: 
https://github.com/llvm/llvm-project/commit/d1e4b25756730576996457ba7324e9bf210e3693.diff

LOG: [OpenCL] Add support of __opencl_c_pipes feature macro.

'pipe' keyword is introduced in OpenCL C 2.0: so do checks for OpenCL C version 
while
parsing and then later on check for language options to construct actual pipe. 
This feature
requires support of __opencl_c_generic_address_space, so diagnostics for that 
is provided as well.

Reviewed By: Anastasia

Differential Revision: https://reviews.llvm.org/D106748

Added: 


Modified: 
clang/include/clang/Basic/LangOptions.def
clang/lib/Basic/OpenCLOptions.cpp
clang/lib/Basic/TargetInfo.cpp
clang/lib/Frontend/CompilerInvocation.cpp
clang/lib/Parse/ParseDecl.cpp
clang/lib/Sema/Sema.cpp
clang/test/CodeGenOpenCL/address-spaces-mangling.cl
clang/test/CodeGenOpenCL/address-spaces.cl
clang/test/CodeGenOpenCL/pipe_builtin.cl
clang/test/CodeGenOpenCL/pipe_types.cl
clang/test/CodeGenOpenCL/pipe_types_mangling.cl
clang/test/Misc/opencl-c-3.0.incorrect_options.cl
clang/test/SemaOpenCL/invalid-pipes-cl1.2.cl
clang/test/SemaOpenCL/invalid-pipes-cl2.0.cl
clang/test/SemaOpenCL/storageclass.cl

Removed: 




diff  --git a/clang/include/clang/Basic/LangOptions.def 
b/clang/include/clang/Basic/LangOptions.def
index 5c3d534c9b11..61a4dbdf856a 100644
--- a/clang/include/clang/Basic/LangOptions.def
+++ b/clang/include/clang/Basic/LangOptions.def
@@ -224,7 +224,7 @@ LANGOPT(OpenCLVersion , 32, 0, "OpenCL C version")
 LANGOPT(OpenCLCPlusPlus   , 1, 0, "C++ for OpenCL")
 LANGOPT(OpenCLCPlusPlusVersion , 32, 0, "C++ for OpenCL version")
 LANGOPT(OpenCLGenericAddressSpace, 1, 0, "OpenCL generic keyword")
-LANGOPT(OpenCLPipe   , 1, 0, "OpenCL pipe keyword")
+LANGOPT(OpenCLPipes  , 1, 0, "OpenCL pipes language constructs and 
built-ins")
 LANGOPT(NativeHalfType, 1, 0, "Native half type support")
 LANGOPT(NativeHalfArgsAndReturns, 1, 0, "Native half args and returns")
 LANGOPT(HalfArgsAndReturns, 1, 0, "half args and returns")

diff  --git a/clang/lib/Basic/OpenCLOptions.cpp 
b/clang/lib/Basic/OpenCLOptions.cpp
index f4f474fade4d..b7408f39bdab 100644
--- a/clang/lib/Basic/OpenCLOptions.cpp
+++ b/clang/lib/Basic/OpenCLOptions.cpp
@@ -112,7 +112,8 @@ bool OpenCLOptions::diagnoseUnsupportedFeatureDependencies(
   // supported.
   static const llvm::StringMap DependentFeaturesMap = {
   {"__opencl_c_read_write_images", "__opencl_c_images"},
-  {"__opencl_c_3d_image_writes", "__opencl_c_images"}};
+  {"__opencl_c_3d_image_writes", "__opencl_c_images"},
+  {"__opencl_c_pipes", "__opencl_c_generic_address_space"}};
 
   auto OpenCLFeaturesMap = TI.getSupportedOpenCLOpts();
 

diff  --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index b647a2fb8a67..5f8e04c2bd6c 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -400,14 +400,18 @@ void TargetInfo::adjust(DiagnosticsEngine &Diags, 
LangOptions &Opts) {
 // OpenCL C v3.0 s6.7.5 - The generic address space requires support for
 // OpenCL C 2.0 or OpenCL C 3.0 with the __opencl_c_generic_address_space
 // feature
-// FIXME: OpenCLGenericAddressSpace is also defined in setLangDefaults()
+// OpenCL C v3.0 s6.2.1 - OpenCL pipes require support of OpenCL C 2.0
+// or later and __opencl_c_pipes feature
+// FIXME: These language options are also defined in setLangDefaults()
 // for OpenCL C 2.0 but with no access to target capabilities. Target
-// should be immutable once created and thus this language option needs
+// should be immutable once created and thus these language options need
 // to be defined only once.
-if (Opts.OpenCLVersion >= 300) {
+if (Opts.OpenCLVersion == 300) {
   const auto &OpenCLFeaturesMap = getSupportedOpenCLOpts();
   Opts.OpenCLGenericAddressSpace = hasFeatureEnabled(
   OpenCLFeaturesMap, "__opencl_c_generic_address_space");
+  Opts.OpenCLPipes =
+  hasFeatureEnabled(OpenCLFeaturesMap, "__opencl_c_pipes");
 }
   }
 

diff  --git a/clang/lib/Frontend/CompilerInvocation.cpp 
b/clang/lib/Frontend/CompilerInvocation.cpp
index 63436b7aebe1..02f08c69ca7a 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -3173,7 +3173,7 @@ void CompilerInvocation::setLangDefaults(LangOptions 
&Opts, InputKind IK,
 Opts.ZVector = 0;
 Opts.setDefaultFPContractMode(LangOptions::FPM_On);
 Opts.OpenCLCPlusPlus = Opts.CPlusPlus;
-Opts.OpenCLPipe = Opts.OpenCLCPlusPlus || Opts.OpenCLVersion == 200;
+Opts.OpenCLPipes = Opts.OpenCLCPlusPlus || Op

[clang] da6626d - Revert "[OpenCL] Add support of __opencl_c_pipes feature macro."

2021-07-29 Thread Anton Zabaznov via cfe-commits

Author: Anton Zabaznov
Date: 2021-07-30T06:34:29+03:00
New Revision: da6626d12624675c46a73e8545fecc572695efeb

URL: 
https://github.com/llvm/llvm-project/commit/da6626d12624675c46a73e8545fecc572695efeb
DIFF: 
https://github.com/llvm/llvm-project/commit/da6626d12624675c46a73e8545fecc572695efeb.diff

LOG: Revert "[OpenCL] Add support of __opencl_c_pipes feature macro."

This reverts commit d1e4b25756730576996457ba7324e9bf210e3693.

Added: 


Modified: 
clang/include/clang/Basic/LangOptions.def
clang/lib/Basic/OpenCLOptions.cpp
clang/lib/Basic/TargetInfo.cpp
clang/lib/Frontend/CompilerInvocation.cpp
clang/lib/Parse/ParseDecl.cpp
clang/lib/Sema/Sema.cpp
clang/test/CodeGenOpenCL/address-spaces-mangling.cl
clang/test/CodeGenOpenCL/address-spaces.cl
clang/test/CodeGenOpenCL/pipe_builtin.cl
clang/test/CodeGenOpenCL/pipe_types.cl
clang/test/CodeGenOpenCL/pipe_types_mangling.cl
clang/test/Misc/opencl-c-3.0.incorrect_options.cl
clang/test/SemaOpenCL/invalid-pipes-cl1.2.cl
clang/test/SemaOpenCL/invalid-pipes-cl2.0.cl
clang/test/SemaOpenCL/storageclass.cl

Removed: 




diff  --git a/clang/include/clang/Basic/LangOptions.def 
b/clang/include/clang/Basic/LangOptions.def
index 61a4dbdf856a..5c3d534c9b11 100644
--- a/clang/include/clang/Basic/LangOptions.def
+++ b/clang/include/clang/Basic/LangOptions.def
@@ -224,7 +224,7 @@ LANGOPT(OpenCLVersion , 32, 0, "OpenCL C version")
 LANGOPT(OpenCLCPlusPlus   , 1, 0, "C++ for OpenCL")
 LANGOPT(OpenCLCPlusPlusVersion , 32, 0, "C++ for OpenCL version")
 LANGOPT(OpenCLGenericAddressSpace, 1, 0, "OpenCL generic keyword")
-LANGOPT(OpenCLPipes  , 1, 0, "OpenCL pipes language constructs and 
built-ins")
+LANGOPT(OpenCLPipe   , 1, 0, "OpenCL pipe keyword")
 LANGOPT(NativeHalfType, 1, 0, "Native half type support")
 LANGOPT(NativeHalfArgsAndReturns, 1, 0, "Native half args and returns")
 LANGOPT(HalfArgsAndReturns, 1, 0, "half args and returns")

diff  --git a/clang/lib/Basic/OpenCLOptions.cpp 
b/clang/lib/Basic/OpenCLOptions.cpp
index b7408f39bdab..f4f474fade4d 100644
--- a/clang/lib/Basic/OpenCLOptions.cpp
+++ b/clang/lib/Basic/OpenCLOptions.cpp
@@ -112,8 +112,7 @@ bool OpenCLOptions::diagnoseUnsupportedFeatureDependencies(
   // supported.
   static const llvm::StringMap DependentFeaturesMap = {
   {"__opencl_c_read_write_images", "__opencl_c_images"},
-  {"__opencl_c_3d_image_writes", "__opencl_c_images"},
-  {"__opencl_c_pipes", "__opencl_c_generic_address_space"}};
+  {"__opencl_c_3d_image_writes", "__opencl_c_images"}};
 
   auto OpenCLFeaturesMap = TI.getSupportedOpenCLOpts();
 

diff  --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 5f8e04c2bd6c..b647a2fb8a67 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -400,18 +400,14 @@ void TargetInfo::adjust(DiagnosticsEngine &Diags, 
LangOptions &Opts) {
 // OpenCL C v3.0 s6.7.5 - The generic address space requires support for
 // OpenCL C 2.0 or OpenCL C 3.0 with the __opencl_c_generic_address_space
 // feature
-// OpenCL C v3.0 s6.2.1 - OpenCL pipes require support of OpenCL C 2.0
-// or later and __opencl_c_pipes feature
-// FIXME: These language options are also defined in setLangDefaults()
+// FIXME: OpenCLGenericAddressSpace is also defined in setLangDefaults()
 // for OpenCL C 2.0 but with no access to target capabilities. Target
-// should be immutable once created and thus these language options need
+// should be immutable once created and thus this language option needs
 // to be defined only once.
-if (Opts.OpenCLVersion == 300) {
+if (Opts.OpenCLVersion >= 300) {
   const auto &OpenCLFeaturesMap = getSupportedOpenCLOpts();
   Opts.OpenCLGenericAddressSpace = hasFeatureEnabled(
   OpenCLFeaturesMap, "__opencl_c_generic_address_space");
-  Opts.OpenCLPipes =
-  hasFeatureEnabled(OpenCLFeaturesMap, "__opencl_c_pipes");
 }
   }
 

diff  --git a/clang/lib/Frontend/CompilerInvocation.cpp 
b/clang/lib/Frontend/CompilerInvocation.cpp
index 02f08c69ca7a..63436b7aebe1 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -3173,7 +3173,7 @@ void CompilerInvocation::setLangDefaults(LangOptions 
&Opts, InputKind IK,
 Opts.ZVector = 0;
 Opts.setDefaultFPContractMode(LangOptions::FPM_On);
 Opts.OpenCLCPlusPlus = Opts.CPlusPlus;
-Opts.OpenCLPipes = Opts.OpenCLCPlusPlus || Opts.OpenCLVersion == 200;
+Opts.OpenCLPipe = Opts.OpenCLCPlusPlus || Opts.OpenCLVersion == 200;
 Opts.OpenCLGenericAddressSpace =
 Opts.OpenCLCPlusPlus || Opts.OpenCLVersion == 200;
 

diff  --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index 939323517b4d..f4f5f461e3b6 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/

[clang] bee4bd7 - [OpenCL] Add support of language builtins for OpenCL C 3.0

2022-02-11 Thread Anton Zabaznov via cfe-commits

Author: Anton Zabaznov
Date: 2022-02-11T15:53:44+03:00
New Revision: bee4bd70f76952b2c6296feb46a087b497322376

URL: 
https://github.com/llvm/llvm-project/commit/bee4bd70f76952b2c6296feb46a087b497322376
DIFF: 
https://github.com/llvm/llvm-project/commit/bee4bd70f76952b2c6296feb46a087b497322376.diff

LOG: [OpenCL] Add support of language builtins for OpenCL C 3.0

OpenCL C 3.0 introduces optionality to some builtins, in particularly
to those which are conditionally supported with pipe, device enqueue
and generic address space features.

The idea is to conditionally support such builtins depending on the language 
options
being set for a certain feature. This allows users to define functions with 
names
of those optional builtins in OpenCL (as such names are not reserved).

Reviewed By: Anastasia

Differential Revision: https://reviews.llvm.org/D118605

Added: 


Modified: 
clang/include/clang/Basic/Builtins.def
clang/include/clang/Basic/Builtins.h
clang/lib/Basic/Builtins.cpp
clang/test/CodeGenOpenCL/cl20-device-side-enqueue.cl
clang/test/CodeGenOpenCL/pipe_types.cl
clang/test/CodeGenOpenCL/to_addr_builtin.cl
clang/test/SemaOpenCL/cl20-device-side-enqueue.cl
clang/test/SemaOpenCL/clang-builtin-version.cl
clang/test/SemaOpenCL/to_addr_builtin.cl

Removed: 




diff  --git a/clang/include/clang/Basic/Builtins.def 
b/clang/include/clang/Basic/Builtins.def
index 66c20e1c691de..62e82cd36321d 100644
--- a/clang/include/clang/Basic/Builtins.def
+++ b/clang/include/clang/Basic/Builtins.def
@@ -1627,50 +1627,50 @@ LANGBUILTIN(__builtin_coro_suspend, "cIb", "n", 
COR_LANG)
 
 // OpenCL v2.0 s6.13.16, s9.17.3.5 - Pipe functions.
 // We need the generic prototype, since the packet type could be anything.
-LANGBUILTIN(read_pipe, "i.", "tn", OCLC20_LANG)
-LANGBUILTIN(write_pipe, "i.", "tn", OCLC20_LANG)
+LANGBUILTIN(read_pipe, "i.", "tn", OCL_PIPE)
+LANGBUILTIN(write_pipe, "i.", "tn", OCL_PIPE)
 
-LANGBUILTIN(reserve_read_pipe, "i.", "tn", OCLC20_LANG)
-LANGBUILTIN(reserve_write_pipe, "i.", "tn", OCLC20_LANG)
+LANGBUILTIN(reserve_read_pipe, "i.", "tn", OCL_PIPE)
+LANGBUILTIN(reserve_write_pipe, "i.", "tn", OCL_PIPE)
 
-LANGBUILTIN(commit_write_pipe, "v.", "tn", OCLC20_LANG)
-LANGBUILTIN(commit_read_pipe, "v.", "tn", OCLC20_LANG)
+LANGBUILTIN(commit_write_pipe, "v.", "tn", OCL_PIPE)
+LANGBUILTIN(commit_read_pipe, "v.", "tn", OCL_PIPE)
 
-LANGBUILTIN(sub_group_reserve_read_pipe, "i.", "tn", OCLC20_LANG)
-LANGBUILTIN(sub_group_reserve_write_pipe, "i.", "tn", OCLC20_LANG)
+LANGBUILTIN(sub_group_reserve_read_pipe, "i.", "tn", OCL_PIPE)
+LANGBUILTIN(sub_group_reserve_write_pipe, "i.", "tn", OCL_PIPE)
 
-LANGBUILTIN(sub_group_commit_read_pipe, "v.", "tn", OCLC20_LANG)
-LANGBUILTIN(sub_group_commit_write_pipe, "v.", "tn", OCLC20_LANG)
+LANGBUILTIN(sub_group_commit_read_pipe, "v.", "tn", OCL_PIPE)
+LANGBUILTIN(sub_group_commit_write_pipe, "v.", "tn", OCL_PIPE)
 
-LANGBUILTIN(work_group_reserve_read_pipe, "i.", "tn", OCLC20_LANG)
-LANGBUILTIN(work_group_reserve_write_pipe, "i.", "tn", OCLC20_LANG)
+LANGBUILTIN(work_group_reserve_read_pipe, "i.", "tn", OCL_PIPE)
+LANGBUILTIN(work_group_reserve_write_pipe, "i.", "tn", OCL_PIPE)
 
-LANGBUILTIN(work_group_commit_read_pipe, "v.", "tn", OCLC20_LANG)
-LANGBUILTIN(work_group_commit_write_pipe, "v.", "tn", OCLC20_LANG)
+LANGBUILTIN(work_group_commit_read_pipe, "v.", "tn", OCL_PIPE)
+LANGBUILTIN(work_group_commit_write_pipe, "v.", "tn", OCL_PIPE)
 
-LANGBUILTIN(get_pipe_num_packets, "Ui.", "tn", OCLC20_LANG)
-LANGBUILTIN(get_pipe_max_packets, "Ui.", "tn", OCLC20_LANG)
+LANGBUILTIN(get_pipe_num_packets, "Ui.", "tn", OCL_PIPE)
+LANGBUILTIN(get_pipe_max_packets, "Ui.", "tn", OCL_PIPE)
 
 // OpenCL v2.0 s6.13.17 - Enqueue kernel functions.
 // Custom builtin check allows to perform special check of passed block 
arguments.
-LANGBUILTIN(enqueue_kernel, "i.", "tn", OCLC20_LANG)
-LANGBUILTIN(get_kernel_work_group_size, "Ui.", "tn", OCLC20_LANG)
-LANGBUILTIN(get_kernel_preferred_work_group_size_multiple, "Ui.", "tn", 
OCLC20_LANG)
-LANGBUILTIN(get_kernel_max_sub_group_size_for_ndrange, "Ui.", "tn", 
OCLC20_LANG)
-LANGBUILTIN(get_kernel_sub_group_count_for_ndrange, "Ui.", "tn", OCLC20_LANG)
+LANGBUILTIN(enqueue_kernel, "i.", "tn", OCL_DSE)
+LANGBUILTIN(get_kernel_work_group_size, "Ui.", "tn", OCL_DSE)
+LANGBUILTIN(get_kernel_preferred_work_group_size_multiple, "Ui.", "tn", 
OCL_DSE)
+LANGBUILTIN(get_kernel_max_sub_group_size_for_ndrange, "Ui.", "tn", OCL_DSE)
+LANGBUILTIN(get_kernel_sub_group_count_for_ndrange, "Ui.", "tn", OCL_DSE)
 
 // OpenCL v2.0 s6.13.9 - Address space qualifier functions.
 // FIXME: Pointer parameters of OpenCL builtins should have their address space
 // requirement defined.
-LANGBUILTIN(to_global, "v*v*", "tn", OCLC20_LANG)
-LANGBUILTIN(to_local, "v*v*", "tn", OCLC20_LANG)
-LANGBUILTIN(to_private, "v*v*", "tn", OCLC20_LANG)
+LANGBUILTIN(to_global, "v*v*

[clang] bfb1a33 - [OpenCL] Adjust diagnostic for subgroup support.

2022-02-11 Thread Anton Zabaznov via cfe-commits

Author: Anton Zabaznov
Date: 2022-02-11T17:40:24+03:00
New Revision: bfb1a33bec7c88170b0809b8a7c9cb860e7cc19b

URL: 
https://github.com/llvm/llvm-project/commit/bfb1a33bec7c88170b0809b8a7c9cb860e7cc19b
DIFF: 
https://github.com/llvm/llvm-project/commit/bfb1a33bec7c88170b0809b8a7c9cb860e7cc19b.diff

LOG: [OpenCL] Adjust diagnostic for subgroup support.

OpenCL C 3.0 __opencl_c_subgroups feature is slightly different
then other equivalent features and extensions (fp64 and 3d image writes):
OpenCL C 3.0 device can support the extension but not the feature.
cl_khr_subgroups requires subgroup independent forward progress.

This patch adjusts the check which is used when translating language
builtins to check either the extension or feature is supported.

Reviewed By: Anastasia

Differential Revision: https://reviews.llvm.org/D118999

Added: 


Modified: 
clang/lib/Sema/SemaChecking.cpp
clang/test/SemaOpenCL/cl20-device-side-enqueue.cl

Removed: 




diff  --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index fe704792ce0b0..575181a6b61cb 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -1042,9 +1042,15 @@ static bool checkOpenCLBlockArgs(Sema &S, Expr 
*BlockArg) {
 }
 
 static bool checkOpenCLSubgroupExt(Sema &S, CallExpr *Call) {
-  if (!S.getOpenCLOptions().isSupported("cl_khr_subgroups", S.getLangOpts())) {
+  // OpenCL device can support extension but not the feature as extension
+  // requires subgroup independent forward progress, but subgroup independent
+  // forward progress is optional in OpenCL C 3.0 __opencl_c_subgroups feature.
+  if (!S.getOpenCLOptions().isSupported("cl_khr_subgroups", S.getLangOpts()) &&
+  !S.getOpenCLOptions().isSupported("__opencl_c_subgroups",
+S.getLangOpts())) {
 S.Diag(Call->getBeginLoc(), diag::err_opencl_requires_extension)
-<< 1 << Call->getDirectCallee() << "cl_khr_subgroups";
+<< 1 << Call->getDirectCallee()
+<< "cl_khr_subgroups or __opencl_c_subgroups";
 return true;
   }
   return false;

diff  --git a/clang/test/SemaOpenCL/cl20-device-side-enqueue.cl 
b/clang/test/SemaOpenCL/cl20-device-side-enqueue.cl
index 9c375b2603ac1..344297ebbe0ca 100644
--- a/clang/test/SemaOpenCL/cl20-device-side-enqueue.cl
+++ b/clang/test/SemaOpenCL/cl20-device-side-enqueue.cl
@@ -4,7 +4,7 @@
 // RUN: %clang_cc1 %s -cl-std=CL2.0 -triple "spir64-unknown-unknown" -verify 
-pedantic -fsyntax-only -Wconversion -DWCONV -DQUALS=
 // RUN: %clang_cc1 %s -cl-std=CL2.0 -triple "spir64-unknown-unknown" -verify 
-pedantic -fsyntax-only -Wconversion -DWCONV -DQUALS="const volatile"
 // RUN: %clang_cc1 %s -cl-std=CL3.0 -triple "spir-unknown-unknown" -verify 
-pedantic -fsyntax-only -DB32 -DQUALS=
-// RUN: %clang_cc1 %s -cl-std=CL3.0 -triple "spir-unknown-unknown" -verify 
-pedantic -fsyntax-only -DB32 -DQUALS= -cl-ext=-cl_khr_subgroups
+// RUN: %clang_cc1 %s -cl-std=CL3.0 -triple "spir-unknown-unknown" -verify 
-pedantic -fsyntax-only -DB32 -DQUALS= 
-cl-ext=-cl_khr_subgroups,-__opencl_c_subgroups
 // RUN: %clang_cc1 %s -cl-std=CL3.0 -triple "spir-unknown-unknown" -verify 
-pedantic -fsyntax-only -DB32 -DQUALS="const volatile"
 // RUN: %clang_cc1 %s -cl-std=CL3.0 -triple "spir64-unknown-unknown" -verify 
-pedantic -fsyntax-only -Wconversion -DWCONV -DQUALS=
 // RUN: %clang_cc1 %s -cl-std=CL3.0 -triple "spir64-unknown-unknown" -verify 
-pedantic -fsyntax-only -Wconversion -DWCONV -DQUALS="const volatile"
@@ -241,12 +241,12 @@ kernel void bar(global unsigned int *buf)
 kernel void foo1(global unsigned int *buf)
 {
   ndrange_t n;
-  buf[0] = get_kernel_max_sub_group_size_for_ndrange(n, ^(){}); // 
expected-error {{use of declaration 'get_kernel_max_sub_group_size_for_ndrange' 
requires cl_khr_subgroups support}}
+  buf[0] = get_kernel_max_sub_group_size_for_ndrange(n, ^(){}); // 
expected-error {{use of declaration 'get_kernel_max_sub_group_size_for_ndrange' 
requires cl_khr_subgroups or __opencl_c_subgroups support}}
 }
 
 kernel void bar1(global unsigned int *buf)
 {
   ndrange_t n;
-  buf[0] = get_kernel_sub_group_count_for_ndrange(n, ^(){}); // expected-error 
{{use of declaration 'get_kernel_sub_group_count_for_ndrange' requires 
cl_khr_subgroups support}}
+  buf[0] = get_kernel_sub_group_count_for_ndrange(n, ^(){}); // expected-error 
{{use of declaration 'get_kernel_sub_group_count_for_ndrange' requires 
cl_khr_subgroups or __opencl_c_subgroups support}}
 }
 #endif // ifdef cl_khr_subgroups



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 8269057 - [OpenCL] Add support of OpenCL C 3.0 __opencl_c_fp64

2021-05-21 Thread Anton Zabaznov via cfe-commits

Author: Anton Zabaznov
Date: 2021-05-21T15:01:19+03:00
New Revision: 826905787ae4c8540bb8a2384fac59c606c7eaff

URL: 
https://github.com/llvm/llvm-project/commit/826905787ae4c8540bb8a2384fac59c606c7eaff
DIFF: 
https://github.com/llvm/llvm-project/commit/826905787ae4c8540bb8a2384fac59c606c7eaff.diff

LOG: [OpenCL] Add support of OpenCL C 3.0 __opencl_c_fp64

There already exists cl_khr_fp64 extension. So OpenCL C 3.0
and higher should use the feature, earlier versions still
use the extension. OpenCL C 3.0 API spec states that extension
will be not described in the option string if corresponding
optional functionality is not supported (see 4.2. Querying Devices).
Due to that fact the usage of features for OpenCL C 3.0 must
be as follows:

```
$ clang -Xclang -cl-ext=+cl_khr_fp64,+__opencl_c_fp64 ...

$ clang -Xclang -cl-ext=-cl_khr_fp64,-__opencl_c_fp64 ...
```

e.g. the feature and the equivalent extension (if exists)
must be set to the same values

Reviewed By: Anastasia

Differential Revision: https://reviews.llvm.org/D96524

Added: 
clang/test/Misc/opencl-c-3.0.incorrect_options.cl
clang/test/SemaOpenCL/fp64-fp16-options.cl

Modified: 
clang/docs/OpenCLSupport.rst
clang/include/clang/Basic/DiagnosticCommonKinds.td
clang/include/clang/Basic/DiagnosticSemaKinds.td
clang/lib/Basic/Targets.cpp
clang/lib/Basic/Targets/AMDGPU.h
clang/lib/Basic/Targets/NVPTX.h
clang/lib/Frontend/CompilerInstance.cpp
clang/lib/Sema/SemaExpr.cpp
clang/lib/Sema/SemaType.cpp
clang/test/CodeGenOpenCL/printf.cl

Removed: 
clang/test/SemaOpenCL/extensions.cl



diff  --git a/clang/docs/OpenCLSupport.rst b/clang/docs/OpenCLSupport.rst
index fa719c8bdf9f5..dbfb67f90ae14 100644
--- a/clang/docs/OpenCLSupport.rst
+++ b/clang/docs/OpenCLSupport.rst
@@ -339,7 +339,24 @@ Missing features or with limited support
 
 .. _opencl_300:
 
-OpenCL 3.0 Implementation Status
+OpenCL C 3.0 Usage
+
+
+OpenCL C 3.0 language standard makes most OpenCL C 2.0 features optional. 
Optional
+functionality in OpenCL C 3.0 is indicated with the presence of feature-test 
macros
+(list of feature-test macros is `here 
`_).
+Command-line flag :ref:`-cl-ext ` can be used to override 
features supported by a target.
+
+For cases when there is an associated extension for a specific feature (fp64 
and 3d image writes)
+user should specify both (extension and feature) in command-line flag:
+
+   .. code-block:: console
+
+ $ clang -cc1 -cl-std=CL3.0 -cl-ext=+cl_khr_fp64,+__opencl_c_fp64 ...
+ $ clang -cc1 -cl-std=CL3.0 -cl-ext=-cl_khr_fp64,-__opencl_c_fp64 ...
+
+
+OpenCL C 3.0 Implementation Status
 
 
 The following table provides an overview of features in OpenCL C 3.0 and their

diff  --git a/clang/include/clang/Basic/DiagnosticCommonKinds.td 
b/clang/include/clang/Basic/DiagnosticCommonKinds.td
index 06c2647149dfa..4dab3a3b39ac3 100644
--- a/clang/include/clang/Basic/DiagnosticCommonKinds.td
+++ b/clang/include/clang/Basic/DiagnosticCommonKinds.td
@@ -364,4 +364,7 @@ def warn_poison_system_directories : Warning <
 def warn_opencl_unsupported_core_feature : Warning<
   "%0 is a core feature in %select{OpenCL C|C++ for OpenCL}1 version %2 but 
not supported on this target">,
   InGroup, DefaultIgnore;
+
+def err_opencl_extension_and_feature_
diff ers : Error<
+  "options %0 and %1 are set to 
diff erent values">;
 }

diff  --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index fff6b62f3b7fb..5d0f5dcbfc359 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -118,7 +118,8 @@ def warn_float_underflow : Warning<
   "magnitude of floating-point constant too small for type %0; minimum is %1">,
   InGroup;
 def warn_double_const_requires_fp64 : Warning<
-  "double precision constant requires cl_khr_fp64, casting to single 
precision">;
+  "double precision constant requires %select{cl_khr_fp64|cl_khr_fp64 and 
__opencl_c_fp64}0, "
+  "casting to single precision">;
 def err_half_const_requires_fp16 : Error<
   "half precision constant requires cl_khr_fp16">;
 
@@ -10027,6 +10028,8 @@ def err_opencl_requires_extension : Error<
 def ext_opencl_double_without_pragma : Extension<
   "Clang permits use of type 'double' regardless pragma if 'cl_khr_fp64' is"
   " supported">;
+def err_opencl_double_requires_extension :  Error<
+"use of type 'double' requires %select{cl_khr_fp64|cl_khr_fp64 and 
__opencl_c_fp64}0 support">;
 def warn_opencl_generic_address_space_arg : Warning<
   "passing non-generic address space pointer to %0"
   " may cause dynamic conversion affecting performance">,

diff  --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index 8

[clang] e123cd6 - [OpenCL] Refactor of targets OpenCL option settings

2021-01-25 Thread Anton Zabaznov via cfe-commits

Author: Anton Zabaznov
Date: 2021-01-25T19:50:23+03:00
New Revision: e123cd674c0209c80bc6225bb9e3a2d1d2ee418b

URL: 
https://github.com/llvm/llvm-project/commit/e123cd674c0209c80bc6225bb9e3a2d1d2ee418b
DIFF: 
https://github.com/llvm/llvm-project/commit/e123cd674c0209c80bc6225bb9e3a2d1d2ee418b.diff

LOG: [OpenCL] Refactor of targets OpenCL option settings

Currently, there is some refactoring needed in existing interface of OpenCL 
option
settings to support OpenCL C 3.0. The problem is that OpenCL extensions and 
features
are not only determined by the target platform but also by the OpenCL version.
Also, there are core extensions/features which are supported unconditionally in
specific OpenCL C version. In fact, these rules are not being followed for all 
targets.
For example, there are some targets (as nvptx and r600) which don't support
OpenCL C 2.0 core features (nvptx.languageOptsOpenCL.cl, 
r600.languageOptsOpenCL.cl).

After the change there will be explicit differentiation between optional core 
and core
OpenCL features which allows giving diagnostics if target doesn't support any of
necessary core features for specific OpenCL version.

This patch also eliminates `OpenCLOptions` instance duplication from 
`TargetOptions`.
`OpenCLOptions` instance should take place in `Sema` as it's going to be 
modified
during parsing. Removing this duplication will also allow to generally simplify
`OpenCLOptions` class for parsing purposes.

Reviewed By: Anastasia

Differential Revision: https://reviews.llvm.org/D92277

Added: 
clang/lib/Basic/OpenCLOptions.cpp

Modified: 
clang/include/clang/Basic/OpenCLExtensions.def
clang/include/clang/Basic/OpenCLOptions.h
clang/include/clang/Basic/TargetInfo.h
clang/include/clang/Basic/TargetOptions.h
clang/lib/Basic/CMakeLists.txt
clang/lib/Basic/Targets.cpp
clang/lib/Basic/Targets/AMDGPU.h
clang/lib/Basic/Targets/NVPTX.h
clang/lib/Basic/Targets/SPIR.h
clang/lib/Basic/Targets/X86.h
clang/lib/Frontend/InitPreprocessor.cpp
clang/lib/Parse/ParsePragma.cpp
clang/lib/Sema/Sema.cpp
clang/lib/Serialization/ASTReader.cpp
clang/lib/Serialization/ASTWriter.cpp
clang/test/Misc/nvptx.languageOptsOpenCL.cl
clang/test/Misc/r600.languageOptsOpenCL.cl

Removed: 




diff  --git a/clang/include/clang/Basic/OpenCLExtensions.def 
b/clang/include/clang/Basic/OpenCLExtensions.def
index 9353be1753b0..801916c3ab94 100644
--- a/clang/include/clang/Basic/OpenCLExtensions.def
+++ b/clang/include/clang/Basic/OpenCLExtensions.def
@@ -10,19 +10,25 @@
 //
 
//===--===//
 
-// Macro OPENCLEXT or OPENCLEXT_INTERNAL can be defined to enumerate the
+// Macro OPENCLEXTNAME or OPENCL_GENERIC_EXTENSION can be defined to enumerate 
all
 // OpenCL extensions listed in this file.
 //
-// If the extensions are to be enumerated without the supported OpenCL version,
-// define OPENCLEXT(ext) where ext is the name of the extension.
-//
-// If the extensions are to be enumerated with supported OpenCL version,
-// define OPENCLEXT_INTERNAL(ext, avail, core) where
+// If extensions are to be enumerated with information about whether
+// an extension is core or optional core and minimum OpenCL version
+// when an extension becomes available,
+// define OPENCL_GENERIC_EXTENSION(ext, avail, core, opt) where
 //   ext - name of the extension or optional core feature.
 //   avail - minimum OpenCL version supporting it.
-//   core - minimum OpenCL version when the extension becomes optional core
-//  feature or core feature. ~0U indicates not a core feature or an
-//  optional core feature.
+//   core - OpenCL versions mask when the extension becomes core feature.
+//  0U indicates not a core feature.
+//   opt - OpenCL versions mask when the extension becomes optional core
+// feature. 0U indicates not a optional core feature.
+//
+// If extensions are to be enumerated without any information,
+// define OPENCLEXTNAME(ext) where ext is the name of the extension.
+//
+// Difference between optional core feature and core feature is that the 
+// later is unconditionally supported in specific OpenCL version.
 //
 // As per The OpenCL Extension Specification, Section 1.2, in this file, an
 // extension is defined if and only it either:
@@ -32,63 +38,72 @@
 // For such an extension, a preprocessor #define that matches the extension
 // name must be created and a #pragma is required if and only if the
 // compilation flow is impacted, e.g. due to a 
diff erence of syntax or
-// semantics in the language compared to the core standard.
+// semantics in the language compared to the core standard. #pragma directive
+// has no effect for optional core and core features.
 
-#ifndef OPENCLEXT_INTERNAL
-#ifndef OPENCLEXT
-#pragma error "macro OPENCLEXT or OPENCLEXT_INTERNAL is required"

[clang] a5b627a - [OpenCL] Introduce new language options for OpenCL keywords.

2021-02-05 Thread Anton Zabaznov via cfe-commits

Author: Anton Zabaznov
Date: 2021-02-05T11:18:48+03:00
New Revision: a5b627aa4fe749f8df0a27fcb1f6fe3b59a21e09

URL: 
https://github.com/llvm/llvm-project/commit/a5b627aa4fe749f8df0a27fcb1f6fe3b59a21e09
DIFF: 
https://github.com/llvm/llvm-project/commit/a5b627aa4fe749f8df0a27fcb1f6fe3b59a21e09.diff

LOG: [OpenCL] Introduce new language options for OpenCL keywords.

OpenCL keywords 'pipe' and 'generic' are unconditionally
supported for OpenCL C 2.0 or in OpenCL C++ mode. In OpenCL C 3.0
these keywords are available if corresponding optional core
feature is supported.

Reviewed By: Anastasia, svenvh

Differential Revision: https://reviews.llvm.org/D95778

Added: 


Modified: 
clang/include/clang/Basic/LangOptions.def
clang/lib/Frontend/CompilerInvocation.cpp
clang/lib/Parse/ParseDecl.cpp
clang/lib/Sema/SemaType.cpp

Removed: 




diff  --git a/clang/include/clang/Basic/LangOptions.def 
b/clang/include/clang/Basic/LangOptions.def
index c01f0cca9c9c..1a9f8048bc17 100644
--- a/clang/include/clang/Basic/LangOptions.def
+++ b/clang/include/clang/Basic/LangOptions.def
@@ -215,6 +215,8 @@ LANGOPT(OpenCL, 1, 0, "OpenCL")
 LANGOPT(OpenCLVersion , 32, 0, "OpenCL C version")
 LANGOPT(OpenCLCPlusPlus   , 1, 0, "C++ for OpenCL")
 LANGOPT(OpenCLCPlusPlusVersion , 32, 0, "C++ for OpenCL version")
+LANGOPT(OpenCLGenericAddressSpace, 1, 0, "OpenCL generic keyword")
+LANGOPT(OpenCLPipe   , 1, 0, "OpenCL pipe keyword")
 LANGOPT(NativeHalfType, 1, 0, "Native half type support")
 LANGOPT(NativeHalfArgsAndReturns, 1, 0, "Native half args and returns")
 LANGOPT(HalfArgsAndReturns, 1, 0, "half args and returns")

diff  --git a/clang/lib/Frontend/CompilerInvocation.cpp 
b/clang/lib/Frontend/CompilerInvocation.cpp
index ddc16faf26dd..0a12705a9261 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -2391,6 +2391,9 @@ void CompilerInvocation::setLangDefaults(LangOptions 
&Opts, InputKind IK,
 Opts.ZVector = 0;
 Opts.setDefaultFPContractMode(LangOptions::FPM_On);
 Opts.OpenCLCPlusPlus = Opts.CPlusPlus;
+Opts.OpenCLPipe = Opts.OpenCLCPlusPlus || Opts.OpenCLVersion == 200;
+Opts.OpenCLGenericAddressSpace =
+Opts.OpenCLCPlusPlus || Opts.OpenCLVersion == 200;
 
 // Include default header file for OpenCL.
 if (Opts.IncludeDefaultHeader) {

diff  --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index 55a0c6a082aa..3d5c984033fa 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/lib/Parse/ParseDecl.cpp
@@ -3896,8 +3896,8 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS,
 case tok::kw_pipe:
   if (!getLangOpts().OpenCL || (getLangOpts().OpenCLVersion < 200 &&
 !getLangOpts().OpenCLCPlusPlus)) {
-// OpenCL 2.0 defined this keyword. OpenCL 1.2 and earlier should
-// support the "pipe" word as identifier.
+// OpenCL 2.0 and later define this keyword. OpenCL 1.2 and earlier
+// should support the "pipe" word as identifier.
 Tok.getIdentifierInfo()->revertTokenIDToIdentifier();
 goto DoneWithDeclSpec;
   }
@@ -4017,8 +4017,7 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS,
 case tok::kw___generic:
   // generic address space is introduced only in OpenCL v2.0
   // see OpenCL C Spec v2.0 s6.5.5
-  if (Actions.getLangOpts().OpenCLVersion < 200 &&
-  !Actions.getLangOpts().OpenCLCPlusPlus) {
+  if (!Actions.getLangOpts().OpenCLGenericAddressSpace) {
 DiagID = diag::err_opencl_unknown_type_specifier;
 PrevSpec = Tok.getIdentifierInfo()->getNameStart();
 isInvalid = true;
@@ -5070,8 +5069,7 @@ bool Parser::isDeclarationSpecifier(bool 
DisambiguatingWithExpression) {
   default: return false;
 
   case tok::kw_pipe:
-return (getLangOpts().OpenCL && getLangOpts().OpenCLVersion >= 200) ||
-   getLangOpts().OpenCLCPlusPlus;
+return getLangOpts().OpenCLPipe;
 
   case tok::identifier:   // foo::bar
 // Unfortunate hack to support "Class.factoryMethod" notation.
@@ -5599,8 +5597,7 @@ static bool isPtrOperatorToken(tok::TokenKind Kind, const 
LangOptions &Lang,
   if (Kind == tok::star || Kind == tok::caret)
 return true;
 
-  if (Kind == tok::kw_pipe &&
-  ((Lang.OpenCL && Lang.OpenCLVersion >= 200) || Lang.OpenCLCPlusPlus))
+  if (Kind == tok::kw_pipe && Lang.OpenCLPipe)
 return true;
 
   if (!Lang.CPlusPlus)

diff  --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index e24eb266dd5f..0016c1aa541c 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/lib/Sema/SemaType.cpp
@@ -2060,10 +2060,9 @@ static QualType deduceOpenCLPointeeAddrSpace(Sema &S, 
QualType PointeeType) {
   !PointeeType->isSamplerT() &&
   !PointeeType.hasAddressSpace())
 PointeeType = S.getASTContext().getAddrSpaceQualType

[clang] d88c55a - [OpenCL] Add macro definitions of OpenCL C 3.0 features

2021-02-05 Thread Anton Zabaznov via cfe-commits

Author: Anton Zabaznov
Date: 2021-02-05T18:42:25+03:00
New Revision: d88c55ab95c9985e366b62569f2a50cf8ce5c469

URL: 
https://github.com/llvm/llvm-project/commit/d88c55ab95c9985e366b62569f2a50cf8ce5c469
DIFF: 
https://github.com/llvm/llvm-project/commit/d88c55ab95c9985e366b62569f2a50cf8ce5c469.diff

LOG: [OpenCL] Add macro definitions of OpenCL C 3.0 features

This patch adds possibility to define OpenCL C 3.0 feature macros
via command line option or target setting.

Reviewed By: Anastasia

Differential Revision: https://reviews.llvm.org/D95776

Added: 
clang/test/SemaOpenCL/features.cl

Modified: 
clang/include/clang/Basic/OpenCLExtensions.def
clang/lib/Basic/Targets.cpp
clang/lib/Headers/opencl-c-base.h
clang/test/Headers/opencl-c-header.cl

Removed: 




diff  --git a/clang/include/clang/Basic/OpenCLExtensions.def 
b/clang/include/clang/Basic/OpenCLExtensions.def
index 801916c3ab94..8e6f723a53a6 100644
--- a/clang/include/clang/Basic/OpenCLExtensions.def
+++ b/clang/include/clang/Basic/OpenCLExtensions.def
@@ -64,7 +64,7 @@ OPENCL_OPTIONALCOREFEATURE(cl_khr_fp64, 100, OCL_C_12P)
 OPENCL_EXTENSION(cl_khr_fp16, 100)
 OPENCL_EXTENSION(cl_khr_int64_base_atomics, 100)
 OPENCL_EXTENSION(cl_khr_int64_extended_atomics, 100)
-OPENCL_GENERIC_EXTENSION(cl_khr_3d_image_writes, 100, OCL_C_20, OCL_C_30)
+OPENCL_COREFEATURE(cl_khr_3d_image_writes, 100, OCL_C_20)
 
 // EMBEDDED_PROFILE
 OPENCL_EXTENSION(cles_khr_int64, 110)
@@ -99,6 +99,18 @@ OPENCL_EXTENSION(cl_intel_subgroups, 120)
 OPENCL_EXTENSION(cl_intel_subgroups_short, 120)
 OPENCL_EXTENSION(cl_intel_device_side_avc_motion_estimation, 120)
 
+// OpenCL C 3.0 features (6.2.1. Features)
+OPENCL_OPTIONALCOREFEATURE(__opencl_c_pipes, 300, OCL_C_30)
+OPENCL_OPTIONALCOREFEATURE(__opencl_c_generic_address_space, 300, OCL_C_30)
+OPENCL_OPTIONALCOREFEATURE(__opencl_c_atomic_order_acq_rel, 300, OCL_C_30)
+OPENCL_OPTIONALCOREFEATURE(__opencl_c_atomic_order_seq_cst, 300, OCL_C_30)
+OPENCL_OPTIONALCOREFEATURE(__opencl_c_subgroups, 300, OCL_C_30)
+OPENCL_OPTIONALCOREFEATURE(__opencl_c_3d_image_writes, 300, OCL_C_30)
+OPENCL_OPTIONALCOREFEATURE(__opencl_c_device_enqueue, 300, OCL_C_30)
+OPENCL_OPTIONALCOREFEATURE(__opencl_c_read_write_images, 300, OCL_C_30)
+OPENCL_OPTIONALCOREFEATURE(__opencl_c_program_scope_global_variables, 300, 
OCL_C_30)
+OPENCL_OPTIONALCOREFEATURE(__opencl_c_fp64, 300, OCL_C_30)
+OPENCL_OPTIONALCOREFEATURE(__opencl_c_images, 300, OCL_C_30)
 
 #undef OPENCL_OPTIONALCOREFEATURE
 #undef OPENCL_COREFEATURE

diff  --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index 90a67d03b7b2..da4d6d0e7612 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -720,7 +720,9 @@ TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
 /// and language version
 void TargetInfo::getOpenCLFeatureDefines(const LangOptions &Opts,
  MacroBuilder &Builder) const {
-
+  // FIXME: OpenCL options which affect language semantics/syntax
+  // should be moved into LangOptions, thus macro definitions of
+  // such options is better to be done in clang::InitializePreprocessor
   auto defineOpenCLExtMacro = [&](llvm::StringRef Name, unsigned AvailVer,
   unsigned CoreVersions,
   unsigned OptionalVersions) {
@@ -737,7 +739,6 @@ void TargetInfo::getOpenCLFeatureDefines(const LangOptions 
&Opts,
   defineOpenCLExtMacro(#Ext, Avail, Core, Opt);
 #include "clang/Basic/OpenCLExtensions.def"
 
-  // FIXME: OpenCL options which affect language semantics/syntax
-  // should be moved into LangOptions, thus macro definitions of
-  // such options is better to be done in clang::InitializePreprocessor
+  // Assume compiling for FULL profile
+  Builder.defineMacro("__opencl_c_int64");
 }

diff  --git a/clang/lib/Headers/opencl-c-base.h 
b/clang/lib/Headers/opencl-c-base.h
index e8dcd70377e5..fdd50324bd74 100644
--- a/clang/lib/Headers/opencl-c-base.h
+++ b/clang/lib/Headers/opencl-c-base.h
@@ -24,6 +24,21 @@
 #endif // defined(__SPIR__)
 #endif // (defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200)
 
+// Define feature macros for OpenCL C 2.0
+#if (defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ == 200)
+#define __opencl_c_pipes 1
+#define __opencl_c_generic_address_space 1
+#define __opencl_c_work_group_collective_functions 1
+#define __opencl_c_atomic_order_acq_rel 1
+#define __opencl_c_atomic_order_seq_cst 1
+#define __opencl_c_atomic_scope_device 1
+#define __opencl_c_atomic_scope_all_devices 1
+#define __opencl_c_device_enqueue 1
+#define __opencl_c_read_write_images 1
+#define __opencl_c_program_scope_global_variables 1
+#define __opencl_c_images 1
+#endif
+
 // built-in scalar data types:
 
 /**

diff  --git a/clang/test/Headers/opencl-c-header.cl 
b/clang/test/Headers/opencl-c-header.cl
index 13a3b62481ec..432c5e461d55 100644
--

[clang] e1a64aa - [OpenCL] Create VoidPtrTy with generic AS in C++ for OpenCL mode

2021-02-17 Thread Anton Zabaznov via cfe-commits

Author: Anton Zabaznov
Date: 2021-02-17T12:18:46+03:00
New Revision: e1a64aa66c332d16b3f0dae0426ee29eeb6bbba6

URL: 
https://github.com/llvm/llvm-project/commit/e1a64aa66c332d16b3f0dae0426ee29eeb6bbba6
DIFF: 
https://github.com/llvm/llvm-project/commit/e1a64aa66c332d16b3f0dae0426ee29eeb6bbba6.diff

LOG: [OpenCL] Create VoidPtrTy with generic AS in C++ for OpenCL mode

This change affects 'SemaOpenCLCXX/newdelete.cl' test,
thus the patch contains adjustments in types validation of
operators new and delete

Reviewed By: Anastasia

Differential Revision: https://reviews.llvm.org/D96178

Added: 
clang/test/CodeGenOpenCLCXX/addrspace-new-delete.cl

Modified: 
clang/lib/AST/ASTContext.cpp
clang/lib/Sema/SemaDeclCXX.cpp

Removed: 




diff  --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 80ec858ca0f0..02f9b214fe94 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -1445,7 +1445,7 @@ void ASTContext::InitBuiltinTypes(const TargetInfo 
&Target,
   ObjCSuperType = QualType();
 
   // void * type
-  if (LangOpts.OpenCLVersion >= 200) {
+  if (LangOpts.OpenCLGenericAddressSpace) {
 auto Q = VoidTy.getQualifiers();
 Q.setAddressSpace(LangAS::opencl_generic);
 VoidPtrTy = getPointerType(getCanonicalType(

diff  --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 8bfaa46162bc..bef7cb39fdff 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -15261,11 +15261,13 @@ CheckOperatorNewDeleteDeclarationScope(Sema &SemaRef,
   return false;
 }
 
-static QualType
-RemoveAddressSpaceFromPtr(Sema &SemaRef, const PointerType *PtrTy) {
-  QualType QTy = PtrTy->getPointeeType();
-  QTy = SemaRef.Context.removeAddrSpaceQualType(QTy);
-  return SemaRef.Context.getPointerType(QTy);
+static CanQualType RemoveAddressSpaceFromPtr(Sema &SemaRef,
+ const PointerType *PtrTy) {
+  auto &Ctx = SemaRef.Context;
+  Qualifiers PtrQuals = PtrTy->getPointeeType().getQualifiers();
+  PtrQuals.removeAddressSpace();
+  return Ctx.getPointerType(Ctx.getCanonicalType(Ctx.getQualifiedType(
+  PtrTy->getPointeeType().getUnqualifiedType(), PtrQuals)));
 }
 
 static inline bool
@@ -15277,11 +15279,14 @@ CheckOperatorNewDeleteTypes(Sema &SemaRef, const 
FunctionDecl *FnDecl,
   QualType ResultType =
   FnDecl->getType()->castAs()->getReturnType();
 
-  // The operator is valid on any address space for OpenCL.
   if (SemaRef.getLangOpts().OpenCLCPlusPlus) {
-if (auto *PtrTy = ResultType->getAs()) {
+// The operator is valid on any address space for OpenCL.
+// Drop address space from actual and expected result types.
+if (const auto *PtrTy = ResultType->getAs())
   ResultType = RemoveAddressSpaceFromPtr(SemaRef, PtrTy);
-}
+
+if (auto ExpectedPtrTy = ExpectedResultType->getAs())
+  ExpectedResultType = RemoveAddressSpaceFromPtr(SemaRef, ExpectedPtrTy);
   }
 
   // Check that the result type is what we expect.
@@ -15311,10 +15316,14 @@ CheckOperatorNewDeleteTypes(Sema &SemaRef, const 
FunctionDecl *FnDecl,
   QualType FirstParamType = FnDecl->getParamDecl(0)->getType();
   if (SemaRef.getLangOpts().OpenCLCPlusPlus) {
 // The operator is valid on any address space for OpenCL.
-if (auto *PtrTy =
-FnDecl->getParamDecl(0)->getType()->getAs()) {
+// Drop address space from actual and expected first parameter types.
+if (const auto *PtrTy =
+FnDecl->getParamDecl(0)->getType()->getAs())
   FirstParamType = RemoveAddressSpaceFromPtr(SemaRef, PtrTy);
-}
+
+if (auto ExpectedPtrTy = ExpectedFirstParamType->getAs())
+  ExpectedFirstParamType =
+  RemoveAddressSpaceFromPtr(SemaRef, ExpectedPtrTy);
   }
 
   // Check that the first parameter type is what we expect.

diff  --git a/clang/test/CodeGenOpenCLCXX/addrspace-new-delete.cl 
b/clang/test/CodeGenOpenCLCXX/addrspace-new-delete.cl
new file mode 100644
index ..f3a397419def
--- /dev/null
+++ b/clang/test/CodeGenOpenCLCXX/addrspace-new-delete.cl
@@ -0,0 +1,16 @@
+// RUN: %clang_cc1 %s -triple spir -cl-std=clc++ -emit-llvm -O0 -o - | 
FileCheck %s
+
+typedef __SIZE_TYPE__ size_t;
+
+class A {
+public:
+  void* operator new(size_t);
+  void operator delete(void *ptr);
+};
+
+void test_new_delete(A **a) {
+// CHECK: %{{.*}} = call spir_func i8 addrspace(4)* @_ZNU3AS41AnwEj(i32 {{.*}})
+*a = new A;
+// CHECK: call spir_func void @_ZNU3AS41AdlEPU3AS4v(i8 addrspace(4)* {{.*}})
+delete *a;
+}



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] a427390 - [OpenCL] Add support of __opencl_c_images feature macro

2021-06-21 Thread Anton Zabaznov via cfe-commits

Author: Anton Zabaznov
Date: 2021-06-21T18:24:07+03:00
New Revision: a4273905583559b613e1f23336978007af5849be

URL: 
https://github.com/llvm/llvm-project/commit/a4273905583559b613e1f23336978007af5849be
DIFF: 
https://github.com/llvm/llvm-project/commit/a4273905583559b613e1f23336978007af5849be.diff

LOG: [OpenCL] Add support of __opencl_c_images feature macro

Reviewed By: svenvh

Differential Revision: https://reviews.llvm.org/D103911

Added: 
clang/test/SemaOpenCL/unsupported-image.cl

Modified: 
clang/lib/Sema/SemaType.cpp

Removed: 




diff  --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index b0ed636665012..2434554ba4652 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/lib/Sema/SemaType.cpp
@@ -1721,11 +1721,25 @@ static QualType 
ConvertDeclSpecToType(TypeProcessingState &state) {
   if (Result->containsErrors())
 declarator.setInvalidType();
 
-  if (S.getLangOpts().OpenCL && Result->isOCLImage3dWOType() &&
-  !S.getOpenCLOptions().isSupported("cl_khr_3d_image_writes", 
S.getLangOpts())) {
-S.Diag(DS.getTypeSpecTypeLoc(), diag::err_opencl_requires_extension)
-<< 0 << Result << "cl_khr_3d_image_writes";
-declarator.setInvalidType();
+  if (S.getLangOpts().OpenCL) {
+const auto &OpenCLOptions = S.getOpenCLOptions();
+StringRef OptName;
+// OpenCL C v3.0 s6.3.3 - OpenCL image types require __opencl_c_images
+// support
+if ((Result->isImageType() || Result->isSamplerT()) &&
+(S.getLangOpts().OpenCLVersion >= 300 &&
+ !OpenCLOptions.isSupported("__opencl_c_images", S.getLangOpts(
+  OptName = "__opencl_c_images";
+else if (Result->isOCLImage3dWOType() &&
+ !OpenCLOptions.isSupported("cl_khr_3d_image_writes",
+S.getLangOpts()))
+  OptName = "cl_khr_3d_image_writes";
+
+if (!OptName.empty()) {
+  S.Diag(DS.getTypeSpecTypeLoc(), diag::err_opencl_requires_extension)
+  << 0 << Result << OptName;
+  declarator.setInvalidType();
+}
   }
 
   bool IsFixedPointType = DS.getTypeSpecType() == DeclSpec::TST_accum ||

diff  --git a/clang/test/SemaOpenCL/unsupported-image.cl 
b/clang/test/SemaOpenCL/unsupported-image.cl
new file mode 100644
index 0..3aed9c1f13199
--- /dev/null
+++ b/clang/test/SemaOpenCL/unsupported-image.cl
@@ -0,0 +1,61 @@
+// RUN: %clang_cc1 -triple spir-unknown-unknown -verify -cl-std=CL3.0 
-cl-ext=-__opencl_c_images %s
+// RUN: %clang_cc1 -triple spir-unknown-unknown -verify -cl-std=CL3.0 
-cl-ext=+__opencl_c_images %s
+
+#ifdef __opencl_c_images
+//expected-no-diagnostics
+#endif
+
+void test1(image1d_t i) {}
+#if !defined(__opencl_c_images)
+// expected-error@-2{{use of type '__read_only image1d_t' requires 
__opencl_c_images support}}
+#endif
+
+void test2(image2d_t i) {}
+#if !defined(__opencl_c_images)
+// expected-error@-2{{use of type '__read_only image2d_t' requires 
__opencl_c_images support}}
+#endif
+
+void test3(image1d_array_t i) {}
+#if !defined(__opencl_c_images)
+// expected-error@-2{{use of type '__read_only image1d_array_t' requires 
__opencl_c_images support}}
+#endif
+
+void test4(image2d_array_t i) {}
+#if !defined(__opencl_c_images)
+// expected-error@-2{{use of type '__read_only image2d_array_t' requires 
__opencl_c_images support}}
+#endif
+
+void test5(image2d_depth_t i) {}
+#if !defined(__opencl_c_images)
+// expected-error@-2{{use of type '__read_only image2d_depth_t' requires 
__opencl_c_images support}}
+#endif
+
+void test6(image1d_buffer_t i) {}
+#if !defined(__opencl_c_images)
+// expected-error@-2{{use of type '__read_only image1d_buffer_t' requires 
__opencl_c_images support}}
+#endif
+
+void test7(image2d_msaa_t i) {}
+#if !defined(__opencl_c_images)
+// expected-error@-2{{use of type '__read_only image2d_msaa_t' requires 
__opencl_c_images support}}
+#endif
+
+void test8(image2d_array_msaa_t i) {}
+#if !defined(__opencl_c_images)
+// expected-error@-2{{use of type '__read_only image2d_array_msaa_t' requires 
__opencl_c_images support}}
+#endif
+
+void test9(image2d_msaa_depth_t i) {}
+#if !defined(__opencl_c_images)
+// expected-error@-2{{use of type '__read_only image2d_msaa_depth_t' requires 
__opencl_c_images support}}
+#endif
+
+void test10(image2d_array_msaa_depth_t i) {}
+#if !defined(__opencl_c_images)
+// expected-error@-2{{use of type '__read_only image2d_array_msaa_depth_t' 
requires __opencl_c_images support}}
+#endif
+
+void test11(sampler_t s) {}
+#if !defined(__opencl_c_images)
+// expected-error@-2{{use of type 'sampler_t' requires __opencl_c_images 
support}}
+#endif



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] acc5850 - [OpenCL] Add support of __opencl_c_pipes feature macro.

2021-07-30 Thread Anton Zabaznov via cfe-commits

Author: Anton Zabaznov
Date: 2021-07-30T18:10:25+03:00
New Revision: acc58504952f0e2ca48a44d868f684e3b135dd34

URL: 
https://github.com/llvm/llvm-project/commit/acc58504952f0e2ca48a44d868f684e3b135dd34
DIFF: 
https://github.com/llvm/llvm-project/commit/acc58504952f0e2ca48a44d868f684e3b135dd34.diff

LOG: [OpenCL] Add support of __opencl_c_pipes feature macro.

'pipe' keyword is introduced in OpenCL C 2.0: so do checks for OpenCL C version 
while
parsing and then later on check for language options to construct actual pipe. 
This feature
requires support of __opencl_c_generic_address_space, so diagnostics for that 
is provided as well.

This is the same patch as in D106748 but with a tiny fix in checking of 
diagnostic messages.
Also added tests when program scope global variables are not supported.

Reviewed By: Anastasia

Differential Revision: https://reviews.llvm.org/D107154

Added: 


Modified: 
clang/include/clang/Basic/LangOptions.def
clang/lib/Basic/OpenCLOptions.cpp
clang/lib/Basic/TargetInfo.cpp
clang/lib/Frontend/CompilerInvocation.cpp
clang/lib/Parse/ParseDecl.cpp
clang/lib/Sema/Sema.cpp
clang/test/CodeGenOpenCL/address-spaces-mangling.cl
clang/test/CodeGenOpenCL/address-spaces.cl
clang/test/CodeGenOpenCL/pipe_builtin.cl
clang/test/CodeGenOpenCL/pipe_types.cl
clang/test/CodeGenOpenCL/pipe_types_mangling.cl
clang/test/Misc/opencl-c-3.0.incorrect_options.cl
clang/test/SemaOpenCL/invalid-pipes-cl1.2.cl
clang/test/SemaOpenCL/invalid-pipes-cl2.0.cl
clang/test/SemaOpenCL/storageclass.cl

Removed: 




diff  --git a/clang/include/clang/Basic/LangOptions.def 
b/clang/include/clang/Basic/LangOptions.def
index 5c3d534c9b118..61a4dbdf856a8 100644
--- a/clang/include/clang/Basic/LangOptions.def
+++ b/clang/include/clang/Basic/LangOptions.def
@@ -224,7 +224,7 @@ LANGOPT(OpenCLVersion , 32, 0, "OpenCL C version")
 LANGOPT(OpenCLCPlusPlus   , 1, 0, "C++ for OpenCL")
 LANGOPT(OpenCLCPlusPlusVersion , 32, 0, "C++ for OpenCL version")
 LANGOPT(OpenCLGenericAddressSpace, 1, 0, "OpenCL generic keyword")
-LANGOPT(OpenCLPipe   , 1, 0, "OpenCL pipe keyword")
+LANGOPT(OpenCLPipes  , 1, 0, "OpenCL pipes language constructs and 
built-ins")
 LANGOPT(NativeHalfType, 1, 0, "Native half type support")
 LANGOPT(NativeHalfArgsAndReturns, 1, 0, "Native half args and returns")
 LANGOPT(HalfArgsAndReturns, 1, 0, "half args and returns")

diff  --git a/clang/lib/Basic/OpenCLOptions.cpp 
b/clang/lib/Basic/OpenCLOptions.cpp
index f4f474fade4db..b7408f39bdab4 100644
--- a/clang/lib/Basic/OpenCLOptions.cpp
+++ b/clang/lib/Basic/OpenCLOptions.cpp
@@ -112,7 +112,8 @@ bool OpenCLOptions::diagnoseUnsupportedFeatureDependencies(
   // supported.
   static const llvm::StringMap DependentFeaturesMap = {
   {"__opencl_c_read_write_images", "__opencl_c_images"},
-  {"__opencl_c_3d_image_writes", "__opencl_c_images"}};
+  {"__opencl_c_3d_image_writes", "__opencl_c_images"},
+  {"__opencl_c_pipes", "__opencl_c_generic_address_space"}};
 
   auto OpenCLFeaturesMap = TI.getSupportedOpenCLOpts();
 

diff  --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index b647a2fb8a679..5f8e04c2bd6c4 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -400,14 +400,18 @@ void TargetInfo::adjust(DiagnosticsEngine &Diags, 
LangOptions &Opts) {
 // OpenCL C v3.0 s6.7.5 - The generic address space requires support for
 // OpenCL C 2.0 or OpenCL C 3.0 with the __opencl_c_generic_address_space
 // feature
-// FIXME: OpenCLGenericAddressSpace is also defined in setLangDefaults()
+// OpenCL C v3.0 s6.2.1 - OpenCL pipes require support of OpenCL C 2.0
+// or later and __opencl_c_pipes feature
+// FIXME: These language options are also defined in setLangDefaults()
 // for OpenCL C 2.0 but with no access to target capabilities. Target
-// should be immutable once created and thus this language option needs
+// should be immutable once created and thus these language options need
 // to be defined only once.
-if (Opts.OpenCLVersion >= 300) {
+if (Opts.OpenCLVersion == 300) {
   const auto &OpenCLFeaturesMap = getSupportedOpenCLOpts();
   Opts.OpenCLGenericAddressSpace = hasFeatureEnabled(
   OpenCLFeaturesMap, "__opencl_c_generic_address_space");
+  Opts.OpenCLPipes =
+  hasFeatureEnabled(OpenCLFeaturesMap, "__opencl_c_pipes");
 }
   }
 

diff  --git a/clang/lib/Frontend/CompilerInvocation.cpp 
b/clang/lib/Frontend/CompilerInvocation.cpp
index ae5c5d43318be..39335c4771fa3 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -3173,7 +3173,7 @@ void CompilerInvocation::setLangDefaults(LangOptions 
&Opts, InputKind IK,
 Opts.ZVector = 0;
 Opts.setDefaultFPContractMode(LangOptions::FP

[clang] 4e124ff - [OpenCL] Replace test for pipe struct to test it with fixed triple

2021-07-30 Thread Anton Zabaznov via cfe-commits

Author: Anton Zabaznov
Date: 2021-07-30T21:49:20+03:00
New Revision: 4e124ff256813f060efd2cc307358b1f7bf962c4

URL: 
https://github.com/llvm/llvm-project/commit/4e124ff256813f060efd2cc307358b1f7bf962c4
DIFF: 
https://github.com/llvm/llvm-project/commit/4e124ff256813f060efd2cc307358b1f7bf962c4.diff

LOG: [OpenCL] Replace test for pipe struct to test it with fixed triple

Reviewed By: Anastasia

Differential Revision: https://reviews.llvm.org/D107176

Added: 


Modified: 
clang/test/CodeGenOpenCL/pipe_builtin.cl
clang/test/CodeGenOpenCL/pipe_types.cl

Removed: 




diff  --git a/clang/test/CodeGenOpenCL/pipe_builtin.cl 
b/clang/test/CodeGenOpenCL/pipe_builtin.cl
index 227fa378c434..02b9669b7ab1 100644
--- a/clang/test/CodeGenOpenCL/pipe_builtin.cl
+++ b/clang/test/CodeGenOpenCL/pipe_builtin.cl
@@ -71,16 +71,3 @@ void test8(write_only pipe int p, global int *ptr) {
   // CHECK: call i32 @__get_pipe_max_packets_wo(%opencl.pipe_wo_t* %{{.*}}, 
i32 4, i32 4)
   *ptr = get_pipe_max_packets(p);
 }
-
-struct Person {
-  const char *Name;
-  bool isFemale;
-  int ID;
-};
-
-void test9(global struct Person *SDst, read_only pipe struct Person SPipe) {
-  // CHECK: call i32 @__read_pipe_2(%opencl.pipe_ro_t* %{{.*}}, i8* %{{.*}}, 
i32 16, i32 8)
-  read_pipe (SPipe, SDst);
-  // CHECK: call i32 @__read_pipe_2(%opencl.pipe_ro_t* %{{.*}}, i8* %{{.*}}, 
i32 16, i32 8)
-  read_pipe (SPipe, SDst);
-}

diff  --git a/clang/test/CodeGenOpenCL/pipe_types.cl 
b/clang/test/CodeGenOpenCL/pipe_types.cl
index 5247c9475df7..73ca15ea74d9 100644
--- a/clang/test/CodeGenOpenCL/pipe_types.cl
+++ b/clang/test/CodeGenOpenCL/pipe_types.cl
@@ -1,6 +1,6 @@
-// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -O0 
-cl-std=CL2.0 -o - %s | FileCheck %s
-// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -O0 
-cl-std=CL3.0 
-cl-ext=+__opencl_c_pipes,+__opencl_c_generic_address_space,+__opencl_c_program_scope_global_variables
 -o - %s | FileCheck %s
-// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -O0 
-cl-std=CL3.0 
-cl-ext=+__opencl_c_pipes,+__opencl_c_generic_address_space,-__opencl_c_program_scope_global_variables
 -o - %s | FileCheck %s
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -O0 
-cl-std=CL2.0 -DTEST_STRUCT -o - %s | FileCheck 
--check-prefixes=CHECK,CHECK-STRUCT %s
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -O0 
-cl-std=CL3.0 
-cl-ext=+__opencl_c_pipes,+__opencl_c_generic_address_space,+__opencl_c_program_scope_global_variables
 -o - %s | FileCheck --check-prefixes=CHECK %s
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -O0 
-cl-std=CL3.0 
-cl-ext=+__opencl_c_pipes,+__opencl_c_generic_address_space,-__opencl_c_program_scope_global_variables
 -o - %s | FileCheck --check-prefixes=CHECK %s
 
 // CHECK: %opencl.pipe_ro_t = type opaque
 // CHECK: %opencl.pipe_wo_t = type opaque
@@ -33,3 +33,21 @@ typedef read_only pipe int MyPipe;
 kernel void test6(MyPipe p) {
 // CHECK: define{{.*}} spir_kernel void @test6(%opencl.pipe_ro_t* %p)
 }
+
+#ifdef TEST_STRUCT
+// FIXME: not supported for OpenCL C 3.0 as language built-ins not supported 
yet
+struct Person {
+  const char *Name;
+  bool isFemale;
+  int ID;
+};
+
+void test_reserved_read_pipe(global struct Person *SDst,
+ read_only pipe struct Person SPipe) {
+  // CHECK-STRUCT: define{{.*}} void @test_reserved_read_pipe
+  read_pipe (SPipe, SDst);
+  // CHECK-STRUCT: call i32 @__read_pipe_2(%opencl.pipe_ro_t* %{{.*}}, i8* 
%{{.*}}, i32 16, i32 8)
+  read_pipe (SPipe, SDst);
+  // CHECK-STRUCT: call i32 @__read_pipe_2(%opencl.pipe_ro_t* %{{.*}}, i8* 
%{{.*}}, i32 16, i32 8)
+}
+#endif // TEST_STRUCT



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 78463eb - [OpenCL] Add support of __opencl_c_generic_address_space feature macro

2021-07-13 Thread Anton Zabaznov via cfe-commits

Author: Anton Zabaznov
Date: 2021-07-13T13:14:10+03:00
New Revision: 78463ebde2f8a1b8ce984c1ae7c6da0c2d323005

URL: 
https://github.com/llvm/llvm-project/commit/78463ebde2f8a1b8ce984c1ae7c6da0c2d323005
DIFF: 
https://github.com/llvm/llvm-project/commit/78463ebde2f8a1b8ce984c1ae7c6da0c2d323005.diff

LOG: [OpenCL] Add support of __opencl_c_generic_address_space feature macro

Reviewed By: Anastasia

Differential Revision: https://reviews.llvm.org/D103401

Added: 


Modified: 
clang/lib/Basic/TargetInfo.cpp
clang/lib/Parse/ParseDecl.cpp
clang/test/CodeGenOpenCL/address-spaces-conversions.cl
clang/test/CodeGenOpenCL/address-spaces-mangling.cl
clang/test/CodeGenOpenCL/address-spaces.cl
clang/test/CodeGenOpenCL/amdgpu-sizeof-alignof.cl
clang/test/CodeGenOpenCL/overload.cl
clang/test/SemaOpenCL/address-spaces-conversions-cl2.0.cl
clang/test/SemaOpenCL/address-spaces.cl

Removed: 




diff  --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 88086fa2fed74..b647a2fb8a679 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -396,6 +396,19 @@ void TargetInfo::adjust(DiagnosticsEngine &Diags, 
LangOptions &Opts) {
 HalfFormat = &llvm::APFloat::IEEEhalf();
 FloatFormat = &llvm::APFloat::IEEEsingle();
 LongDoubleFormat = &llvm::APFloat::IEEEquad();
+
+// OpenCL C v3.0 s6.7.5 - The generic address space requires support for
+// OpenCL C 2.0 or OpenCL C 3.0 with the __opencl_c_generic_address_space
+// feature
+// FIXME: OpenCLGenericAddressSpace is also defined in setLangDefaults()
+// for OpenCL C 2.0 but with no access to target capabilities. Target
+// should be immutable once created and thus this language option needs
+// to be defined only once.
+if (Opts.OpenCLVersion >= 300) {
+  const auto &OpenCLFeaturesMap = getSupportedOpenCLOpts();
+  Opts.OpenCLGenericAddressSpace = hasFeatureEnabled(
+  OpenCLFeaturesMap, "__opencl_c_generic_address_space");
+}
   }
 
   if (Opts.DoubleSize) {

diff  --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index c1f20b2e42a22..f4f5f461e3b67 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/lib/Parse/ParseDecl.cpp
@@ -4072,6 +4072,8 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS,
 case tok::kw___generic:
   // generic address space is introduced only in OpenCL v2.0
   // see OpenCL C Spec v2.0 s6.5.5
+  // OpenCL v3.0 introduces __opencl_c_generic_address_space
+  // feature macro to indicate if generic address space is supported
   if (!Actions.getLangOpts().OpenCLGenericAddressSpace) {
 DiagID = diag::err_opencl_unknown_type_specifier;
 PrevSpec = Tok.getIdentifierInfo()->getNameStart();

diff  --git a/clang/test/CodeGenOpenCL/address-spaces-conversions.cl 
b/clang/test/CodeGenOpenCL/address-spaces-conversions.cl
index cd3099e0a1a4f..8fdb46184bed6 100644
--- a/clang/test/CodeGenOpenCL/address-spaces-conversions.cl
+++ b/clang/test/CodeGenOpenCL/address-spaces-conversions.cl
@@ -1,5 +1,7 @@
 // RUN: %clang_cc1 %s -triple x86_64-unknown-linux-gnu -O0 
-ffake-address-space-map -cl-std=CL2.0 -emit-llvm -o - | FileCheck %s
+// RUN: %clang_cc1 %s -triple x86_64-unknown-linux-gnu -O0 
-ffake-address-space-map -cl-std=CL3.0 
-cl-ext=+__opencl_c_generic_address_space -emit-llvm -o - | FileCheck %s
 // RUN: %clang_cc1 %s -triple x86_64-unknown-linux-gnu -O0 -cl-std=CL2.0 
-emit-llvm -o - | FileCheck --check-prefix=CHECK-NOFAKE %s
+// RUN: %clang_cc1 %s -triple x86_64-unknown-linux-gnu -O0 -cl-std=CL3.0 
-cl-ext=+__opencl_c_generic_address_space -emit-llvm -o - | FileCheck 
--check-prefix=CHECK-NOFAKE %s
 // When -ffake-address-space-map is not used, all addr space mapped to 0 for 
x86_64.
 
 // test that we generate address space casts everywhere we need conversions of

diff  --git a/clang/test/CodeGenOpenCL/address-spaces-mangling.cl 
b/clang/test/CodeGenOpenCL/address-spaces-mangling.cl
index 50622f0991430..b46834c2a678c 100644
--- a/clang/test/CodeGenOpenCL/address-spaces-mangling.cl
+++ b/clang/test/CodeGenOpenCL/address-spaces-mangling.cl
@@ -2,10 +2,14 @@
 // RUN: %clang_cc1 %s -cl-std=CL2.0 -ffake-address-space-map 
-faddress-space-map-mangling=yes -triple %itanium_abi_triple -emit-llvm -o - | 
FileCheck -check-prefixes="ASMANG,ASMANG20" %s
 // RUN: %clang_cc1 %s -ffake-address-space-map -faddress-space-map-mangling=no 
-triple %itanium_abi_triple -emit-llvm -o - | FileCheck 
-check-prefixes="NOASMANG,NOASMANG10" %s
 // RUN: %clang_cc1 %s -cl-std=CL2.0 -ffake-address-space-map 
-faddress-space-map-mangling=no -triple %itanium_abi_triple -emit-llvm -o - | 
FileCheck -check-prefixes="NOASMANG,NOASMANG20" %s
+// RUN: %clang_cc1 %s -cl-std=CL3.0 -cl-std=CL3.0 
-cl-ext=+__opencl_c_generic_address_space -ffake-address-space-map 
-faddress-space-map-mangling=no -triple %itan

[clang] ab76101 - [OpenCL] Add support of __opencl_c_read_write_images feature macro

2021-07-13 Thread Anton Zabaznov via cfe-commits

Author: Anton Zabaznov
Date: 2021-07-13T15:38:23+03:00
New Revision: ab76101f40f80bbec82073fc5bfddd7203e63a52

URL: 
https://github.com/llvm/llvm-project/commit/ab76101f40f80bbec82073fc5bfddd7203e63a52
DIFF: 
https://github.com/llvm/llvm-project/commit/ab76101f40f80bbec82073fc5bfddd7203e63a52.diff

LOG: [OpenCL] Add support of __opencl_c_read_write_images feature macro

This feature requires support of __opencl_c_images, so diagnostics for that is 
provided as well

Reviewed By: Anastasia

Differential Revision: https://reviews.llvm.org/D104915

Added: 


Modified: 
clang/include/clang/Basic/DiagnosticCommonKinds.td
clang/include/clang/Basic/DiagnosticSemaKinds.td
clang/include/clang/Basic/OpenCLOptions.h
clang/lib/Basic/OpenCLOptions.cpp
clang/lib/Basic/Targets.cpp
clang/lib/Sema/SemaDeclAttr.cpp
clang/test/Misc/opencl-c-3.0.incorrect_options.cl
clang/test/SemaOpenCL/access-qualifier.cl
clang/test/SemaOpenCL/unsupported-image.cl

Removed: 




diff  --git a/clang/include/clang/Basic/DiagnosticCommonKinds.td 
b/clang/include/clang/Basic/DiagnosticCommonKinds.td
index 4dab3a3b39ac3..eea5d8eaa10a1 100644
--- a/clang/include/clang/Basic/DiagnosticCommonKinds.td
+++ b/clang/include/clang/Basic/DiagnosticCommonKinds.td
@@ -367,4 +367,6 @@ def warn_opencl_unsupported_core_feature : Warning<
 
 def err_opencl_extension_and_feature_
diff ers : Error<
   "options %0 and %1 are set to 
diff erent values">;
+def err_opencl_feature_requires : Error<
+  "feature %0 requires support of %1 feature">;
 }

diff  --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 21b9ce2d9ff2a..2d62163e3dcc0 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -10111,7 +10111,8 @@ def err_opencl_builtin_pipe_invalid_access_modifier : 
Error<
 def err_opencl_invalid_access_qualifier : Error<
   "access qualifier can only be used for pipe and image type">;
 def err_opencl_invalid_read_write : Error<
-  "access qualifier %0 can not be used for %1 %select{|prior to OpenCL version 
2.0}2">;
+  "access qualifier %0 can not be used for %1 %select{|prior to OpenCL C 
version 2.0 or in version 3.0 "
+  "and without __opencl_c_read_write_images feature}2">;
 def err_opencl_multiple_access_qualifiers : Error<
   "multiple access qualifiers">;
 def note_opencl_typedef_access_qualifier : Note<

diff  --git a/clang/include/clang/Basic/OpenCLOptions.h 
b/clang/include/clang/Basic/OpenCLOptions.h
index 44fda029411f1..41db6b712a631 100644
--- a/clang/include/clang/Basic/OpenCLOptions.h
+++ b/clang/include/clang/Basic/OpenCLOptions.h
@@ -19,6 +19,9 @@
 
 namespace clang {
 
+class DiagnosticsEngine;
+class TargetInfo;
+
 namespace {
 // This enum maps OpenCL version(s) into value. These values are used as
 // a mask to indicate in which OpenCL version(s) extension is a core or
@@ -179,6 +182,16 @@ class OpenCLOptions {
 return OpenCLOptionInfo(std::forward(args)...).isAvailableIn(LO);
   }
 
+  // Diagnose feature dependencies for OpenCL C 3.0. Return false if target
+  // doesn't follow these requirements.
+  static bool diagnoseUnsupportedFeatureDependencies(const TargetInfo &TI,
+ DiagnosticsEngine &Diags);
+
+  // Diagnose that features and equivalent extension are set to same values.
+  // Return false if target doesn't follow these requirements.
+  static bool diagnoseFeatureExtensionDifferences(const TargetInfo &TI,
+  DiagnosticsEngine &Diags);
+
 private:
   // Option is enabled via pragma
   bool isEnabled(llvm::StringRef Ext) const;

diff  --git a/clang/lib/Basic/OpenCLOptions.cpp 
b/clang/lib/Basic/OpenCLOptions.cpp
index 7a647f02b1bd0..2e215b185f662 100644
--- a/clang/lib/Basic/OpenCLOptions.cpp
+++ b/clang/lib/Basic/OpenCLOptions.cpp
@@ -7,6 +7,8 @@
 
//===--===//
 
 #include "clang/Basic/OpenCLOptions.h"
+#include "clang/Basic/Diagnostic.h"
+#include "clang/Basic/TargetInfo.h"
 
 namespace clang {
 
@@ -104,4 +106,43 @@ void OpenCLOptions::disableAll() {
 Opt.getValue().Enabled = false;
 }
 
+bool OpenCLOptions::diagnoseUnsupportedFeatureDependencies(
+const TargetInfo &TI, DiagnosticsEngine &Diags) {
+  // Feature pairs. First feature in a pair requires the second one to be
+  // supported.
+  static const llvm::StringMap DependentFeaturesMap = {
+  {"__opencl_c_read_write_images", "__opencl_c_images"}};
+
+  auto OpenCLFeaturesMap = TI.getSupportedOpenCLOpts();
+
+  bool IsValid = true;
+  for (auto &FeaturePair : DependentFeaturesMap)
+if (TI.hasFeatureEnabled(OpenCLFeaturesMap, FeaturePair.getKey()) &&
+!TI.hasFeatureEnabled(OpenCLFeaturesMap, FeaturePair.getValue())) {
+  IsValid = false;
+ 

[clang] 03d8fed - [OpenCL] Add verbosity when checking support of read_write images

2021-07-13 Thread Anton Zabaznov via cfe-commits

Author: Anton Zabaznov
Date: 2021-07-13T18:47:29+03:00
New Revision: 03d8fed34951bc6e92b36615ec3afe6f36d10de6

URL: 
https://github.com/llvm/llvm-project/commit/03d8fed34951bc6e92b36615ec3afe6f36d10de6
DIFF: 
https://github.com/llvm/llvm-project/commit/03d8fed34951bc6e92b36615ec3afe6f36d10de6.diff

LOG: [OpenCL] Add verbosity when checking support of read_write images

Parenthesis were fixed incorrectly by D105890

Reviewed By: Anastasia

Differential Revision: https://reviews.llvm.org/D105892

Added: 


Modified: 
clang/lib/Sema/SemaDeclAttr.cpp

Removed: 




diff  --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index a5d0597e39c4..3586ad323b8e 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -7402,14 +7402,17 @@ static void handleOpenCLAccessAttr(Sema &S, Decl *D, 
const ParsedAttr &AL) {
   // OpenCL v3.0 s6.8 - For OpenCL C 2.0, or with the
   // __opencl_c_read_write_images feature, image objects specified as arguments
   // to a kernel can additionally be declared to be read-write.
+  // C++ for OpenCL inherits rule from OpenCL C v2.0.
   if (const auto *PDecl = dyn_cast(D)) {
 const Type *DeclTy = PDecl->getType().getCanonicalType().getTypePtr();
 if (AL.getAttrName()->getName().find("read_write") != StringRef::npos) {
-  if (((!S.getLangOpts().OpenCLCPlusPlus &&
-(S.getLangOpts().OpenCLVersion < 200)) ||
-   (S.getLangOpts().OpenCLVersion == 300 &&
-!S.getOpenCLOptions().isSupported("__opencl_c_read_write_images",
-  S.getLangOpts( ||
+  bool ReadWriteImagesUnsupportedForOCLC =
+  (S.getLangOpts().OpenCLVersion < 200) ||
+  (S.getLangOpts().OpenCLVersion == 300 &&
+   !S.getOpenCLOptions().isSupported("__opencl_c_read_write_images",
+ S.getLangOpts()));
+  if ((!S.getLangOpts().OpenCLCPlusPlus &&
+   ReadWriteImagesUnsupportedForOCLC) ||
   DeclTy->isPipeType()) {
 S.Diag(AL.getLoc(), diag::err_opencl_invalid_read_write)
 << AL << PDecl->getType() << DeclTy->isImageType();



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 840643b - [OpenCL] Refactor diagnostic for OpenCL extension/feature

2021-03-12 Thread Anton Zabaznov via cfe-commits

Author: Anton Zabaznov
Date: 2021-03-12T11:43:53+03:00
New Revision: 840643bbe1d25c88b0832f93c8bf3b2c451c7b14

URL: 
https://github.com/llvm/llvm-project/commit/840643bbe1d25c88b0832f93c8bf3b2c451c7b14
DIFF: 
https://github.com/llvm/llvm-project/commit/840643bbe1d25c88b0832f93c8bf3b2c451c7b14.diff

LOG: [OpenCL] Refactor diagnostic for OpenCL extension/feature

There is no need to check for enabled pragma for core or optional core features,
thus this check is removed

Reviewed By: Anastasia

Differential Revision: https://reviews.llvm.org/D97058

Added: 


Modified: 
clang/include/clang/Basic/DiagnosticSemaKinds.td
clang/include/clang/Basic/OpenCLOptions.h
clang/lib/Basic/OpenCLOptions.cpp
clang/lib/Parse/ParseDecl.cpp
clang/lib/Parse/ParseExpr.cpp
clang/lib/Parse/ParsePragma.cpp
clang/lib/Sema/DeclSpec.cpp
clang/lib/Sema/Sema.cpp
clang/lib/Sema/SemaCast.cpp
clang/lib/Sema/SemaChecking.cpp
clang/lib/Sema/SemaDecl.cpp
clang/lib/Sema/SemaExpr.cpp
clang/lib/Sema/SemaInit.cpp
clang/lib/Sema/SemaType.cpp
clang/test/Parser/opencl-atomics-cl20.cl
clang/test/SemaOpenCL/access-qualifier.cl
clang/test/SemaOpenCL/cl20-device-side-enqueue.cl
clang/test/SemaOpenCL/extension-begin.cl
clang/test/SemaOpenCL/extensions.cl
clang/test/SemaOpenCL/intel-subgroup-avc-ext-types.cl

Removed: 




diff  --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 5f3389f96397..d4578c5263a0 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -9923,7 +9923,7 @@ def warn_opencl_attr_deprecated_ignored : Warning <
 def err_opencl_variadic_function : Error<
   "invalid prototype, variadic arguments are not allowed in OpenCL">;
 def err_opencl_requires_extension : Error<
-  "use of %select{type|declaration}0 %1 requires %2 extension to be enabled">;
+  "use of %select{type|declaration}0 %1 requires %2 support">;
 def warn_opencl_generic_address_space_arg : Warning<
   "passing non-generic address space pointer to %0"
   " may cause dynamic conversion affecting performance">,

diff  --git a/clang/include/clang/Basic/OpenCLOptions.h 
b/clang/include/clang/Basic/OpenCLOptions.h
index 0f7cffb262c0..9ad3a5681054 100644
--- a/clang/include/clang/Basic/OpenCLOptions.h
+++ b/clang/include/clang/Basic/OpenCLOptions.h
@@ -112,7 +112,10 @@ class OpenCLOptions {
 
   bool isKnown(llvm::StringRef Ext) const;
 
-  bool isEnabled(llvm::StringRef Ext) const;
+  // For core or optional core feature check that it is supported
+  // by a target, for any other option (extension) check that it is
+  // enabled via pragma
+  bool isAvailableOption(llvm::StringRef Ext, const LangOptions &LO) const;
 
   bool isWithPragma(llvm::StringRef Ext) const;
 
@@ -160,15 +163,15 @@ class OpenCLOptions {
   // Disable all extensions
   void disableAll();
 
-  // Enable supported core and optional core features
-  void enableSupportedCore(const LangOptions &LO);
-
   friend class ASTWriter;
   friend class ASTReader;
 
   using OpenCLOptionInfoMap = llvm::StringMap;
 
 private:
+  // Option is enabled via pragma
+  bool isEnabled(llvm::StringRef Ext) const;
+
   OpenCLOptionInfoMap OptMap;
 };
 

diff  --git a/clang/lib/Basic/OpenCLOptions.cpp 
b/clang/lib/Basic/OpenCLOptions.cpp
index 2ca1ee064729..78b7493855e6 100644
--- a/clang/lib/Basic/OpenCLOptions.cpp
+++ b/clang/lib/Basic/OpenCLOptions.cpp
@@ -14,9 +14,21 @@ bool OpenCLOptions::isKnown(llvm::StringRef Ext) const {
   return OptMap.find(Ext) != OptMap.end();
 }
 
+bool OpenCLOptions::isAvailableOption(llvm::StringRef Ext,
+  const LangOptions &LO) const {
+  if (!isKnown(Ext))
+return false;
+
+  auto &OptInfo = OptMap.find(Ext)->getValue();
+  if (OptInfo.isCoreIn(LO) || OptInfo.isOptionalCoreIn(LO))
+return isSupported(Ext, LO);
+
+  return isEnabled(Ext);
+}
+
 bool OpenCLOptions::isEnabled(llvm::StringRef Ext) const {
-  auto E = OptMap.find(Ext);
-  return E != OptMap.end() && E->second.Enabled;
+  auto I = OptMap.find(Ext);
+  return I != OptMap.end() && I->getValue().Enabled;
 }
 
 bool OpenCLOptions::isWithPragma(llvm::StringRef Ext) const {
@@ -26,32 +38,23 @@ bool OpenCLOptions::isWithPragma(llvm::StringRef Ext) const 
{
 
 bool OpenCLOptions::isSupported(llvm::StringRef Ext,
 const LangOptions &LO) const {
-  auto E = OptMap.find(Ext);
-  if (E == OptMap.end()) {
-return false;
-  }
-  auto I = OptMap.find(Ext)->getValue();
-  return I.Supported && I.isAvailableIn(LO);
+  auto I = OptMap.find(Ext);
+  return I != OptMap.end() && I->getValue().Supported &&
+ I->getValue().isAvailableIn(LO);
 }
 
 bool OpenCLOptions::isSupportedCore(llvm::StringRef Ext,
 const LangOptions &LO) const {
-  auto E = O

[clang] a5de66c - [OpenCL] Add support of __opencl_c_device_enqueue feature macro.

2022-01-27 Thread Anton Zabaznov via cfe-commits

Author: Anton Zabaznov
Date: 2022-01-27T14:25:59+03:00
New Revision: a5de66c4c50b5dec085ffbcd2afefd47f3f18d7f

URL: 
https://github.com/llvm/llvm-project/commit/a5de66c4c50b5dec085ffbcd2afefd47f3f18d7f
DIFF: 
https://github.com/llvm/llvm-project/commit/a5de66c4c50b5dec085ffbcd2afefd47f3f18d7f.diff

LOG: [OpenCL] Add support of __opencl_c_device_enqueue feature macro.

This feature requires support of __opencl_c_generic_address_space and
__opencl_c_program_scope_global_variables so diagnostics for that is provided 
as well.

Reviewed By: Anastasia

Differential Revision: https://reviews.llvm.org/D115640

Added: 
clang/test/SemaOpenCL/invalid-device-enqueue-types-cl3.0.cl

Modified: 
clang/include/clang/Basic/DiagnosticSemaKinds.td
clang/include/clang/Basic/OpenCLOptions.h
clang/lib/Basic/OpenCLOptions.cpp
clang/lib/Basic/TargetInfo.cpp
clang/lib/Headers/opencl-c-base.h
clang/lib/Headers/opencl-c.h
clang/lib/Sema/Sema.cpp
clang/test/CodeGenOpenCL/address-spaces-mangling.cl
clang/test/CodeGenOpenCL/address-spaces.cl
clang/test/CodeGenOpenCL/blocks.cl
clang/test/CodeGenOpenCL/pipe_types.cl
clang/test/CodeGenOpenCL/pipe_types_mangling.cl
clang/test/CodeGenOpenCLCXX/addrspace-constructors.clcpp
clang/test/Frontend/opencl.cl
clang/test/Misc/opencl-c-3.0.incorrect_options.cl
clang/test/SemaOpenCL/invalid-block.cl
clang/test/SemaOpenCL/invalid-pipes-cl1.2.cl
clang/test/SemaOpenCL/invalid-pipes-cl2.0.cl
clang/test/SemaOpenCL/storageclass.cl
clang/test/SemaOpenCLCXX/remove-address-space.clcpp

Removed: 




diff  --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 735d92d79d27c..a8cf00c1263ff 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -9556,7 +9556,8 @@ def err_generic_sel_multi_match : Error<
 
 // Blocks
 def err_blocks_disable : Error<"blocks support disabled - compile with 
-fblocks"
-  " or %select{pick a deployment target that supports them|for OpenCL 2.0}0">;
+  " or %select{pick a deployment target that supports them|for OpenCL C 2.0"
+  " or OpenCL C 3.0 with __opencl_c_device_enqueue feature}0">;
 def err_block_returning_array_function : Error<
   "block cannot return %select{array|function}0 type %1">;
 

diff  --git a/clang/include/clang/Basic/OpenCLOptions.h 
b/clang/include/clang/Basic/OpenCLOptions.h
index d6cb1a210519d..512bcb1e6ef10 100644
--- a/clang/include/clang/Basic/OpenCLOptions.h
+++ b/clang/include/clang/Basic/OpenCLOptions.h
@@ -212,6 +212,15 @@ class OpenCLOptions {
   bool isEnabled(llvm::StringRef Ext) const;
 
   OpenCLOptionInfoMap OptMap;
+
+  // First feature in a pair requires the second one to be supported.
+  using FeatureDepEntry = std::pair;
+  using FeatureDepList = llvm::SmallVector;
+
+  static const FeatureDepList DependentFeaturesList;
+
+  // Extensions and equivalent feature pairs.
+  static const llvm::StringMap FeatureExtensionMap;
 };
 
 } // end namespace clang

diff  --git a/clang/lib/Basic/OpenCLOptions.cpp 
b/clang/lib/Basic/OpenCLOptions.cpp
index b7408f39bdab4..7e89b3f1b804d 100644
--- a/clang/lib/Basic/OpenCLOptions.cpp
+++ b/clang/lib/Basic/OpenCLOptions.cpp
@@ -12,6 +12,17 @@
 
 namespace clang {
 
+const OpenCLOptions::FeatureDepList OpenCLOptions::DependentFeaturesList = {
+{"__opencl_c_read_write_images", "__opencl_c_images"},
+{"__opencl_c_3d_image_writes", "__opencl_c_images"},
+{"__opencl_c_pipes", "__opencl_c_generic_address_space"},
+{"__opencl_c_device_enqueue", "__opencl_c_generic_address_space"},
+{"__opencl_c_device_enqueue", 
"__opencl_c_program_scope_global_variables"}};
+
+const llvm::StringMap OpenCLOptions::FeatureExtensionMap = {
+{"cl_khr_fp64", "__opencl_c_fp64"},
+{"cl_khr_3d_image_writes", "__opencl_c_3d_image_writes"}};
+
 bool OpenCLOptions::isKnown(llvm::StringRef Ext) const {
   return OptMap.find(Ext) != OptMap.end();
 }
@@ -108,33 +119,23 @@ void OpenCLOptions::disableAll() {
 
 bool OpenCLOptions::diagnoseUnsupportedFeatureDependencies(
 const TargetInfo &TI, DiagnosticsEngine &Diags) {
-  // Feature pairs. First feature in a pair requires the second one to be
-  // supported.
-  static const llvm::StringMap DependentFeaturesMap = {
-  {"__opencl_c_read_write_images", "__opencl_c_images"},
-  {"__opencl_c_3d_image_writes", "__opencl_c_images"},
-  {"__opencl_c_pipes", "__opencl_c_generic_address_space"}};
-
   auto OpenCLFeaturesMap = TI.getSupportedOpenCLOpts();
 
   bool IsValid = true;
-  for (auto &FeaturePair : DependentFeaturesMap)
-if (TI.hasFeatureEnabled(OpenCLFeaturesMap, FeaturePair.getKey()) &&
-!TI.hasFeatureEnabled(OpenCLFeaturesMap, FeaturePair.getValue())) {
+  for (auto &FeaturePair : DependentFeaturesList) {
+auto Feature = FeaturePair.first;
+auto 

[clang] f0efc00 - [OpenCL] Introduce new method for validating OpenCL target

2021-04-28 Thread Anton Zabaznov via cfe-commits

Author: Anton Zabaznov
Date: 2021-04-28T16:00:02+03:00
New Revision: f0efc00751313779671746492ded4014b715df6a

URL: 
https://github.com/llvm/llvm-project/commit/f0efc00751313779671746492ded4014b715df6a
DIFF: 
https://github.com/llvm/llvm-project/commit/f0efc00751313779671746492ded4014b715df6a.diff

LOG: [OpenCL] Introduce new method for validating OpenCL target

Language options are not available when a target is being created,
thus, a new method is introduced. Also, some refactoring is done,
such as removing OpenCL feature macros setting from TargetInfo.

Reviewed By: Anastasia

Differential Revision: https://reviews.llvm.org/D101087

Added: 
clang/test/Misc/nvptx.unsupported_core.cl
clang/test/Misc/r600.unsupported_core.cl

Modified: 
clang/include/clang/Basic/DiagnosticCommonKinds.td
clang/include/clang/Basic/DiagnosticGroups.td
clang/include/clang/Basic/DiagnosticParseKinds.td
clang/include/clang/Basic/OpenCLOptions.h
clang/include/clang/Basic/TargetInfo.h
clang/lib/Basic/OpenCLOptions.cpp
clang/lib/Basic/Targets.cpp
clang/lib/Basic/Targets/X86.cpp
clang/lib/Frontend/CompilerInstance.cpp
clang/lib/Frontend/InitPreprocessor.cpp

Removed: 




diff  --git a/clang/include/clang/Basic/DiagnosticCommonKinds.td 
b/clang/include/clang/Basic/DiagnosticCommonKinds.td
index eab8206b104dc..06c2647149dfa 100644
--- a/clang/include/clang/Basic/DiagnosticCommonKinds.td
+++ b/clang/include/clang/Basic/DiagnosticCommonKinds.td
@@ -360,4 +360,8 @@ def note_suggest_disabling_all_checkers : Note<
 def warn_poison_system_directories : Warning <
   "include location '%0' is unsafe for cross-compilation">,
   InGroup>, DefaultIgnore;
+
+def warn_opencl_unsupported_core_feature : Warning<
+  "%0 is a core feature in %select{OpenCL C|C++ for OpenCL}1 version %2 but 
not supported on this target">,
+  InGroup, DefaultIgnore;
 }

diff  --git a/clang/include/clang/Basic/DiagnosticGroups.td 
b/clang/include/clang/Basic/DiagnosticGroups.td
index b91cee9a9e5f8..7d4e670c7e7d5 100644
--- a/clang/include/clang/Basic/DiagnosticGroups.td
+++ b/clang/include/clang/Basic/DiagnosticGroups.td
@@ -1286,3 +1286,5 @@ in addition with the pragmas or -fmax-tokens flag to get 
any warnings.
 def WebAssemblyExceptionSpec : DiagGroup<"wasm-exception-spec">;
 
 def RTTI : DiagGroup<"rtti">;
+
+def OpenCLCoreFeaturesDiagGroup : DiagGroup<"pedantic-core-features">;

diff  --git a/clang/include/clang/Basic/DiagnosticParseKinds.td 
b/clang/include/clang/Basic/DiagnosticParseKinds.td
index 8b3da909dd118..274ed728d94d5 100644
--- a/clang/include/clang/Basic/DiagnosticParseKinds.td
+++ b/clang/include/clang/Basic/DiagnosticParseKinds.td
@@ -1246,7 +1246,8 @@ def warn_pragma_unknown_extension : Warning<
 def warn_pragma_unsupported_extension : Warning<
   "unsupported OpenCL extension %0 - ignoring">, InGroup;
 def warn_pragma_extension_is_core : Warning<
-  "OpenCL extension %0 is core feature or supported optional core feature - 
ignoring">, InGroup>, DefaultIgnore;
+  "OpenCL extension %0 is core feature or supported optional core feature - 
ignoring">,
+  InGroup, DefaultIgnore;
 
 // OpenCL errors.
 def err_opencl_taking_function_address_parser : Error<

diff  --git a/clang/include/clang/Basic/OpenCLOptions.h 
b/clang/include/clang/Basic/OpenCLOptions.h
index 17923d2b8d3cb..44fda029411f1 100644
--- a/clang/include/clang/Basic/OpenCLOptions.h
+++ b/clang/include/clang/Basic/OpenCLOptions.h
@@ -59,6 +59,7 @@ static inline bool isOpenCLVersionContainedInMask(const 
LangOptions &LO,
   OpenCLVersionID Code = encodeOpenCLVersion(CLVer);
   return Mask & Code;
 }
+
 } // end anonymous namespace
 
 /// OpenCL supported extensions and optional core features
@@ -167,6 +168,17 @@ class OpenCLOptions {
 
   using OpenCLOptionInfoMap = llvm::StringMap;
 
+  template 
+  static bool isOpenCLOptionCoreIn(const LangOptions &LO, Args &&... args) {
+return OpenCLOptionInfo(std::forward(args)...).isCoreIn(LO);
+  }
+
+  template 
+  static bool isOpenCLOptionAvailableIn(const LangOptions &LO,
+Args &&... args) {
+return OpenCLOptionInfo(std::forward(args)...).isAvailableIn(LO);
+  }
+
 private:
   // Option is enabled via pragma
   bool isEnabled(llvm::StringRef Ext) const;

diff  --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 77b4746333597..3300fe012aa81 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -1234,6 +1234,12 @@ class TargetInfo : public virtual 
TransferrableTargetInfo,
 return false;
   }
 
+  /// Check if target has a given feature enabled
+  virtual bool hasFeatureEnabled(const llvm::StringMap &Features,
+ StringRef Name) const {
+return Features.lookup(Name);
+  }
+
   /// Enable or disable a specific target feature;
   /// the feature name