1*67e74705SXin Li// RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm -O0 -cl-std=CL2.0 -o - %s | FileCheck %s 2*67e74705SXin Li 3*67e74705SXin Li// CHECK: %[[A:.*]] = type { float, float, float } 4*67e74705SXin Litypedef struct { 5*67e74705SXin Li float x,y,z; 6*67e74705SXin Li} A; 7*67e74705SXin Litypedef private A *PA; 8*67e74705SXin Litypedef global A *GA; 9*67e74705SXin Li 10*67e74705SXin Livoid test(void) { 11*67e74705SXin Li global int *glob; 12*67e74705SXin Li local int *loc; 13*67e74705SXin Li private int *priv; 14*67e74705SXin Li generic int *gen; 15*67e74705SXin Li 16*67e74705SXin Li //CHECK: %[[ARG:.*]] = addrspacecast i32 addrspace(1)* %{{.*}} to i8 addrspace(4)* 17*67e74705SXin Li //CHECK: %[[RET:.*]] = call i8 addrspace(1)* @to_global(i8 addrspace(4)* %[[ARG]]) 18*67e74705SXin Li //CHECK: %{{.*}} = bitcast i8 addrspace(1)* %[[RET]] to i32 addrspace(1)* 19*67e74705SXin Li glob = to_global(glob); 20*67e74705SXin Li 21*67e74705SXin Li //CHECK: %[[ARG:.*]] = addrspacecast i32 addrspace(3)* %{{.*}} to i8 addrspace(4)* 22*67e74705SXin Li //CHECK: %[[RET:.*]] = call i8 addrspace(1)* @to_global(i8 addrspace(4)* %[[ARG]]) 23*67e74705SXin Li //CHECK: %{{.*}} = bitcast i8 addrspace(1)* %[[RET]] to i32 addrspace(1)* 24*67e74705SXin Li glob = to_global(loc); 25*67e74705SXin Li 26*67e74705SXin Li //CHECK: %[[ARG:.*]] = addrspacecast i32* %{{.*}} to i8 addrspace(4)* 27*67e74705SXin Li //CHECK: %[[RET:.*]] = call i8 addrspace(1)* @to_global(i8 addrspace(4)* %[[ARG]]) 28*67e74705SXin Li //CHECK: %{{.*}} = bitcast i8 addrspace(1)* %[[RET]] to i32 addrspace(1)* 29*67e74705SXin Li glob = to_global(priv); 30*67e74705SXin Li 31*67e74705SXin Li //CHECK: %[[ARG:.*]] = bitcast i32 addrspace(4)* %{{.*}} to i8 addrspace(4)* 32*67e74705SXin Li //CHECK: %[[RET:.*]] = call i8 addrspace(1)* @to_global(i8 addrspace(4)* %[[ARG]]) 33*67e74705SXin Li //CHECK: %{{.*}} = bitcast i8 addrspace(1)* %[[RET]] to i32 addrspace(1)* 34*67e74705SXin Li glob = to_global(gen); 35*67e74705SXin Li 36*67e74705SXin Li //CHECK: %[[ARG:.*]] = addrspacecast i32 addrspace(1)* %{{.*}} to i8 addrspace(4)* 37*67e74705SXin Li //CHECK: %[[RET:.*]] = call i8 addrspace(3)* @to_local(i8 addrspace(4)* %[[ARG]]) 38*67e74705SXin Li //CHECK: %{{.*}} = bitcast i8 addrspace(3)* %[[RET]] to i32 addrspace(3)* 39*67e74705SXin Li loc = to_local(glob); 40*67e74705SXin Li 41*67e74705SXin Li //CHECK: %[[ARG:.*]] = addrspacecast i32 addrspace(3)* %{{.*}} to i8 addrspace(4)* 42*67e74705SXin Li //CHECK: %[[RET:.*]] = call i8 addrspace(3)* @to_local(i8 addrspace(4)* %[[ARG]]) 43*67e74705SXin Li //CHECK: %{{.*}} = bitcast i8 addrspace(3)* %[[RET]] to i32 addrspace(3)* 44*67e74705SXin Li loc = to_local(loc); 45*67e74705SXin Li 46*67e74705SXin Li //CHECK: %[[ARG:.*]] = addrspacecast i32* %{{.*}} to i8 addrspace(4)* 47*67e74705SXin Li //CHECK: %[[RET:.*]] = call i8 addrspace(3)* @to_local(i8 addrspace(4)* %[[ARG]]) 48*67e74705SXin Li //CHECK: %{{.*}} = bitcast i8 addrspace(3)* %[[RET]] to i32 addrspace(3)* 49*67e74705SXin Li loc = to_local(priv); 50*67e74705SXin Li 51*67e74705SXin Li //CHECK: %[[ARG:.*]] = bitcast i32 addrspace(4)* %{{.*}} to i8 addrspace(4)* 52*67e74705SXin Li //CHECK: %[[RET:.*]] = call i8 addrspace(3)* @to_local(i8 addrspace(4)* %[[ARG]]) 53*67e74705SXin Li //CHECK: %{{.*}} = bitcast i8 addrspace(3)* %[[RET]] to i32 addrspace(3)* 54*67e74705SXin Li loc = to_local(gen); 55*67e74705SXin Li 56*67e74705SXin Li //CHECK: %[[ARG:.*]] = addrspacecast i32 addrspace(1)* %{{.*}} to i8 addrspace(4)* 57*67e74705SXin Li //CHECK: %[[RET:.*]] = call i8* @to_private(i8 addrspace(4)* %[[ARG]]) 58*67e74705SXin Li //CHECK: %{{.*}} = bitcast i8* %[[RET]] to i32* 59*67e74705SXin Li priv = to_private(glob); 60*67e74705SXin Li 61*67e74705SXin Li //CHECK: %[[ARG:.*]] = addrspacecast i32 addrspace(3)* %{{.*}} to i8 addrspace(4)* 62*67e74705SXin Li //CHECK: %[[RET:.*]] = call i8* @to_private(i8 addrspace(4)* %[[ARG]]) 63*67e74705SXin Li //CHECK: %{{.*}} = bitcast i8* %[[RET]] to i32* 64*67e74705SXin Li priv = to_private(loc); 65*67e74705SXin Li 66*67e74705SXin Li //CHECK: %[[ARG:.*]] = addrspacecast i32* %{{.*}} to i8 addrspace(4)* 67*67e74705SXin Li //CHECK: %[[RET:.*]] = call i8* @to_private(i8 addrspace(4)* %[[ARG]]) 68*67e74705SXin Li //CHECK: %{{.*}} = bitcast i8* %[[RET]] to i32* 69*67e74705SXin Li priv = to_private(priv); 70*67e74705SXin Li 71*67e74705SXin Li //CHECK: %[[ARG:.*]] = bitcast i32 addrspace(4)* %{{.*}} to i8 addrspace(4)* 72*67e74705SXin Li //CHECK: %[[RET:.*]] = call i8* @to_private(i8 addrspace(4)* %[[ARG]]) 73*67e74705SXin Li //CHECK: %{{.*}} = bitcast i8* %[[RET]] to i32* 74*67e74705SXin Li priv = to_private(gen); 75*67e74705SXin Li 76*67e74705SXin Li //CHECK: %[[ARG:.*]] = addrspacecast %[[A]]* %{{.*}} to i8 addrspace(4)* 77*67e74705SXin Li //CHECK: %[[RET:.*]] = call i8 addrspace(1)* @to_global(i8 addrspace(4)* %[[ARG]]) 78*67e74705SXin Li //CHECK: %{{.*}} = bitcast i8 addrspace(1)* %[[RET]] to %[[A]] addrspace(1)* 79*67e74705SXin Li PA pA; 80*67e74705SXin Li GA gA = to_global(pA); 81*67e74705SXin Li 82*67e74705SXin Li //CHECK-NOT: addrspacecast 83*67e74705SXin Li //CHECK-NOT: bitcast 84*67e74705SXin Li //CHECK: call i8 addrspace(1)* @to_global(i8 addrspace(4)* %{{.*}}) 85*67e74705SXin Li //CHECK-NOT: addrspacecast 86*67e74705SXin Li //CHECK-NOT: bitcast 87*67e74705SXin Li generic void *gen_v; 88*67e74705SXin Li global void *glob_v = to_global(gen_v); 89*67e74705SXin Li} 90