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