summaryrefslogtreecommitdiffstats
path: root/dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm12-0003-Support-cl_ext_float_atomics.patch
diff options
context:
space:
mode:
Diffstat (limited to 'dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm12-0003-Support-cl_ext_float_atomics.patch')
-rw-r--r--dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm12-0003-Support-cl_ext_float_atomics.patch281
1 files changed, 249 insertions, 32 deletions
diff --git a/dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm12-0003-Support-cl_ext_float_atomics.patch b/dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm12-0003-Support-cl_ext_float_atomics.patch
index 99dbb81c..c609b08b 100644
--- a/dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm12-0003-Support-cl_ext_float_atomics.patch
+++ b/dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm12-0003-Support-cl_ext_float_atomics.patch
@@ -1,20 +1,28 @@
1From f1a24eeb89342186c6c718e02dd394775620799f Mon Sep 17 00:00:00 2001 1From 85505bdb386a426310c1fb0a845780beeeec4353 Mon Sep 17 00:00:00 2001
2From: haonanya <haonan.yang@intel.com> 2From: haonanya <haonan.yang@intel.com>
3Date: Wed, 28 Jul 2021 14:20:08 +0800 3Date: Wed, 9 Feb 2022 09:16:35 +0800
4Subject: [PATCH 3/3] Support cl_ext_float_atomics 4Subject: [PATCH] Support cl_ext_float_atomics
5 5
6Upstream-Status: Backport [Taken from opencl-clang patches; https://github.com/intel/opencl-clang/blob/ocl-open-120/patches/clang/0003-OpenCL-Support-cl_ext_float_atomics.patch] 6This backports https://reviews.llvm.org/D106343 and https://reviews.llvm.org/D109740
7 7
8Signed-off-by: haonanya <haonan.yang@intel.com> 8Signed-off-by: haonanya <haonan.yang@intel.com>
9
10Upstream-Status: Backport
11
12https://github.com/llvm/llvm-project/commit/d353d1c50112a1cb315eccdab18ce7bd1563cd06
13https://github.com/llvm/llvm-project/commit/544d89e847d42ce8856296752b0fb279aa89aace
14
9Signed-off-by: Naveen Saini <naveen.kumar.saini@intel.com> 15Signed-off-by: Naveen Saini <naveen.kumar.saini@intel.com>
16
10--- 17---
11 clang/lib/Headers/opencl-c-base.h | 19 +++ 18 clang/lib/Headers/opencl-c-base.h | 19 ++
12 clang/lib/Headers/opencl-c.h | 195 ++++++++++++++++++++++++++ 19 clang/lib/Headers/opencl-c.h | 378 ++++++++++++++++++++++++++
13 clang/test/Headers/opencl-c-header.cl | 72 ++++++++++ 20 clang/lib/Sema/Sema.cpp | 3 +
14 3 files changed, 286 insertions(+) 21 clang/test/Headers/opencl-c-header.cl | 84 ++++++
22 4 files changed, 484 insertions(+)
15 23
16diff --git a/clang/lib/Headers/opencl-c-base.h b/clang/lib/Headers/opencl-c-base.h 24diff --git a/clang/lib/Headers/opencl-c-base.h b/clang/lib/Headers/opencl-c-base.h
17index e8dcd70377e5..c8b6d36029ec 100644 25index e8dcd70377e5..d94d64372dbb 100644
18--- a/clang/lib/Headers/opencl-c-base.h 26--- a/clang/lib/Headers/opencl-c-base.h
19+++ b/clang/lib/Headers/opencl-c-base.h 27+++ b/clang/lib/Headers/opencl-c-base.h
20@@ -21,6 +21,25 @@ 28@@ -21,6 +21,25 @@
@@ -30,7 +38,7 @@ index e8dcd70377e5..c8b6d36029ec 100644
30+#define __opencl_c_ext_fp16_global_atomic_min_max 1 38+#define __opencl_c_ext_fp16_global_atomic_min_max 1
31+#define __opencl_c_ext_fp16_local_atomic_min_max 1 39+#define __opencl_c_ext_fp16_local_atomic_min_max 1
32+#endif 40+#endif
33+#ifdef __opencl_c_fp64 41+#ifdef cl_khr_fp64
34+#define __opencl_c_ext_fp64_global_atomic_add 1 42+#define __opencl_c_ext_fp64_global_atomic_add 1
35+#define __opencl_c_ext_fp64_local_atomic_add 1 43+#define __opencl_c_ext_fp64_local_atomic_add 1
36+#define __opencl_c_ext_fp64_global_atomic_min_max 1 44+#define __opencl_c_ext_fp64_global_atomic_min_max 1
@@ -44,15 +52,128 @@ index e8dcd70377e5..c8b6d36029ec 100644
44 #endif // (defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200) 52 #endif // (defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200)
45 53
46diff --git a/clang/lib/Headers/opencl-c.h b/clang/lib/Headers/opencl-c.h 54diff --git a/clang/lib/Headers/opencl-c.h b/clang/lib/Headers/opencl-c.h
47index ab665628c8e1..6676da858d2a 100644 55index ab665628c8e1..584db7e81e04 100644
48--- a/clang/lib/Headers/opencl-c.h 56--- a/clang/lib/Headers/opencl-c.h
49+++ b/clang/lib/Headers/opencl-c.h 57+++ b/clang/lib/Headers/opencl-c.h
50@@ -13531,6 +13531,201 @@ intptr_t __ovld atomic_fetch_max_explicit(volatile atomic_intptr_t *object, uint 58@@ -13531,6 +13531,384 @@ intptr_t __ovld atomic_fetch_max_explicit(volatile atomic_intptr_t *object, uint
51 intptr_t __ovld atomic_fetch_max_explicit(volatile atomic_intptr_t *object, uintptr_t opermax, memory_order minder, memory_scope scope); 59 intptr_t __ovld atomic_fetch_max_explicit(volatile atomic_intptr_t *object, uintptr_t opermax, memory_order minder, memory_scope scope);
52 #endif 60 #endif
53 61
62+// The functionality added by cl_ext_float_atomics extension
54+#if defined(cl_ext_float_atomics) 63+#if defined(cl_ext_float_atomics)
55+ 64+
65+#if defined(__opencl_c_ext_fp16_global_atomic_load_store)
66+void __ovld atomic_store(volatile __global atomic_half *object, half operand);
67+void __ovld atomic_store_explicit(volatile __global atomic_half *object,
68+ half operand, memory_order order);
69+void __ovld atomic_store_explicit(volatile __global atomic_half *object,
70+ half operand, memory_order order,
71+ memory_scope scope);
72+half __ovld atomic_load(volatile __global atomic_half *object);
73+half __ovld atomic_load_explicit(volatile __global atomic_half *object,
74+ memory_order order);
75+half __ovld atomic_load_explicit(volatile __global atomic_half *object,
76+ memory_order order, memory_scope scope);
77+half __ovld atomic_exchange(volatile __global atomic_half *object,
78+ half operand);
79+half __ovld atomic_exchange_explicit(volatile __global atomic_half *object,
80+ half operand, memory_order order);
81+half __ovld atomic_exchange_explicit(volatile __global atomic_half *object,
82+ half operand, memory_order order,
83+ memory_scope scope);
84+#endif // defined(__opencl_c_ext_fp16_global_atomic_load_store)
85+
86+#if defined(__opencl_c_ext_fp16_local_atomic_load_store)
87+void __ovld atomic_store(volatile __local atomic_half *object, half operand);
88+void __ovld atomic_store_explicit(volatile __local atomic_half *object,
89+ half operand, memory_order order);
90+void __ovld atomic_store_explicit(volatile __local atomic_half *object,
91+ half operand, memory_order order,
92+ memory_scope scope);
93+half __ovld atomic_load(volatile __local atomic_half *object);
94+half __ovld atomic_load_explicit(volatile __local atomic_half *object,
95+ memory_order order);
96+half __ovld atomic_load_explicit(volatile __local atomic_half *object,
97+ memory_order order, memory_scope scope);
98+half __ovld atomic_exchange(volatile __local atomic_half *object, half operand);
99+half __ovld atomic_exchange_explicit(volatile __local atomic_half *object,
100+ half operand, memory_order order);
101+half __ovld atomic_exchange_explicit(volatile __local atomic_half *object,
102+ half operand, memory_order order,
103+ memory_scope scope);
104+#endif // defined(__opencl_c_ext_fp16_local_atomic_load_store)
105+
106+#if defined(__opencl_c_ext_fp16_global_atomic_load_store) && \
107+ defined(__opencl_c_ext_fp16_local_atomic_load_store)
108+void __ovld atomic_store(volatile atomic_half *object, half operand);
109+void __ovld atomic_store_explicit(volatile atomic_half *object, half operand,
110+ memory_order order);
111+void __ovld atomic_store_explicit(volatile atomic_half *object, half operand,
112+ memory_order order, memory_scope scope);
113+half __ovld atomic_load(volatile atomic_half *object);
114+half __ovld atomic_load_explicit(volatile atomic_half *object,
115+ memory_order order);
116+half __ovld atomic_load_explicit(volatile atomic_half *object,
117+ memory_order order, memory_scope scope);
118+half __ovld atomic_exchange(volatile atomic_half *object, half operand);
119+half __ovld atomic_exchange_explicit(volatile atomic_half *object, half operand,
120+ memory_order order);
121+half __ovld atomic_exchange_explicit(volatile atomic_half *object, half operand,
122+ memory_order order, memory_scope scope);
123+#endif // defined(__opencl_c_ext_fp16_global_atomic_load_store) &&
124+ // defined(__opencl_c_ext_fp16_local_atomic_load_store)
125+
126+#if defined(__opencl_c_ext_fp16_global_atomic_min_max)
127+half __ovld atomic_fetch_min(volatile __global atomic_half *object,
128+ half operand);
129+half __ovld atomic_fetch_max(volatile __global atomic_half *object,
130+ half operand);
131+half __ovld atomic_fetch_min_explicit(volatile __global atomic_half *object,
132+ half operand, memory_order order);
133+half __ovld atomic_fetch_max_explicit(volatile __global atomic_half *object,
134+ half operand, memory_order order);
135+half __ovld atomic_fetch_min_explicit(volatile __global atomic_half *object,
136+ half operand, memory_order order,
137+ memory_scope scope);
138+half __ovld atomic_fetch_max_explicit(volatile __global atomic_half *object,
139+ half operand, memory_order order,
140+ memory_scope scope);
141+#endif // defined(__opencl_c_ext_fp16_global_atomic_min_max)
142+
143+#if defined(__opencl_c_ext_fp16_local_atomic_min_max)
144+half __ovld atomic_fetch_min(volatile __local atomic_half *object,
145+ half operand);
146+half __ovld atomic_fetch_max(volatile __local atomic_half *object,
147+ half operand);
148+half __ovld atomic_fetch_min_explicit(volatile __local atomic_half *object,
149+ half operand, memory_order order);
150+half __ovld atomic_fetch_max_explicit(volatile __local atomic_half *object,
151+ half operand, memory_order order);
152+half __ovld atomic_fetch_min_explicit(volatile __local atomic_half *object,
153+ half operand, memory_order order,
154+ memory_scope scope);
155+half __ovld atomic_fetch_max_explicit(volatile __local atomic_half *object,
156+ half operand, memory_order order,
157+ memory_scope scope);
158+#endif // defined(__opencl_c_ext_fp16_local_atomic_min_max)
159+
160+#if defined(__opencl_c_ext_fp16_global_atomic_min_max) && \
161+ defined(__opencl_c_ext_fp16_local_atomic_min_max)
162+half __ovld atomic_fetch_min(volatile atomic_half *object, half operand);
163+half __ovld atomic_fetch_max(volatile atomic_half *object, half operand);
164+half __ovld atomic_fetch_min_explicit(volatile atomic_half *object,
165+ half operand, memory_order order);
166+half __ovld atomic_fetch_max_explicit(volatile atomic_half *object,
167+ half operand, memory_order order);
168+half __ovld atomic_fetch_min_explicit(volatile atomic_half *object,
169+ half operand, memory_order order,
170+ memory_scope scope);
171+half __ovld atomic_fetch_max_explicit(volatile atomic_half *object,
172+ half operand, memory_order order,
173+ memory_scope scope);
174+#endif // defined(__opencl_c_ext_fp16_global_atomic_min_max) && \
175+ defined(__opencl_c_ext_fp16_local_atomic_min_max)
176+
56+#if defined(__opencl_c_ext_fp32_global_atomic_min_max) 177+#if defined(__opencl_c_ext_fp32_global_atomic_min_max)
57+float __ovld atomic_fetch_min(volatile __global atomic_float *object, 178+float __ovld atomic_fetch_min(volatile __global atomic_float *object,
58+ float operand); 179+ float operand);
@@ -68,7 +189,8 @@ index ab665628c8e1..6676da858d2a 100644
68+float __ovld atomic_fetch_max_explicit(volatile __global atomic_float *object, 189+float __ovld atomic_fetch_max_explicit(volatile __global atomic_float *object,
69+ float operand, memory_order order, 190+ float operand, memory_order order,
70+ memory_scope scope); 191+ memory_scope scope);
71+#endif 192+#endif // defined(__opencl_c_ext_fp32_global_atomic_min_max)
193+
72+#if defined(__opencl_c_ext_fp32_local_atomic_min_max) 194+#if defined(__opencl_c_ext_fp32_local_atomic_min_max)
73+float __ovld atomic_fetch_min(volatile __local atomic_float *object, 195+float __ovld atomic_fetch_min(volatile __local atomic_float *object,
74+ float operand); 196+ float operand);
@@ -84,8 +206,9 @@ index ab665628c8e1..6676da858d2a 100644
84+float __ovld atomic_fetch_max_explicit(volatile __local atomic_float *object, 206+float __ovld atomic_fetch_max_explicit(volatile __local atomic_float *object,
85+ float operand, memory_order order, 207+ float operand, memory_order order,
86+ memory_scope scope); 208+ memory_scope scope);
87+#endif 209+#endif // defined(__opencl_c_ext_fp32_local_atomic_min_max)
88+#if defined(__opencl_c_ext_fp32_global_atomic_min_max) || \ 210+
211+#if defined(__opencl_c_ext_fp32_global_atomic_min_max) && \
89+ defined(__opencl_c_ext_fp32_local_atomic_min_max) 212+ defined(__opencl_c_ext_fp32_local_atomic_min_max)
90+float __ovld atomic_fetch_min(volatile atomic_float *object, float operand); 213+float __ovld atomic_fetch_min(volatile atomic_float *object, float operand);
91+float __ovld atomic_fetch_max(volatile atomic_float *object, float operand); 214+float __ovld atomic_fetch_max(volatile atomic_float *object, float operand);
@@ -99,7 +222,10 @@ index ab665628c8e1..6676da858d2a 100644
99+float __ovld atomic_fetch_max_explicit(volatile atomic_float *object, 222+float __ovld atomic_fetch_max_explicit(volatile atomic_float *object,
100+ float operand, memory_order order, 223+ float operand, memory_order order,
101+ memory_scope scope); 224+ memory_scope scope);
102+#endif 225+#endif // defined(__opencl_c_ext_fp32_global_atomic_min_max) && \
226+ defined(__opencl_c_ext_fp32_local_atomic_min_max)
227+
228+#if defined(cl_khr_int64_base_atomics) && defined(cl_khr_int64_extended_atomics)
103+#if defined(__opencl_c_ext_fp64_global_atomic_min_max) 229+#if defined(__opencl_c_ext_fp64_global_atomic_min_max)
104+double __ovld atomic_fetch_min(volatile __global atomic_double *object, 230+double __ovld atomic_fetch_min(volatile __global atomic_double *object,
105+ double operand); 231+ double operand);
@@ -115,7 +241,8 @@ index ab665628c8e1..6676da858d2a 100644
115+double __ovld atomic_fetch_max_explicit(volatile __global atomic_double *object, 241+double __ovld atomic_fetch_max_explicit(volatile __global atomic_double *object,
116+ double operand, memory_order order, 242+ double operand, memory_order order,
117+ memory_scope scope); 243+ memory_scope scope);
118+#endif 244+#endif // defined(__opencl_c_ext_fp64_global_atomic_min_max)
245+
119+#if defined(__opencl_c_ext_fp64_local_atomic_min_max) 246+#if defined(__opencl_c_ext_fp64_local_atomic_min_max)
120+double __ovld atomic_fetch_min(volatile __local atomic_double *object, 247+double __ovld atomic_fetch_min(volatile __local atomic_double *object,
121+ double operand); 248+ double operand);
@@ -131,8 +258,9 @@ index ab665628c8e1..6676da858d2a 100644
131+double __ovld atomic_fetch_max_explicit(volatile __local atomic_double *object, 258+double __ovld atomic_fetch_max_explicit(volatile __local atomic_double *object,
132+ double operand, memory_order order, 259+ double operand, memory_order order,
133+ memory_scope scope); 260+ memory_scope scope);
134+#endif 261+#endif // defined(__opencl_c_ext_fp64_local_atomic_min_max)
135+#if defined(__opencl_c_ext_fp64_global_atomic_min_max) || \ 262+
263+#if defined(__opencl_c_ext_fp64_global_atomic_min_max) && \
136+ defined(__opencl_c_ext_fp64_local_atomic_min_max) 264+ defined(__opencl_c_ext_fp64_local_atomic_min_max)
137+double __ovld atomic_fetch_min(volatile atomic_double *object, double operand); 265+double __ovld atomic_fetch_min(volatile atomic_double *object, double operand);
138+double __ovld atomic_fetch_max(volatile atomic_double *object, double operand); 266+double __ovld atomic_fetch_max(volatile atomic_double *object, double operand);
@@ -146,7 +274,61 @@ index ab665628c8e1..6676da858d2a 100644
146+double __ovld atomic_fetch_max_explicit(volatile atomic_double *object, 274+double __ovld atomic_fetch_max_explicit(volatile atomic_double *object,
147+ double operand, memory_order order, 275+ double operand, memory_order order,
148+ memory_scope scope); 276+ memory_scope scope);
149+#endif 277+#endif // defined(__opencl_c_ext_fp64_global_atomic_min_max) && \
278+ defined(__opencl_c_ext_fp64_local_atomic_min_max)
279+#endif // defined(cl_khr_int64_base_atomics) &&
280+ // defined(cl_khr_int64_extended_atomics)
281+
282+#if defined(__opencl_c_ext_fp16_global_atomic_add)
283+half __ovld atomic_fetch_add(volatile __global atomic_half *object,
284+ half operand);
285+half __ovld atomic_fetch_sub(volatile __global atomic_half *object,
286+ half operand);
287+half __ovld atomic_fetch_add_explicit(volatile __global atomic_half *object,
288+ half operand, memory_order order);
289+half __ovld atomic_fetch_sub_explicit(volatile __global atomic_half *object,
290+ half operand, memory_order order);
291+half __ovld atomic_fetch_add_explicit(volatile __global atomic_half *object,
292+ half operand, memory_order order,
293+ memory_scope scope);
294+half __ovld atomic_fetch_sub_explicit(volatile __global atomic_half *object,
295+ half operand, memory_order order,
296+ memory_scope scope);
297+#endif // defined(__opencl_c_ext_fp16_global_atomic_add)
298+
299+#if defined(__opencl_c_ext_fp16_local_atomic_add)
300+half __ovld atomic_fetch_add(volatile __local atomic_half *object,
301+ half operand);
302+half __ovld atomic_fetch_sub(volatile __local atomic_half *object,
303+ half operand);
304+half __ovld atomic_fetch_add_explicit(volatile __local atomic_half *object,
305+ half operand, memory_order order);
306+half __ovld atomic_fetch_sub_explicit(volatile __local atomic_half *object,
307+ half operand, memory_order order);
308+half __ovld atomic_fetch_add_explicit(volatile __local atomic_half *object,
309+ half operand, memory_order order,
310+ memory_scope scope);
311+half __ovld atomic_fetch_sub_explicit(volatile __local atomic_half *object,
312+ half operand, memory_order order,
313+ memory_scope scope);
314+#endif // defined(__opencl_c_ext_fp16_local_atomic_add)
315+
316+#if defined(__opencl_c_ext_fp16_global_atomic_add) && \
317+ defined(__opencl_c_ext_fp16_local_atomic_add)
318+half __ovld atomic_fetch_add(volatile atomic_half *object, half operand);
319+half __ovld atomic_fetch_sub(volatile atomic_half *object, half operand);
320+half __ovld atomic_fetch_add_explicit(volatile atomic_half *object,
321+ half operand, memory_order order);
322+half __ovld atomic_fetch_sub_explicit(volatile atomic_half *object,
323+ half operand, memory_order order);
324+half __ovld atomic_fetch_add_explicit(volatile atomic_half *object,
325+ half operand, memory_order order,
326+ memory_scope scope);
327+half __ovld atomic_fetch_sub_explicit(volatile atomic_half *object,
328+ half operand, memory_order order,
329+ memory_scope scope);
330+#endif // defined(__opencl_c_ext_fp16_global_atomic_add) && \
331+ defined(__opencl_c_ext_fp16_local_atomic_add)
150+ 332+
151+#if defined(__opencl_c_ext_fp32_global_atomic_add) 333+#if defined(__opencl_c_ext_fp32_global_atomic_add)
152+float __ovld atomic_fetch_add(volatile __global atomic_float *object, 334+float __ovld atomic_fetch_add(volatile __global atomic_float *object,
@@ -163,7 +345,8 @@ index ab665628c8e1..6676da858d2a 100644
163+float __ovld atomic_fetch_sub_explicit(volatile __global atomic_float *object, 345+float __ovld atomic_fetch_sub_explicit(volatile __global atomic_float *object,
164+ float operand, memory_order order, 346+ float operand, memory_order order,
165+ memory_scope scope); 347+ memory_scope scope);
166+#endif 348+#endif // defined(__opencl_c_ext_fp32_global_atomic_add)
349+
167+#if defined(__opencl_c_ext_fp32_local_atomic_add) 350+#if defined(__opencl_c_ext_fp32_local_atomic_add)
168+float __ovld atomic_fetch_add(volatile __local atomic_float *object, 351+float __ovld atomic_fetch_add(volatile __local atomic_float *object,
169+ float operand); 352+ float operand);
@@ -179,8 +362,9 @@ index ab665628c8e1..6676da858d2a 100644
179+float __ovld atomic_fetch_sub_explicit(volatile __local atomic_float *object, 362+float __ovld atomic_fetch_sub_explicit(volatile __local atomic_float *object,
180+ float operand, memory_order order, 363+ float operand, memory_order order,
181+ memory_scope scope); 364+ memory_scope scope);
182+#endif 365+#endif // defined(__opencl_c_ext_fp32_local_atomic_add)
183+#if defined(__opencl_c_ext_fp32_global_atomic_add) || \ 366+
367+#if defined(__opencl_c_ext_fp32_global_atomic_add) && \
184+ defined(__opencl_c_ext_fp32_local_atomic_add) 368+ defined(__opencl_c_ext_fp32_local_atomic_add)
185+float __ovld atomic_fetch_add(volatile atomic_float *object, float operand); 369+float __ovld atomic_fetch_add(volatile atomic_float *object, float operand);
186+float __ovld atomic_fetch_sub(volatile atomic_float *object, float operand); 370+float __ovld atomic_fetch_sub(volatile atomic_float *object, float operand);
@@ -194,8 +378,10 @@ index ab665628c8e1..6676da858d2a 100644
194+float __ovld atomic_fetch_sub_explicit(volatile atomic_float *object, 378+float __ovld atomic_fetch_sub_explicit(volatile atomic_float *object,
195+ float operand, memory_order order, 379+ float operand, memory_order order,
196+ memory_scope scope); 380+ memory_scope scope);
197+#endif 381+#endif // defined(__opencl_c_ext_fp32_global_atomic_add) && \
382+ defined(__opencl_c_ext_fp32_local_atomic_add)
198+ 383+
384+#if defined(cl_khr_int64_base_atomics) && defined(cl_khr_int64_extended_atomics)
199+#if defined(__opencl_c_ext_fp64_global_atomic_add) 385+#if defined(__opencl_c_ext_fp64_global_atomic_add)
200+double __ovld atomic_fetch_add(volatile __global atomic_double *object, 386+double __ovld atomic_fetch_add(volatile __global atomic_double *object,
201+ double operand); 387+ double operand);
@@ -211,7 +397,8 @@ index ab665628c8e1..6676da858d2a 100644
211+double __ovld atomic_fetch_sub_explicit(volatile __global atomic_double *object, 397+double __ovld atomic_fetch_sub_explicit(volatile __global atomic_double *object,
212+ double operand, memory_order order, 398+ double operand, memory_order order,
213+ memory_scope scope); 399+ memory_scope scope);
214+#endif 400+#endif // defined(__opencl_c_ext_fp64_global_atomic_add)
401+
215+#if defined(__opencl_c_ext_fp64_local_atomic_add) 402+#if defined(__opencl_c_ext_fp64_local_atomic_add)
216+double __ovld atomic_fetch_add(volatile __local atomic_double *object, 403+double __ovld atomic_fetch_add(volatile __local atomic_double *object,
217+ double operand); 404+ double operand);
@@ -227,8 +414,9 @@ index ab665628c8e1..6676da858d2a 100644
227+double __ovld atomic_fetch_sub_explicit(volatile __local atomic_double *object, 414+double __ovld atomic_fetch_sub_explicit(volatile __local atomic_double *object,
228+ double operand, memory_order order, 415+ double operand, memory_order order,
229+ memory_scope scope); 416+ memory_scope scope);
230+#endif 417+#endif // defined(__opencl_c_ext_fp64_local_atomic_add)
231+#if defined(__opencl_c_ext_fp64_global_atomic_add) || \ 418+
419+#if defined(__opencl_c_ext_fp64_global_atomic_add) && \
232+ defined(__opencl_c_ext_fp64_local_atomic_add) 420+ defined(__opencl_c_ext_fp64_local_atomic_add)
233+double __ovld atomic_fetch_add(volatile atomic_double *object, double operand); 421+double __ovld atomic_fetch_add(volatile atomic_double *object, double operand);
234+double __ovld atomic_fetch_sub(volatile atomic_double *object, double operand); 422+double __ovld atomic_fetch_sub(volatile atomic_double *object, double operand);
@@ -242,18 +430,35 @@ index ab665628c8e1..6676da858d2a 100644
242+double __ovld atomic_fetch_sub_explicit(volatile atomic_double *object, 430+double __ovld atomic_fetch_sub_explicit(volatile atomic_double *object,
243+ double operand, memory_order order, 431+ double operand, memory_order order,
244+ memory_scope scope); 432+ memory_scope scope);
245+#endif 433+#endif // defined(__opencl_c_ext_fp64_global_atomic_add) && \
434+ defined(__opencl_c_ext_fp64_local_atomic_add)
435+#endif // defined(cl_khr_int64_base_atomics) &&
436+ // defined(cl_khr_int64_extended_atomics)
246+ 437+
247+#endif // cl_ext_float_atomics 438+#endif // cl_ext_float_atomics
248+ 439+
249 // atomic_store() 440 // atomic_store()
250 441
251 void __ovld atomic_store(volatile atomic_int *object, int desired); 442 void __ovld atomic_store(volatile atomic_int *object, int desired);
443diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp
444index 450f9c020f7f..a91291c7af38 100644
445--- a/clang/lib/Sema/Sema.cpp
446+++ b/clang/lib/Sema/Sema.cpp
447@@ -313,6 +313,9 @@ void Sema::Initialize() {
448 addImplicitTypedef("atomic_long", AtomicLongT);
449 auto AtomicULongT = Context.getAtomicType(Context.UnsignedLongTy);
450 addImplicitTypedef("atomic_ulong", AtomicULongT);
451+ auto AtomicHalfT = Context.getAtomicType(Context.HalfTy);
452+ addImplicitTypedef("atomic_half", AtomicHalfT);
453+ setOpenCLExtensionForType(AtomicHalfT, "cl_khr_fp16");
454 addImplicitTypedef("atomic_float",
455 Context.getAtomicType(Context.FloatTy));
456 auto AtomicDoubleT = Context.getAtomicType(Context.DoubleTy);
252diff --git a/clang/test/Headers/opencl-c-header.cl b/clang/test/Headers/opencl-c-header.cl 457diff --git a/clang/test/Headers/opencl-c-header.cl b/clang/test/Headers/opencl-c-header.cl
253index 13a3b62481ec..2c02d14f25c3 100644 458index 13a3b62481ec..443f682c711a 100644
254--- a/clang/test/Headers/opencl-c-header.cl 459--- a/clang/test/Headers/opencl-c-header.cl
255+++ b/clang/test/Headers/opencl-c-header.cl 460+++ b/clang/test/Headers/opencl-c-header.cl
256@@ -124,6 +124,36 @@ global atomic_int z = ATOMIC_VAR_INIT(99); 461@@ -124,6 +124,48 @@ global atomic_int z = ATOMIC_VAR_INIT(99);
257 #if cl_khr_subgroup_clustered_reduce != 1 462 #if cl_khr_subgroup_clustered_reduce != 1
258 #error "Incorrectly defined cl_khr_subgroup_clustered_reduce" 463 #error "Incorrectly defined cl_khr_subgroup_clustered_reduce"
259 #endif 464 #endif
@@ -269,28 +474,40 @@ index 13a3b62481ec..2c02d14f25c3 100644
269+#if __opencl_c_ext_fp32_global_atomic_add != 1 474+#if __opencl_c_ext_fp32_global_atomic_add != 1
270+#error "Incorrectly defined __opencl_c_ext_fp32_global_atomic_add" 475+#error "Incorrectly defined __opencl_c_ext_fp32_global_atomic_add"
271+#endif 476+#endif
477+#if __opencl_c_ext_fp64_global_atomic_add != 1
478+#error "Incorrectly defined __opencl_c_ext_fp64_global_atomic_add"
479+#endif
272+#if __opencl_c_ext_fp16_local_atomic_add != 1 480+#if __opencl_c_ext_fp16_local_atomic_add != 1
273+#error "Incorrectly defined __opencl_c_ext_fp16_local_atomic_add" 481+#error "Incorrectly defined __opencl_c_ext_fp16_local_atomic_add"
274+#endif 482+#endif
275+#if __opencl_c_ext_fp32_local_atomic_add != 1 483+#if __opencl_c_ext_fp32_local_atomic_add != 1
276+#error "Incorrectly defined __opencl_c_ext_fp32_local_atomic_add" 484+#error "Incorrectly defined __opencl_c_ext_fp32_local_atomic_add"
277+#endif 485+#endif
486+#if __opencl_c_ext_fp64_local_atomic_add != 1
487+#error "Incorrectly defined __opencl_c_ext_fp64_local_atomic_add"
488+#endif
278+#if __opencl_c_ext_fp16_global_atomic_min_max != 1 489+#if __opencl_c_ext_fp16_global_atomic_min_max != 1
279+#error "Incorrectly defined __opencl_c_ext_fp16_global_atomic_min_max" 490+#error "Incorrectly defined __opencl_c_ext_fp16_global_atomic_min_max"
280+#endif 491+#endif
281+#if __opencl_c_ext_fp32_global_atomic_min_max != 1 492+#if __opencl_c_ext_fp32_global_atomic_min_max != 1
282+#error "Incorrectly defined __opencl_c_ext_fp32_global_atomic_min_max" 493+#error "Incorrectly defined __opencl_c_ext_fp32_global_atomic_min_max"
283+#endif 494+#endif
495+#if __opencl_c_ext_fp64_global_atomic_min_max != 1
496+#error "Incorrectly defined __opencl_c_ext_fp64_global_atomic_min_max"
497+#endif
284+#if __opencl_c_ext_fp16_local_atomic_min_max != 1 498+#if __opencl_c_ext_fp16_local_atomic_min_max != 1
285+#error "Incorrectly defined __opencl_c_ext_fp16_local_atomic_min_max" 499+#error "Incorrectly defined __opencl_c_ext_fp16_local_atomic_min_max"
286+#endif 500+#endif
287+#if __opencl_c_ext_fp32_local_atomic_min_max != 1 501+#if __opencl_c_ext_fp32_local_atomic_min_max != 1
288+#error "Incorrectly defined __opencl_c_ext_fp32_local_atomic_min_max" 502+#error "Incorrectly defined __opencl_c_ext_fp32_local_atomic_min_max"
289+#endif 503+#endif
504+#if __opencl_c_ext_fp64_local_atomic_min_max != 1
505+#error "Incorrectly defined __opencl_c_ext_fp64_local_atomic_min_max"
506+#endif
290 507
291 #else 508 #else
292 509
293@@ -148,6 +178,48 @@ global atomic_int z = ATOMIC_VAR_INIT(99); 510@@ -148,6 +190,48 @@ global atomic_int z = ATOMIC_VAR_INIT(99);
294 #ifdef cl_khr_subgroup_clustered_reduce 511 #ifdef cl_khr_subgroup_clustered_reduce
295 #error "Incorrect cl_khr_subgroup_clustered_reduce define" 512 #error "Incorrect cl_khr_subgroup_clustered_reduce define"
296 #endif 513 #endif
@@ -340,5 +557,5 @@ index 13a3b62481ec..2c02d14f25c3 100644
340 #endif //(defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200) 557 #endif //(defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200)
341 558
342-- 559--
3432.17.1 5602.29.2
344 561