brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.4 KiB · f3a22fe Raw
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