blob: a306e0045f4a4cf8cbee4d1a9bca2fbecb6dd31c [file] [log] [blame]
Aaron Ballmaneda03732014-11-26 16:17:20 +00001// RUN: %clang_cc1 %s -triple x86_64-unknown-linux-gnu -O0 -ffake-address-space-map -cl-std=CL2.0 -emit-llvm -o - | FileCheck %s
Yaxun Liub7b6d0f2016-04-12 19:03:49 +00002// RUN: %clang_cc1 %s -triple x86_64-unknown-linux-gnu -O0 -cl-std=CL2.0 -emit-llvm -o - | FileCheck --check-prefix=CHECK-NOFAKE %s
3// When -ffake-address-space-map is not used, all addr space mapped to 0 for x86_64.
Anastasia Stulova5d8ad8a2014-11-26 15:36:41 +00004
5// test that we generate address space casts everywhere we need conversions of
6// pointers to different address spaces
7
8void test(global int *arg_glob, generic int *arg_gen) {
9 int var_priv;
10 arg_gen = arg_glob; // implicit cast global -> generic
11 // CHECK: %{{[0-9]+}} = addrspacecast i32 addrspace(1)* %{{[0-9]+}} to i32 addrspace(4)*
Yaxun Liub7b6d0f2016-04-12 19:03:49 +000012 // CHECK-NOFAKE-NOT: addrspacecast
Yaxun Liuc5cec392016-04-12 15:46:24 +000013
Anastasia Stulova5d8ad8a2014-11-26 15:36:41 +000014 arg_gen = &var_priv; // implicit cast with obtaining adr, private -> generic
15 // CHECK: %{{[0-9]+}} = addrspacecast i32* %var_priv to i32 addrspace(4)*
Yaxun Liub7b6d0f2016-04-12 19:03:49 +000016 // CHECK-NOFAKE-NOT: addrspacecast
17
Anastasia Stulova5d8ad8a2014-11-26 15:36:41 +000018 arg_glob = (global int *)arg_gen; // explicit cast
19 // CHECK: %{{[0-9]+}} = addrspacecast i32 addrspace(4)* %{{[0-9]+}} to i32 addrspace(1)*
Yaxun Liub7b6d0f2016-04-12 19:03:49 +000020 // CHECK-NOFAKE-NOT: addrspacecast
21
Anastasia Stulova5d8ad8a2014-11-26 15:36:41 +000022 global int *var_glob =
23 (global int *)arg_glob; // explicit cast in the same address space
24 // CHECK-NOT: %{{[0-9]+}} = addrspacecast i32 addrspace(1)* %{{[0-9]+}} to i32 addrspace(1)*
Yaxun Liub7b6d0f2016-04-12 19:03:49 +000025 // CHECK-NOFAKE-NOT: addrspacecast
26
Anastasia Stulova5d8ad8a2014-11-26 15:36:41 +000027 var_priv = arg_gen - arg_glob; // arithmetic operation
Tim Northover86039412014-11-26 22:33:04 +000028 // CHECK: %{{.*}} = ptrtoint i32 addrspace(4)* %{{.*}} to i64
29 // CHECK: %{{.*}} = ptrtoint i32 addrspace(1)* %{{.*}} to i64
Yaxun Liub7b6d0f2016-04-12 19:03:49 +000030 // CHECK-NOFAKE: %{{.*}} = ptrtoint i32* %{{.*}} to i64
31 // CHECK-NOFAKE: %{{.*}} = ptrtoint i32* %{{.*}} to i64
32
Anastasia Stulova5d8ad8a2014-11-26 15:36:41 +000033 var_priv = arg_gen > arg_glob; // comparison
34 // CHECK: %{{[0-9]+}} = addrspacecast i32 addrspace(1)* %{{[0-9]+}} to i32 addrspace(4)*
Yaxun Liub7b6d0f2016-04-12 19:03:49 +000035
36 generic void *var_gen_v = arg_glob;
37 // CHECK: addrspacecast
38 // CHECK-NOT: bitcast
39 // CHECK-NOFAKE: bitcast
40 // CHECK-NOFAKE-NOT: addrspacecast
Anastasia Stulova5d8ad8a2014-11-26 15:36:41 +000041}