xref: /llvm-project/llvm/test/CodeGen/SPIRV/transcoding/sub_group_non_uniform_vote.ll (revision 24cee1c41c05c9e934e46c4aa48e88caaba29786)
1;; #pragma OPENCL EXTENSION cl_khr_subgroup_non_uniform_vote : enable
2;;
3;; kernel void testSubGroupElect(global int* dst) {
4;; 	dst[0] = sub_group_elect();
5;; }
6;;
7;; kernel void testSubGroupNonUniformAll(global int* dst) {
8;; 	dst[0] = sub_group_non_uniform_all(0);
9;; }
10;;
11;; kernel void testSubGroupNonUniformAny(global int* dst) {
12;; 	dst[0] = sub_group_non_uniform_any(0);
13;; }
14;;
15;; #pragma OPENCL EXTENSION cl_khr_fp16 : enable
16;; #pragma OPENCL EXTENSION cl_khr_fp64 : enable
17;; kernel void testSubGroupNonUniformAllEqual(global int* dst) {
18;;     {
19;;         char v = 0;
20;;         dst[0] = sub_group_non_uniform_all_equal( v );
21;;     }
22;;     {
23;;         uchar v = 0;
24;;         dst[0] = sub_group_non_uniform_all_equal( v );
25;;     }
26;;     {
27;;         short v = 0;
28;;         dst[0] = sub_group_non_uniform_all_equal( v );
29;;     }
30;;     {
31;;         ushort v = 0;
32;;         dst[0] = sub_group_non_uniform_all_equal( v );
33;;     }
34;;     {
35;;         int v = 0;
36;;         dst[0] = sub_group_non_uniform_all_equal( v );
37;;     }
38;;     {
39;;         uint v = 0;
40;;         dst[0] = sub_group_non_uniform_all_equal( v );
41;;     }
42;;     {
43;;         long v = 0;
44;;         dst[0] = sub_group_non_uniform_all_equal( v );
45;;     }
46;;     {
47;;         ulong v = 0;
48;;         dst[0] = sub_group_non_uniform_all_equal( v );
49;;     }
50;;     {
51;;         float v = 0;
52;;         dst[0] = sub_group_non_uniform_all_equal( v );
53;;     }
54;;     {
55;;         half v = 0;
56;;         dst[0] = sub_group_non_uniform_all_equal( v );
57;;     }
58;;     {
59;;         double v = 0;
60;;         dst[0] = sub_group_non_uniform_all_equal( v );
61;;     }
62;; }
63
64; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV
65
66; CHECK-SPIRV-DAG: OpCapability GroupNonUniformVote
67
68; CHECK-SPIRV-DAG: %[[#bool:]] = OpTypeBool
69; CHECK-SPIRV-DAG: %[[#char:]] = OpTypeInt 8 0
70; CHECK-SPIRV-DAG: %[[#short:]] = OpTypeInt 16 0
71; CHECK-SPIRV-DAG: %[[#int:]] = OpTypeInt 32 0
72; CHECK-SPIRV-DAG: %[[#long:]] = OpTypeInt 64 0
73; CHECK-SPIRV-DAG: %[[#half:]] = OpTypeFloat 16
74; CHECK-SPIRV-DAG: %[[#float:]] = OpTypeFloat 32
75; CHECK-SPIRV-DAG: %[[#double:]] = OpTypeFloat 64
76
77; CHECK-SPIRV-DAG: %[[#false:]] = OpConstantFalse %[[#bool]]
78; CHECK-SPIRV-DAG: %[[#true:]] = OpConstantTrue %[[#bool]]
79; CHECK-SPIRV-DAG: %[[#ScopeSubgroup:]] = OpConstant %[[#int]] 3
80; CHECK-SPIRV-DAG: %[[#char_0:]] = OpConstant %[[#char]] 0
81; CHECK-SPIRV-DAG: %[[#char_10:]] = OpConstant %[[#char]] 10
82; CHECK-SPIRV-DAG: %[[#short_0:]] = OpConstant %[[#short]] 0
83; CHECK-SPIRV-DAG: %[[#int_0:]] = OpConstant %[[#int]] 0
84; CHECK-SPIRV-DAG: %[[#long_0:]] = OpConstantNull %[[#long]]
85; CHECK-SPIRV-DAG: %[[#half_0:]] = OpConstant %[[#half]] 0
86; CHECK-SPIRV-DAG: %[[#float_0:]] = OpConstant %[[#float]] 0
87; CHECK-SPIRV-DAG: %[[#double_0:]] = OpConstant %[[#double]] 0
88
89; CHECK-SPIRV: OpFunction
90; CHECK-SPIRV: %[[#]] = OpGroupNonUniformElect %[[#bool]] %[[#ScopeSubgroup]]
91; CHECK-SPIRV: %[[#]] = OpGroupNonUniformElect %[[#bool]] %[[#ScopeSubgroup]]
92; CHECK-SPIRV: OpFunctionEnd
93
94define dso_local spir_kernel void @testSubGroupElect(i32 addrspace(1)* nocapture) local_unnamed_addr {
95  %2 = tail call spir_func i32 @_Z15sub_group_electv()
96  %r2 = tail call spir_func i1 @__spirv_GroupNonUniformElect(i32 3)
97  store i32 %2, i32 addrspace(1)* %0, align 4
98  ret void
99}
100
101declare dso_local spir_func i32 @_Z15sub_group_electv() local_unnamed_addr
102declare dso_local spir_func i1 @__spirv_GroupNonUniformElect(i32)
103
104; CHECK-SPIRV: OpFunction
105; CHECK-SPIRV: %[[#]] = OpGroupNonUniformAll %[[#bool]] %[[#ScopeSubgroup]] %[[#false]]
106; CHECK-SPIRV: %[[#]] = OpGroupNonUniformAll %[[#bool]] %[[#ScopeSubgroup]] %[[#true]]
107; CHECK-SPIRV: OpFunctionEnd
108
109define dso_local spir_kernel void @testSubGroupNonUniformAll(i32 addrspace(1)* nocapture) local_unnamed_addr {
110  %2 = tail call spir_func i32 @_Z25sub_group_non_uniform_alli(i32 0)
111  %r2 = tail call spir_func i1 @__spirv_GroupNonUniformAll(i32 3, i1 true)
112  store i32 %2, i32 addrspace(1)* %0, align 4
113  ret void
114}
115
116declare dso_local spir_func i32 @_Z25sub_group_non_uniform_alli(i32) local_unnamed_addr
117declare dso_local spir_func i1 @__spirv_GroupNonUniformAll(i32, i1)
118
119; CHECK-SPIRV: OpFunction
120; CHECK-SPIRV: %[[#]] = OpGroupNonUniformAny %[[#bool]] %[[#ScopeSubgroup]] %[[#false]]
121; CHECK-SPIRV: %[[#]] = OpGroupNonUniformAny %[[#bool]] %[[#ScopeSubgroup]] %[[#true]]
122; CHECK-SPIRV: OpFunctionEnd
123
124define dso_local spir_kernel void @testSubGroupNonUniformAny(i32 addrspace(1)* nocapture) local_unnamed_addr {
125  %2 = tail call spir_func i32 @_Z25sub_group_non_uniform_anyi(i32 0)
126  %r2 = tail call spir_func i1 @__spirv_GroupNonUniformAny(i32 3, i1 true)
127  store i32 %2, i32 addrspace(1)* %0, align 4
128  ret void
129}
130
131declare dso_local spir_func i32 @_Z25sub_group_non_uniform_anyi(i32) local_unnamed_addr
132declare dso_local spir_func i1 @__spirv_GroupNonUniformAny(i32, i1)
133
134; CHECK-SPIRV: OpFunction
135; CHECK-SPIRV: %[[#]] = OpGroupNonUniformAllEqual %[[#bool]] %[[#ScopeSubgroup]] %[[#char_0]]
136; CHECK-SPIRV: %[[#]] = OpGroupNonUniformAllEqual %[[#bool]] %[[#ScopeSubgroup]] %[[#char_10]]
137; CHECK-SPIRV: %[[#]] = OpGroupNonUniformAllEqual %[[#bool]] %[[#ScopeSubgroup]] %[[#char_0]]
138; CHECK-SPIRV: %[[#]] = OpGroupNonUniformAllEqual %[[#bool]] %[[#ScopeSubgroup]] %[[#short_0]]
139; CHECK-SPIRV: %[[#]] = OpGroupNonUniformAllEqual %[[#bool]] %[[#ScopeSubgroup]] %[[#short_0]]
140; CHECK-SPIRV: %[[#]] = OpGroupNonUniformAllEqual %[[#bool]] %[[#ScopeSubgroup]] %[[#int_0]]
141; CHECK-SPIRV: %[[#]] = OpGroupNonUniformAllEqual %[[#bool]] %[[#ScopeSubgroup]] %[[#int_0]]
142; CHECK-SPIRV: %[[#]] = OpGroupNonUniformAllEqual %[[#bool]] %[[#ScopeSubgroup]] %[[#long_0]]
143; CHECK-SPIRV: %[[#]] = OpGroupNonUniformAllEqual %[[#bool]] %[[#ScopeSubgroup]] %[[#long_0]]
144; CHECK-SPIRV: %[[#]] = OpGroupNonUniformAllEqual %[[#bool]] %[[#ScopeSubgroup]] %[[#float_0]]
145; CHECK-SPIRV: %[[#]] = OpGroupNonUniformAllEqual %[[#bool]] %[[#ScopeSubgroup]] %[[#half_0]]
146; CHECK-SPIRV: %[[#]] = OpGroupNonUniformAllEqual %[[#bool]] %[[#ScopeSubgroup]] %[[#double_0]]
147; CHECK-SPIRV: OpFunctionEnd
148
149define dso_local spir_kernel void @testSubGroupNonUniformAllEqual(i32 addrspace(1)* nocapture) local_unnamed_addr {
150  %2 = tail call spir_func i32 @_Z31sub_group_non_uniform_all_equalc(i8 signext 0)
151  %r2 = tail call spir_func i1 @__spirv_GroupNonUniformAllEqual(i32 3, i8 signext 10)
152  store i32 %2, i32 addrspace(1)* %0, align 4
153  %3 = tail call spir_func i32 @_Z31sub_group_non_uniform_all_equalh(i8 zeroext 0)
154  store i32 %3, i32 addrspace(1)* %0, align 4
155  %4 = tail call spir_func i32 @_Z31sub_group_non_uniform_all_equals(i16 signext 0)
156  store i32 %4, i32 addrspace(1)* %0, align 4
157  %5 = tail call spir_func i32 @_Z31sub_group_non_uniform_all_equalt(i16 zeroext 0)
158  store i32 %5, i32 addrspace(1)* %0, align 4
159  %6 = tail call spir_func i32 @_Z31sub_group_non_uniform_all_equali(i32 0)
160  store i32 %6, i32 addrspace(1)* %0, align 4
161  %7 = tail call spir_func i32 @_Z31sub_group_non_uniform_all_equalj(i32 0)
162  store i32 %7, i32 addrspace(1)* %0, align 4
163  %8 = tail call spir_func i32 @_Z31sub_group_non_uniform_all_equall(i64 0)
164  store i32 %8, i32 addrspace(1)* %0, align 4
165  %9 = tail call spir_func i32 @_Z31sub_group_non_uniform_all_equalm(i64 0)
166  store i32 %9, i32 addrspace(1)* %0, align 4
167  %10 = tail call spir_func i32 @_Z31sub_group_non_uniform_all_equalf(float 0.000000e+00)
168  store i32 %10, i32 addrspace(1)* %0, align 4
169  %11 = tail call spir_func i32 @_Z31sub_group_non_uniform_all_equalDh(half 0xH0000)
170  store i32 %11, i32 addrspace(1)* %0, align 4
171  %12 = tail call spir_func i32 @_Z31sub_group_non_uniform_all_equald(double 0.000000e+00)
172  store i32 %12, i32 addrspace(1)* %0, align 4
173  ret void
174}
175
176declare dso_local spir_func i32 @_Z31sub_group_non_uniform_all_equalc(i8 signext) local_unnamed_addr
177declare dso_local spir_func i1 @__spirv_GroupNonUniformAllEqual(i32, i8 signext)
178
179declare dso_local spir_func i32 @_Z31sub_group_non_uniform_all_equalh(i8 zeroext) local_unnamed_addr
180
181declare dso_local spir_func i32 @_Z31sub_group_non_uniform_all_equals(i16 signext) local_unnamed_addr
182
183declare dso_local spir_func i32 @_Z31sub_group_non_uniform_all_equalt(i16 zeroext) local_unnamed_addr
184
185declare dso_local spir_func i32 @_Z31sub_group_non_uniform_all_equali(i32) local_unnamed_addr
186
187declare dso_local spir_func i32 @_Z31sub_group_non_uniform_all_equalj(i32) local_unnamed_addr
188
189declare dso_local spir_func i32 @_Z31sub_group_non_uniform_all_equall(i64) local_unnamed_addr
190
191declare dso_local spir_func i32 @_Z31sub_group_non_uniform_all_equalm(i64) local_unnamed_addr
192
193declare dso_local spir_func i32 @_Z31sub_group_non_uniform_all_equalf(float) local_unnamed_addr
194
195declare dso_local spir_func i32 @_Z31sub_group_non_uniform_all_equalDh(half) local_unnamed_addr
196
197declare dso_local spir_func i32 @_Z31sub_group_non_uniform_all_equald(double) local_unnamed_addr
198