xref: /llvm-project/llvm/test/CodeGen/SPIRV/opencl/basic/progvar_prog_scope_uninit.ll (revision 8468e67495eda83e2490224be46967ddc29821d2)
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