1*8468e674SAndrey Tretyakov; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s 2*8468e674SAndrey Tretyakov 3*8468e674SAndrey Tretyakov; CHECK: OpEntryPoint Kernel %[[#f1:]] "global_check" %[[#var0:]] %[[#var1:]] %[[#var2:]] %[[#var3:]] 4*8468e674SAndrey Tretyakov; CHECK: OpEntryPoint Kernel %[[#f2:]] "writer" %[[#var0:]] %[[#var1:]] %[[#var2:]] %[[#var3:]] 5*8468e674SAndrey Tretyakov; CHECK: OpEntryPoint Kernel %[[#f3:]] "reader" %[[#var0:]] %[[#var1:]] %[[#var2:]] %[[#var3:]] 6*8468e674SAndrey Tretyakov; CHECK-DAG: OpName %[[#var0]] 7*8468e674SAndrey Tretyakov; CHECK-DAG: OpName %[[#var1]] 8*8468e674SAndrey Tretyakov; CHECK-DAG: OpName %[[#var2]] 9*8468e674SAndrey Tretyakov; CHECK-DAG: OpName %[[#var3]] 10*8468e674SAndrey Tretyakov@var = addrspace(1) global <2 x i8> zeroinitializer, align 2 11*8468e674SAndrey Tretyakov@g_var = addrspace(1) global <2 x i8> zeroinitializer, align 2 12*8468e674SAndrey Tretyakov@a_var = addrspace(1) global [2 x <2 x i8>] zeroinitializer, align 2 13*8468e674SAndrey Tretyakov@p_var = addrspace(1) global <2 x i8> addrspace(1)* null, align 8 14*8468e674SAndrey Tretyakov 15*8468e674SAndrey Tretyakovdefine spir_func <2 x i8> @from_buf(<2 x i8> %a) { 16*8468e674SAndrey Tretyakoventry: 17*8468e674SAndrey Tretyakov ret <2 x i8> %a 18*8468e674SAndrey Tretyakov} 19*8468e674SAndrey Tretyakov 20*8468e674SAndrey Tretyakovdefine spir_func <2 x i8> @to_buf(<2 x i8> %a) { 21*8468e674SAndrey Tretyakoventry: 22*8468e674SAndrey Tretyakov ret <2 x i8> %a 23*8468e674SAndrey Tretyakov} 24*8468e674SAndrey Tretyakov 25*8468e674SAndrey Tretyakovdefine spir_kernel void @global_check(i32 addrspace(1)* %out) { 26*8468e674SAndrey Tretyakoventry: 27*8468e674SAndrey Tretyakov %0 = load <2 x i8>, <2 x i8> addrspace(1)* @var, align 2 28*8468e674SAndrey Tretyakov %cmp = icmp eq <2 x i8> %0, zeroinitializer 29*8468e674SAndrey Tretyakov %sext = select <2 x i1> %cmp, <2 x i8> <i8 -1, i8 -1>, <2 x i8> zeroinitializer 30*8468e674SAndrey Tretyakov %cast = icmp slt <2 x i8> %sext, zeroinitializer 31*8468e674SAndrey Tretyakov %i1promo = zext <2 x i1> %cast to <2 x i8> 32*8468e674SAndrey Tretyakov %call1 = call spir_func i1 @OpAll_v2i8(<2 x i8> %i1promo) 33*8468e674SAndrey Tretyakov %call = select i1 %call1, i32 1, i32 0 34*8468e674SAndrey Tretyakov %1 = and i8 1, 1 35*8468e674SAndrey Tretyakov %tobool = icmp ne i8 %1, 0 36*8468e674SAndrey Tretyakov %conv = select i1 %tobool, i32 1, i32 0 37*8468e674SAndrey Tretyakov %and = and i32 %conv, %call 38*8468e674SAndrey Tretyakov %tobool1 = icmp ne i32 %and, 0 39*8468e674SAndrey Tretyakov %frombool = select i1 %tobool1, i8 1, i8 0 40*8468e674SAndrey Tretyakov %2 = load <2 x i8>, <2 x i8> addrspace(1)* @g_var, align 2 41*8468e674SAndrey Tretyakov %cmp2 = icmp eq <2 x i8> %2, zeroinitializer 42*8468e674SAndrey Tretyakov %sext3 = select <2 x i1> %cmp2, <2 x i8> <i8 -1, i8 -1>, <2 x i8> zeroinitializer 43*8468e674SAndrey Tretyakov %cast2 = icmp slt <2 x i8> %sext3, zeroinitializer 44*8468e674SAndrey Tretyakov %i1promo1 = zext <2 x i1> %cast2 to <2 x i8> 45*8468e674SAndrey Tretyakov %call43 = call spir_func i1 @OpAll_v2i8(<2 x i8> %i1promo1) 46*8468e674SAndrey Tretyakov %call4 = select i1 %call43, i32 1, i32 0 47*8468e674SAndrey Tretyakov %3 = and i8 %frombool, 1 48*8468e674SAndrey Tretyakov %tobool5 = icmp ne i8 %3, 0 49*8468e674SAndrey Tretyakov %conv6 = select i1 %tobool5, i32 1, i32 0 50*8468e674SAndrey Tretyakov %and7 = and i32 %conv6, %call4 51*8468e674SAndrey Tretyakov %tobool8 = icmp ne i32 %and7, 0 52*8468e674SAndrey Tretyakov %frombool9 = select i1 %tobool8, i8 1, i8 0 53*8468e674SAndrey Tretyakov %4 = getelementptr inbounds [2 x <2 x i8>], [2 x <2 x i8>] addrspace(1)* @a_var, i64 0, i64 0 54*8468e674SAndrey Tretyakov %5 = load <2 x i8>, <2 x i8> addrspace(1)* %4, align 2 55*8468e674SAndrey Tretyakov %cmp10 = icmp eq <2 x i8> %5, zeroinitializer 56*8468e674SAndrey Tretyakov %sext11 = select <2 x i1> %cmp10, <2 x i8> <i8 -1, i8 -1>, <2 x i8> zeroinitializer 57*8468e674SAndrey Tretyakov %cast4 = icmp slt <2 x i8> %sext11, zeroinitializer 58*8468e674SAndrey Tretyakov %i1promo2 = zext <2 x i1> %cast4 to <2 x i8> 59*8468e674SAndrey Tretyakov %call125 = call spir_func i1 @OpAll_v2i8(<2 x i8> %i1promo2) 60*8468e674SAndrey Tretyakov %call12 = select i1 %call125, i32 1, i32 0 61*8468e674SAndrey Tretyakov %6 = and i8 %frombool9, 1 62*8468e674SAndrey Tretyakov %tobool13 = icmp ne i8 %6, 0 63*8468e674SAndrey Tretyakov %conv14 = select i1 %tobool13, i32 1, i32 0 64*8468e674SAndrey Tretyakov %and15 = and i32 %conv14, %call12 65*8468e674SAndrey Tretyakov %tobool16 = icmp ne i32 %and15, 0 66*8468e674SAndrey Tretyakov %frombool17 = select i1 %tobool16, i8 1, i8 0 67*8468e674SAndrey Tretyakov %7 = getelementptr inbounds [2 x <2 x i8>], [2 x <2 x i8>] addrspace(1)* @a_var, i64 0, i64 1 68*8468e674SAndrey Tretyakov %8 = load <2 x i8>, <2 x i8> addrspace(1)* %7, align 2 69*8468e674SAndrey Tretyakov %cmp18 = icmp eq <2 x i8> %8, zeroinitializer 70*8468e674SAndrey Tretyakov %sext19 = select <2 x i1> %cmp18, <2 x i8> <i8 -1, i8 -1>, <2 x i8> zeroinitializer 71*8468e674SAndrey Tretyakov %cast6 = icmp slt <2 x i8> %sext19, zeroinitializer 72*8468e674SAndrey Tretyakov %i1promo3 = zext <2 x i1> %cast6 to <2 x i8> 73*8468e674SAndrey Tretyakov %call207 = call spir_func i1 @OpAll_v2i8(<2 x i8> %i1promo3) 74*8468e674SAndrey Tretyakov %call20 = select i1 %call207, i32 1, i32 0 75*8468e674SAndrey Tretyakov %9 = and i8 %frombool17, 1 76*8468e674SAndrey Tretyakov %tobool21 = icmp ne i8 %9, 0 77*8468e674SAndrey Tretyakov %conv22 = select i1 %tobool21, i32 1, i32 0 78*8468e674SAndrey Tretyakov %and23 = and i32 %conv22, %call20 79*8468e674SAndrey Tretyakov %tobool24 = icmp ne i32 %and23, 0 80*8468e674SAndrey Tretyakov %frombool25 = select i1 %tobool24, i8 1, i8 0 81*8468e674SAndrey Tretyakov %10 = load <2 x i8> addrspace(1)*, <2 x i8> addrspace(1)* addrspace(1)* @p_var, align 8 82*8468e674SAndrey Tretyakov %11 = ptrtoint <2 x i8> addrspace(1)* %10 to i64 83*8468e674SAndrey Tretyakov %12 = ptrtoint <2 x i8> addrspace(1)* null to i64 84*8468e674SAndrey Tretyakov %cmp26 = icmp eq i64 %11, %12 85*8468e674SAndrey Tretyakov %conv27 = select i1 %cmp26, i32 1, i32 0 86*8468e674SAndrey Tretyakov %13 = and i8 %frombool25, 1 87*8468e674SAndrey Tretyakov %tobool28 = icmp ne i8 %13, 0 88*8468e674SAndrey Tretyakov %conv29 = select i1 %tobool28, i32 1, i32 0 89*8468e674SAndrey Tretyakov %and30 = and i32 %conv29, %conv27 90*8468e674SAndrey Tretyakov %tobool31 = icmp ne i32 %and30, 0 91*8468e674SAndrey Tretyakov %frombool32 = select i1 %tobool31, i8 1, i8 0 92*8468e674SAndrey Tretyakov %14 = and i8 %frombool32, 1 93*8468e674SAndrey Tretyakov %tobool33 = icmp ne i8 %14, 0 94*8468e674SAndrey Tretyakov %15 = select i1 %tobool33, i64 1, i64 0 95*8468e674SAndrey Tretyakov %cond = select i1 %tobool33, i32 1, i32 0 96*8468e674SAndrey Tretyakov store i32 %cond, i32 addrspace(1)* %out, align 4 97*8468e674SAndrey Tretyakov ret void 98*8468e674SAndrey Tretyakov} 99*8468e674SAndrey Tretyakov 100*8468e674SAndrey Tretyakovdeclare spir_func i1 @OpAll_v2i8(<2 x i8>) 101*8468e674SAndrey Tretyakov 102*8468e674SAndrey Tretyakovdefine spir_kernel void @writer(<2 x i8> addrspace(1)* %src, i32 %idx) { 103*8468e674SAndrey Tretyakoventry: 104*8468e674SAndrey Tretyakov %arrayidx = getelementptr inbounds <2 x i8>, <2 x i8> addrspace(1)* %src, i64 0 105*8468e674SAndrey Tretyakov %0 = load <2 x i8>, <2 x i8> addrspace(1)* %arrayidx, align 2 106*8468e674SAndrey Tretyakov %call = call spir_func <2 x i8> @from_buf(<2 x i8> %0) 107*8468e674SAndrey Tretyakov store <2 x i8> %call, <2 x i8> addrspace(1)* @var, align 2 108*8468e674SAndrey Tretyakov %arrayidx1 = getelementptr inbounds <2 x i8>, <2 x i8> addrspace(1)* %src, i64 1 109*8468e674SAndrey Tretyakov %1 = load <2 x i8>, <2 x i8> addrspace(1)* %arrayidx1, align 2 110*8468e674SAndrey Tretyakov %call2 = call spir_func <2 x i8> @from_buf(<2 x i8> %1) 111*8468e674SAndrey Tretyakov store <2 x i8> %call2, <2 x i8> addrspace(1)* @g_var, align 2 112*8468e674SAndrey Tretyakov %arrayidx3 = getelementptr inbounds <2 x i8>, <2 x i8> addrspace(1)* %src, i64 2 113*8468e674SAndrey Tretyakov %2 = load <2 x i8>, <2 x i8> addrspace(1)* %arrayidx3, align 2 114*8468e674SAndrey Tretyakov %call4 = call spir_func <2 x i8> @from_buf(<2 x i8> %2) 115*8468e674SAndrey Tretyakov %3 = getelementptr inbounds [2 x <2 x i8>], [2 x <2 x i8>] addrspace(1)* @a_var, i64 0, i64 0 116*8468e674SAndrey Tretyakov store <2 x i8> %call4, <2 x i8> addrspace(1)* %3, align 2 117*8468e674SAndrey Tretyakov %arrayidx5 = getelementptr inbounds <2 x i8>, <2 x i8> addrspace(1)* %src, i64 3 118*8468e674SAndrey Tretyakov %4 = load <2 x i8>, <2 x i8> addrspace(1)* %arrayidx5, align 2 119*8468e674SAndrey Tretyakov %call6 = call spir_func <2 x i8> @from_buf(<2 x i8> %4) 120*8468e674SAndrey Tretyakov %5 = getelementptr inbounds [2 x <2 x i8>], [2 x <2 x i8>] addrspace(1)* @a_var, i64 0, i64 1 121*8468e674SAndrey Tretyakov store <2 x i8> %call6, <2 x i8> addrspace(1)* %5, align 2 122*8468e674SAndrey Tretyakov %idx.ext = zext i32 %idx to i64 123*8468e674SAndrey Tretyakov %add.ptr = getelementptr inbounds <2 x i8>, <2 x i8> addrspace(1)* %3, i64 %idx.ext 124*8468e674SAndrey Tretyakov store <2 x i8> addrspace(1)* %add.ptr, <2 x i8> addrspace(1)* addrspace(1)* @p_var, align 8 125*8468e674SAndrey Tretyakov ret void 126*8468e674SAndrey Tretyakov} 127*8468e674SAndrey Tretyakov 128*8468e674SAndrey Tretyakovdefine spir_kernel void @reader(<2 x i8> addrspace(1)* %dest, <2 x i8> %ptr_write_val) { 129*8468e674SAndrey Tretyakoventry: 130*8468e674SAndrey Tretyakov %call = call spir_func <2 x i8> @from_buf(<2 x i8> %ptr_write_val) 131*8468e674SAndrey Tretyakov %0 = load <2 x i8> addrspace(1)*, <2 x i8> addrspace(1)* addrspace(1)* @p_var, align 8 132*8468e674SAndrey Tretyakov store <2 x i8> %call, <2 x i8> addrspace(1)* %0, align 2 133*8468e674SAndrey Tretyakov %1 = load <2 x i8>, <2 x i8> addrspace(1)* @var, align 2 134*8468e674SAndrey Tretyakov %call1 = call spir_func <2 x i8> @to_buf(<2 x i8> %1) 135*8468e674SAndrey Tretyakov %arrayidx = getelementptr inbounds <2 x i8>, <2 x i8> addrspace(1)* %dest, i64 0 136*8468e674SAndrey Tretyakov store <2 x i8> %call1, <2 x i8> addrspace(1)* %arrayidx, align 2 137*8468e674SAndrey Tretyakov %2 = load <2 x i8>, <2 x i8> addrspace(1)* @g_var, align 2 138*8468e674SAndrey Tretyakov %call2 = call spir_func <2 x i8> @to_buf(<2 x i8> %2) 139*8468e674SAndrey Tretyakov %arrayidx3 = getelementptr inbounds <2 x i8>, <2 x i8> addrspace(1)* %dest, i64 1 140*8468e674SAndrey Tretyakov store <2 x i8> %call2, <2 x i8> addrspace(1)* %arrayidx3, align 2 141*8468e674SAndrey Tretyakov %3 = getelementptr inbounds [2 x <2 x i8>], [2 x <2 x i8>] addrspace(1)* @a_var, i64 0, i64 0 142*8468e674SAndrey Tretyakov %4 = load <2 x i8>, <2 x i8> addrspace(1)* %3, align 2 143*8468e674SAndrey Tretyakov %call4 = call spir_func <2 x i8> @to_buf(<2 x i8> %4) 144*8468e674SAndrey Tretyakov %arrayidx5 = getelementptr inbounds <2 x i8>, <2 x i8> addrspace(1)* %dest, i64 2 145*8468e674SAndrey Tretyakov store <2 x i8> %call4, <2 x i8> addrspace(1)* %arrayidx5, align 2 146*8468e674SAndrey Tretyakov %5 = getelementptr inbounds [2 x <2 x i8>], [2 x <2 x i8>] addrspace(1)* @a_var, i64 0, i64 1 147*8468e674SAndrey Tretyakov %6 = load <2 x i8>, <2 x i8> addrspace(1)* %5, align 2 148*8468e674SAndrey Tretyakov %call6 = call spir_func <2 x i8> @to_buf(<2 x i8> %6) 149*8468e674SAndrey Tretyakov %arrayidx7 = getelementptr inbounds <2 x i8>, <2 x i8> addrspace(1)* %dest, i64 3 150*8468e674SAndrey Tretyakov store <2 x i8> %call6, <2 x i8> addrspace(1)* %arrayidx7, align 2 151*8468e674SAndrey Tretyakov ret void 152*8468e674SAndrey Tretyakov} 153