Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / clang / test / SemaOpenCL / usm-address-spaces-conversions.cl
blob668b0db70d49e4adc6cc00a412b9dd3f2a6a2032
1 // RUN: %clang_cc1 %s -ffake-address-space-map -verify -pedantic -fsyntax-only -cl-std=CL2.0
2 // RUN: %clang_cc1 %s -ffake-address-space-map -verify -pedantic -fsyntax-only -cl-std=CL2.0 -DGENERIC
3 // RUN: %clang_cc1 %s -ffake-address-space-map -verify -pedantic -fsyntax-only -cl-std=CL2.0 -DCONSTANT
4 // RUN: %clang_cc1 %s -ffake-address-space-map -verify -pedantic -fsyntax-only -cl-std=CL2.0 -DLOCAL
6 /* USM (unified shared memory) extension for OpenCLC 2.0 adds two new address
7 * spaces: global_device and global_host that are a subset of __global address
8 * space. As ISO/IEC TR 18037 5.1.3 declares - it's possible to implicitly
9 * convert a subset address space to a superset address space, while conversion
10 * in a reversed direction could be achieved only with an explicit cast */
12 #ifdef GENERIC
13 #define AS_COMP __generic
14 #else
15 #define AS_COMP __global
16 #endif // GENERIC
18 #ifdef CONSTANT
19 #define AS_INCOMP __constant
20 #elif LOCAL
21 #define AS_INCOMP __local
22 #else // PRIVATE
23 #define AS_INCOMP __private
24 #endif // CONSTANT
26 void test(AS_COMP int *arg_comp,
27 __attribute__((opencl_global_device)) int *arg_device,
28 __attribute__((opencl_global_host)) int *arg_host) {
29 AS_COMP int *var_glob1 = arg_device;
30 AS_COMP int *var_glob2 = arg_host;
31 AS_COMP int *var_glob3 = (AS_COMP int *)arg_device;
32 AS_COMP int *var_glob4 = (AS_COMP int *)arg_host;
33 arg_device = (__attribute__((opencl_global_device)) int *)arg_comp;
34 arg_host = (__attribute__((opencl_global_host)) int *)arg_comp;
35 #ifdef GENERIC
36 // expected-error@+6{{assigning '__generic int *__private' to '__global_device int *__private' changes address space of pointer}}
37 // expected-error@+6{{assigning '__generic int *__private' to '__global_host int *__private' changes address space of pointer}}
38 #else
39 // expected-error@+3{{assigning '__global int *__private' to '__global_device int *__private' changes address space of pointer}}
40 // expected-error@+3{{assigning '__global int *__private' to '__global_host int *__private' changes address space of pointer}}
41 #endif // GENERIC
42 arg_device = arg_comp;
43 arg_host = arg_comp;
45 #ifdef CONSTANT
46 // expected-error@+15{{initializing '__constant int *__private' with an expression of type '__global_device int *__private' changes address space of pointer}}
47 // expected-error@+15{{initializing '__constant int *__private' with an expression of type '__global_host int *__private' changes address space of pointer}}
48 // expected-error@+15{{initializing '__constant int *__private' with an expression of type '__global_device int *' changes address space of pointer}}
49 // expected-error@+16{{initializing '__constant int *__private' with an expression of type '__global_host int *' changes address space of pointer}}
50 #elif LOCAL
51 // expected-error@+10{{initializing '__local int *__private' with an expression of type '__global_device int *__private' changes address space of pointer}}
52 // expected-error@+10{{initializing '__local int *__private' with an expression of type '__global_host int *__private' changes address space of pointer}}
53 // expected-error@+10{{initializing '__local int *__private' with an expression of type '__global_device int *' changes address space of pointer}}
54 // expected-error@+11{{initializing '__local int *__private' with an expression of type '__global_host int *' changes address space of pointer}}
55 #else // PRIVATE
56 // expected-error@+5{{initializing '__private int *__private' with an expression of type '__global_device int *__private' changes address space of pointer}}
57 // expected-error@+5{{initializing '__private int *__private' with an expression of type '__global_host int *__private' changes address space of pointer}}
58 // expected-error@+5{{initializing '__private int *__private' with an expression of type '__global_device int *' changes address space of pointer}}
59 // expected-error@+6{{initializing '__private int *__private' with an expression of type '__global_host int *' changes address space of pointer}}
60 #endif // CONSTANT
61 AS_INCOMP int *var_incomp1 = arg_device;
62 AS_INCOMP int *var_incomp2 = arg_host;
63 AS_INCOMP int *var_incomp3 =
64 (__attribute__((opencl_global_device)) int *)arg_device;
65 AS_INCOMP int *var_incomp4 =
66 (__attribute__((opencl_global_host)) int *)arg_host;