110 lines · plain
1// RUN: %clang_cc1 %s -triple x86_64-unknown-linux-gnu -O0 -ffake-address-space-map -cl-std=CL2.0 -emit-llvm -o - | FileCheck %s2// 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 %s3// RUN: %clang_cc1 %s -triple x86_64-unknown-linux-gnu -O0 -cl-std=CL2.0 -emit-llvm -o - | FileCheck --check-prefix=CHECK-NOFAKE %s4// 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 %s5// When -ffake-address-space-map is not used, all addr space mapped to 0 for x86_64.6 7// test that we generate address space casts everywhere we need conversions of8// pointers to different address spaces9 10// CHECK: define{{.*}} void @test11void test(global int *arg_glob, generic int *arg_gen,12 __attribute__((opencl_global_device)) int *arg_device,13 __attribute__((opencl_global_host)) int *arg_host) {14 int var_priv;15 arg_gen = arg_glob; // implicit cast global -> generic16 // CHECK: %{{[0-9]+}} = addrspacecast ptr addrspace(1) %{{[0-9]+}} to ptr addrspace(4)17 // CHECK-NOFAKE-NOT: addrspacecast18 19 arg_gen = &var_priv; // implicit cast with obtaining adr, private -> generic20 // CHECK: %{{[._a-z0-9]+}} = addrspacecast ptr %{{[._a-z0-9]+}} to ptr addrspace(4)21 // CHECK-NOFAKE-NOT: addrspacecast22 23 arg_glob = (global int *)arg_gen; // explicit cast24 // CHECK: %{{[0-9]+}} = addrspacecast ptr addrspace(4) %{{[0-9]+}} to ptr addrspace(1)25 // CHECK-NOFAKE-NOT: addrspacecast26 27 global int *var_glob =28 (global int *)arg_glob; // explicit cast in the same address space29 // CHECK-NOT: %{{[0-9]+}} = addrspacecast ptr addrspace(1) %{{[0-9]+}} to ptr addrspace(1)30 // CHECK-NOFAKE-NOT: addrspacecast31 32 var_priv = arg_gen - arg_glob; // arithmetic operation33 // CHECK: %{{.*}} = ptrtoint ptr addrspace(4) %{{.*}} to i6434 // CHECK: %{{.*}} = ptrtoint ptr addrspace(1) %{{.*}} to i6435 // CHECK-NOFAKE: %{{.*}} = ptrtoint ptr %{{.*}} to i6436 // CHECK-NOFAKE: %{{.*}} = ptrtoint ptr %{{.*}} to i6437 38 var_priv = arg_gen > arg_glob; // comparison39 // CHECK: %{{[0-9]+}} = addrspacecast ptr addrspace(1) %{{[0-9]+}} to ptr addrspace(4)40 41 generic void *var_gen_v = arg_glob;42 // CHECK: addrspacecast43 // CHECK-NOFAKE-NOT: addrspacecast44 45 arg_glob = arg_device; // implicit cast46 // CHECK: addrspacecast47 // CHECK-NOFAKE-NOT: addrspacecast48 49 arg_glob = arg_host; // implicit cast50 // CHECK: addrspacecast51 // CHECK-NOFAKE-NOT: addrspacecast52 53 arg_glob = (global int *)arg_device; // explicit cast54 // CHECK: addrspacecast55 // CHECK-NOFAKE-NOT: addrspacecast56 57 arg_glob = (global int *)arg_host; // explicit cast58 // CHECK: addrspacecast59 // CHECK-NOFAKE-NOT: addrspacecast60 61 arg_device = (__attribute((opencl_global_device)) int *)arg_glob; // explicit cast62 // CHECK: addrspacecast63 // CHECK-NOFAKE-NOT: addrspacecast64 65 arg_host = (__attribute((opencl_global_host)) int *)arg_glob; // explicit cast66 // CHECK: addrspacecast67 // CHECK-NOFAKE-NOT: addrspacecast68}69 70// Test ternary operator.71// CHECK: define{{.*}} void @test_ternary72void test_ternary(void) {73 global int *var_glob;74 generic int *var_gen;75 generic int *var_gen2;76 generic float *var_gen_f;77 generic void *var_gen_v;78 79 var_gen = var_gen ? var_gen : var_gen2; // operands of the same addr spaces and the same type80 // CHECK: icmp81 // CHECK-NOT: addrspacecast82 // CHECK: phi83 // CHECK: store ptr addrspace(4) %{{.+}}, ptr %{{.+}}84 85 var_gen = var_gen ? var_gen : var_glob; // operands of overlapping addr spaces and the same type86 // CHECK: icmp87 // CHECK: %{{.+}} = addrspacecast ptr addrspace(1) %{{.+}} to ptr addrspace(4)88 // CHECK: phi89 // CHECK: store90 91 typedef int int_t;92 global int_t *var_glob_typedef;93 var_gen = var_gen ? var_gen : var_glob_typedef; // operands of overlapping addr spaces and equivalent types94 // CHECK: icmp95 // CHECK: %{{.+}} = addrspacecast ptr addrspace(1) %{{.+}} to ptr addrspace(4)96 // CHECK: phi97 // CHECK: store98 99 var_gen_v = var_gen ? var_gen : var_gen_f; // operands of the same addr space and different types100 // CHECK: icmp101 // CHECK: phi102 // CHECK: store103 104 var_gen_v = var_gen ? var_glob : var_gen_f; // operands of overlapping addr spaces and different types105 // CHECK: icmp106 // CHECK: %{{.+}} = addrspacecast ptr addrspace(1) %{{.+}} to ptr addrspace(4)107 // CHECK: phi108 // CHECK: store109}110