[clang] 16d2217 - [Clang][OpenCL] Add OpenCL 3.1 language version (#204043)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Jun 16 22:00:20 PDT 2026
Author: Wenju He
Date: 2026-06-17T13:00:15+08:00
New Revision: 16d22173dbb1d3e77cfed5bbcc2aca1157350d25
URL: https://github.com/llvm/llvm-project/commit/16d22173dbb1d3e77cfed5bbcc2aca1157350d25
DIFF: https://github.com/llvm/llvm-project/commit/16d22173dbb1d3e77cfed5bbcc2aca1157350d25.diff
LOG: [Clang][OpenCL] Add OpenCL 3.1 language version (#204043)
OpenCL 3.1 was recently added to spec in
https://github.com/KhronosGroup/OpenCL-Docs/commit/9fff1a87a975
This PR adds version 3.1 to clang support, including frontend flag
`-std=cl3.1` (and its alias `-std=CL3.1`).
Updated release note.
A few extensions are promoted to 3.1 core. They'll be handled in
follow-up PRs.
Assisted-by: Claude Sonnet 4.6
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/include/clang/Basic/LangStandards.def
clang/include/clang/Basic/OpenCLOptions.h
clang/lib/Basic/LangOptions.cpp
clang/lib/Basic/TargetInfo.cpp
clang/lib/Frontend/CompilerInvocation.cpp
clang/lib/Frontend/InitPreprocessor.cpp
clang/test/Driver/opencl.cl
clang/test/Driver/unknown-std.cl
clang/test/Preprocessor/predefined-macros.c
clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index c5e54b09b5ed4..89909fe27cbb9 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -822,6 +822,10 @@ Miscellaneous Clang Crashes Fixed
OpenACC Specific Changes
------------------------
+OpenCL Specific Changes
+-----------------------
+- Added support for OpenCL C 3.1 language version (``-cl-std=CL3.1``).
+
Target Specific Changes
-----------------------
diff --git a/clang/include/clang/Basic/LangStandards.def b/clang/include/clang/Basic/LangStandards.def
index 4edc93503cdf5..809240978d013 100644
--- a/clang/include/clang/Basic/LangStandards.def
+++ b/clang/include/clang/Basic/LangStandards.def
@@ -209,6 +209,9 @@ LANGSTANDARD(opencl20, "cl2.0",
LANGSTANDARD(opencl30, "cl3.0",
OpenCL, "OpenCL 3.0",
LineComment | C99 | Digraphs | HexFloat | OpenCL, std::nullopt)
+LANGSTANDARD(opencl31, "cl3.1",
+ OpenCL, "OpenCL 3.1",
+ LineComment | C99 | Digraphs | HexFloat | OpenCL, std::nullopt)
LANGSTANDARD(openclcpp10, "clc++1.0",
OpenCL, "C++ for OpenCL 1.0",
@@ -226,6 +229,7 @@ LANGSTANDARD_ALIAS_DEPR(opencl11, "CL1.1")
LANGSTANDARD_ALIAS_DEPR(opencl12, "CL1.2")
LANGSTANDARD_ALIAS_DEPR(opencl20, "CL2.0")
LANGSTANDARD_ALIAS_DEPR(opencl30, "CL3.0")
+LANGSTANDARD_ALIAS_DEPR(opencl31, "CL3.1")
LANGSTANDARD_ALIAS_DEPR(openclcpp10, "CLC++")
LANGSTANDARD_ALIAS_DEPR(openclcpp10, "CLC++1.0")
LANGSTANDARD_ALIAS_DEPR(openclcpp2021, "CLC++2021")
diff --git a/clang/include/clang/Basic/OpenCLOptions.h b/clang/include/clang/Basic/OpenCLOptions.h
index d6cb1a210519d..ec661bba94adb 100644
--- a/clang/include/clang/Basic/OpenCLOptions.h
+++ b/clang/include/clang/Basic/OpenCLOptions.h
@@ -32,7 +32,8 @@ enum OpenCLVersionID : unsigned int {
OCL_C_12 = 0x4,
OCL_C_20 = 0x8,
OCL_C_30 = 0x10,
- OCL_C_ALL = 0x1f,
+ OCL_C_31 = 0x20,
+ OCL_C_ALL = 0x3f,
OCL_C_11P = OCL_C_ALL ^ OCL_C_10, // OpenCL C 1.1+
OCL_C_12P = OCL_C_ALL ^ (OCL_C_10 | OCL_C_11), // OpenCL C 1.2+
};
@@ -51,6 +52,8 @@ static inline OpenCLVersionID encodeOpenCLVersion(unsigned OpenCLVersion) {
return OCL_C_20;
case 300:
return OCL_C_30;
+ case 310:
+ return OCL_C_31;
}
}
diff --git a/clang/lib/Basic/LangOptions.cpp b/clang/lib/Basic/LangOptions.cpp
index 7e75bf1221eb7..7e0ee665d4493 100644
--- a/clang/lib/Basic/LangOptions.cpp
+++ b/clang/lib/Basic/LangOptions.cpp
@@ -153,6 +153,8 @@ void LangOptions::setLangDefaults(LangOptions &Opts, Language Lang,
Opts.OpenCLVersion = 200;
else if (LangStd == LangStandard::lang_opencl30)
Opts.OpenCLVersion = 300;
+ else if (LangStd == LangStandard::lang_opencl31)
+ Opts.OpenCLVersion = 310;
else if (LangStd == LangStandard::lang_openclcpp10)
Opts.OpenCLCPlusPlusVersion = 100;
else if (LangStd == LangStandard::lang_openclcpp2021)
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 854d23cadaea2..9a25384347073 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -491,7 +491,7 @@ void TargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts,
// for OpenCL C 2.0 but with no access to target capabilities. Target
// should be immutable once created and thus these language options need
// to be defined only once.
- if (Opts.getOpenCLCompatibleVersion() == 300) {
+ if (Opts.getOpenCLCompatibleVersion() >= 300) {
const auto &OpenCLFeaturesMap = getSupportedOpenCLOpts();
Opts.OpenCLGenericAddressSpace = hasFeatureEnabled(
OpenCLFeaturesMap, "__opencl_c_generic_address_space");
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp
index c564748ddabc1..d2847739e3143 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -4099,6 +4099,7 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args,
.Cases({"cl1.2", "CL1.2"}, LangStandard::lang_opencl12)
.Cases({"cl2.0", "CL2.0"}, LangStandard::lang_opencl20)
.Cases({"cl3.0", "CL3.0"}, LangStandard::lang_opencl30)
+ .Cases({"cl3.1", "CL3.1"}, LangStandard::lang_opencl31)
.Cases({"clc++", "CLC++"}, LangStandard::lang_openclcpp10)
.Cases({"clc++1.0", "CLC++1.0"}, LangStandard::lang_openclcpp10)
.Cases({"clc++2021", "CLC++2021"}, LangStandard::lang_openclcpp2021)
diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp
index 3f0468a938149..ec009211ec6de 100644
--- a/clang/lib/Frontend/InitPreprocessor.cpp
+++ b/clang/lib/Frontend/InitPreprocessor.cpp
@@ -545,6 +545,9 @@ static void InitializeStandardPredefinedMacros(const TargetInfo &TI,
case 300:
Builder.defineMacro("__OPENCL_C_VERSION__", "300");
break;
+ case 310:
+ Builder.defineMacro("__OPENCL_C_VERSION__", "310");
+ break;
default:
llvm_unreachable("Unsupported OpenCL version");
}
@@ -554,6 +557,7 @@ static void InitializeStandardPredefinedMacros(const TargetInfo &TI,
Builder.defineMacro("CL_VERSION_1_2", "120");
Builder.defineMacro("CL_VERSION_2_0", "200");
Builder.defineMacro("CL_VERSION_3_0", "300");
+ Builder.defineMacro("CL_VERSION_3_1", "310");
if (TI.isLittleEndian())
Builder.defineMacro("__ENDIAN_LITTLE__");
diff --git a/clang/test/Driver/opencl.cl b/clang/test/Driver/opencl.cl
index 5b2a1033de081..ba941d5f48feb 100644
--- a/clang/test/Driver/opencl.cl
+++ b/clang/test/Driver/opencl.cl
@@ -4,6 +4,7 @@
// RUN: %clang -S -### -cl-std=CL1.2 %s 2>&1 | FileCheck --check-prefix=CHECK-CL12 %s
// RUN: %clang -S -### -cl-std=CL2.0 %s 2>&1 | FileCheck --check-prefix=CHECK-CL20 %s
// RUN: %clang -S -### -cl-std=CL3.0 %s 2>&1 | FileCheck --check-prefix=CHECK-CL30 %s
+// RUN: %clang -S -### -cl-std=CL3.1 %s 2>&1 | FileCheck --check-prefix=CHECK-CL31 %s
// RUN: %clang -S -### -cl-std=clc++ %s 2>&1 | FileCheck --check-prefix=CHECK-CLCPP %s
// RUN: %clang -S -### -cl-opt-disable %s 2>&1 | FileCheck --check-prefix=CHECK-OPT-DISABLE %s
// RUN: %clang -S -### -cl-strict-aliasing %s 2>&1 | FileCheck --check-prefix=CHECK-STRICT-ALIASING %s
@@ -31,6 +32,7 @@
// CHECK-CL12: "-cc1" {{.*}} "-cl-std=CL1.2"
// CHECK-CL20: "-cc1" {{.*}} "-cl-std=CL2.0"
// CHECK-CL30: "-cc1" {{.*}} "-cl-std=CL3.0"
+// CHECK-CL31: "-cc1" {{.*}} "-cl-std=CL3.1"
// CHECK-CLCPP: "-cc1" {{.*}} "-cl-std=clc++"
// CHECK-OPT-DISABLE: "-cc1" {{.*}} "-cl-opt-disable"
// CHECK-STRICT-ALIASING: "-cc1" {{.*}} "-cl-strict-aliasing"
diff --git a/clang/test/Driver/unknown-std.cl b/clang/test/Driver/unknown-std.cl
index 3570515ad076d..a6d065d9a7d44 100644
--- a/clang/test/Driver/unknown-std.cl
+++ b/clang/test/Driver/unknown-std.cl
@@ -11,6 +11,7 @@
// CHECK-NEXT: note: use 'cl1.2' for 'OpenCL 1.2' standard
// CHECK-NEXT: note: use 'cl2.0' for 'OpenCL 2.0' standard
// CHECK-NEXT: note: use 'cl3.0' for 'OpenCL 3.0' standard
+// CHECK-NEXT: note: use 'cl3.1' for 'OpenCL 3.1' standard
// CHECK-NEXT: note: use 'clc++1.0' or 'clc++' for 'C++ for OpenCL 1.0' standard
// CHECK-NEXT: note: use 'clc++2021' for 'C++ for OpenCL 2021' standard
diff --git a/clang/test/Preprocessor/predefined-macros.c b/clang/test/Preprocessor/predefined-macros.c
index ab85cfc00b42a..2dd4b78238a7b 100644
--- a/clang/test/Preprocessor/predefined-macros.c
+++ b/clang/test/Preprocessor/predefined-macros.c
@@ -145,6 +145,8 @@
// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-CL20
// RUN: %clang_cc1 %s -E -dM -o - -x cl -cl-std=CL3.0 \
// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-CL30
+// RUN: %clang_cc1 %s -E -dM -o - -x cl -cl-std=CL3.1 \
+// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-CL31
// RUN: %clang_cc1 %s -E -dM -o - -x cl -cl-fast-relaxed-math \
// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-FRM
// RUN: %clang_cc1 %s -E -dM -o - -x cl -cl-std=clc++ \
@@ -158,6 +160,7 @@
// CHECK-CL10: #define CL_VERSION_1_2 120
// CHECK-CL10: #define CL_VERSION_2_0 200
// CHECK-CL10: #define CL_VERSION_3_0 300
+// CHECK-CL10: #define CL_VERSION_3_1 310
// CHECK-CL10: #define __OPENCL_C_VERSION__ 100
// CHECK-CL10-NOT: #define __FAST_RELAXED_MATH__ 1
// CHECK-CL11: #define CL_VERSION_1_0 100
@@ -165,6 +168,7 @@
// CHECK-CL11: #define CL_VERSION_1_2 120
// CHECK-CL11: #define CL_VERSION_2_0 200
// CHECK-CL11: #define CL_VERSION_3_0 300
+// CHECK-CL11: #define CL_VERSION_3_1 310
// CHECK-CL11: #define __OPENCL_C_VERSION__ 110
// CHECK-CL11-NOT: #define __FAST_RELAXED_MATH__ 1
// CHECK-CL12: #define CL_VERSION_1_0 100
@@ -172,6 +176,7 @@
// CHECK-CL12: #define CL_VERSION_1_2 120
// CHECK-CL12: #define CL_VERSION_2_0 200
// CHECK-CL12: #define CL_VERSION_3_0 300
+// CHECK-CL12: #define CL_VERSION_3_1 310
// CHECK-CL12: #define __OPENCL_C_VERSION__ 120
// CHECK-CL12-NOT: #define __FAST_RELAXED_MATH__ 1
// CHECK-CL20: #define CL_VERSION_1_0 100
@@ -179,6 +184,7 @@
// CHECK-CL20: #define CL_VERSION_1_2 120
// CHECK-CL20: #define CL_VERSION_2_0 200
// CHECK-CL20: #define CL_VERSION_3_0 300
+// CHECK-CL20: #define CL_VERSION_3_1 310
// CHECK-CL20: #define __OPENCL_C_VERSION__ 200
// CHECK-CL20-NOT: #define __FAST_RELAXED_MATH__ 1
// CHECK-CL30: #define CL_VERSION_1_0 100
@@ -186,8 +192,17 @@
// CHECK-CL30: #define CL_VERSION_1_2 120
// CHECK-CL30: #define CL_VERSION_2_0 200
// CHECK-CL30: #define CL_VERSION_3_0 300
+// CHECK-CL30: #define CL_VERSION_3_1 310
// CHECK-CL30: #define __OPENCL_C_VERSION__ 300
// CHECK-CL30-NOT: #define __FAST_RELAXED_MATH__ 1
+// CHECK-CL31: #define CL_VERSION_1_0 100
+// CHECK-CL31: #define CL_VERSION_1_1 110
+// CHECK-CL31: #define CL_VERSION_1_2 120
+// CHECK-CL31: #define CL_VERSION_2_0 200
+// CHECK-CL31: #define CL_VERSION_3_0 300
+// CHECK-CL31: #define CL_VERSION_3_1 310
+// CHECK-CL31: #define __OPENCL_C_VERSION__ 310
+// CHECK-CL31-NOT: #define __FAST_RELAXED_MATH__ 1
// CHECK-FRM: #define __FAST_RELAXED_MATH__ 1
// CHECK-CLCPP10: #define __CL_CPP_VERSION_1_0__ 100
// CHECK-CLCPP10: #define __CL_CPP_VERSION_2021__ 202100
diff --git a/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp b/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp
index 720afea8b0965..a666dd1ed795d 100644
--- a/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp
+++ b/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp
@@ -604,7 +604,7 @@ static unsigned short EncodeVersions(unsigned int MinVersion,
MaxVersion = UINT_MAX;
}
- unsigned VersionIDs[] = {100, 110, 120, 200, 300};
+ unsigned VersionIDs[] = {100, 110, 120, 200, 300, 310};
for (unsigned I = 0; I < std::size(VersionIDs); I++) {
if (VersionIDs[I] >= MinVersion && VersionIDs[I] < MaxVersion) {
Encoded |= 1 << I;
More information about the cfe-commits
mailing list