305 lines · plain
1;; #pragma OPENCL EXTENSION cl_khr_subgroup_shuffle : enable2;; #pragma OPENCL EXTENSION cl_khr_fp16 : enable3;; #pragma OPENCL EXTENSION cl_khr_fp64 : enable4;;5;; kernel void testShuffleChar(global char* dst)6;; {7;; char v = 0;8;; dst[0] = sub_group_shuffle( v, 0 );9;; dst[1] = sub_group_shuffle_xor( v, 0 );10;; }11;;12;; kernel void testShuffleUChar(global uchar* dst)13;; {14;; uchar v = 0;15;; dst[0] = sub_group_shuffle( v, 0 );16;; dst[1] = sub_group_shuffle_xor( v, 0 );17;; }18;;19;; kernel void testShuffleShort(global short* dst)20;; {21;; short v = 0;22;; dst[0] = sub_group_shuffle( v, 0 );23;; dst[1] = sub_group_shuffle_xor( v, 0 );24;; }25;;26;; kernel void testShuffleUShort(global ushort* dst)27;; {28;; ushort v = 0;29;; dst[0] = sub_group_shuffle( v, 0 );30;; dst[1] = sub_group_shuffle_xor( v, 0 );31;; }32;;33;; kernel void testShuffleInt(global int* dst)34;; {35;; int v = 0;36;; dst[0] = sub_group_shuffle( v, 0 );37;; dst[1] = sub_group_shuffle_xor( v, 0 );38;; }39;;40;; kernel void testShuffleUInt(global uint* dst)41;; {42;; uint v = 0;43;; dst[0] = sub_group_shuffle( v, 0 );44;; dst[1] = sub_group_shuffle_xor( v, 0 );45;; }46;;47;; kernel void testShuffleLong(global long* dst)48;; {49;; long v = 0;50;; dst[0] = sub_group_shuffle( v, 0 );51;; dst[1] = sub_group_shuffle_xor( v, 0 );52;; }53;;54;; kernel void testShuffleULong(global ulong* dst)55;; {56;; ulong v = 0;57;; dst[0] = sub_group_shuffle( v, 0 );58;; dst[1] = sub_group_shuffle_xor( v, 0 );59;; }60;;61;; kernel void testShuffleFloat(global float* dst)62;; {63;; float v = 0;64;; dst[0] = sub_group_shuffle( v, 0 );65;; dst[1] = sub_group_shuffle_xor( v, 0 );66;; }67;;68;; kernel void testShuffleHalf(global half* dst)69;; {70;; half v = 0;71;; dst[0] = sub_group_shuffle( v, 0 );72;; dst[1] = sub_group_shuffle_xor( v, 0 );73;; }74;;75;; kernel void testShuffleDouble(global double* dst)76;; {77;; double v = 0;78;; dst[0] = sub_group_shuffle( v, 0 );79;; dst[1] = sub_group_shuffle_xor( v, 0 );80;; }81 82; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV83; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}84 85; CHECK-SPIRV-DAG: OpCapability GroupNonUniformShuffle86 87; CHECK-SPIRV-DAG: %[[#char:]] = OpTypeInt 8 088; CHECK-SPIRV-DAG: %[[#short:]] = OpTypeInt 16 089; CHECK-SPIRV-DAG: %[[#int:]] = OpTypeInt 32 090; CHECK-SPIRV-DAG: %[[#long:]] = OpTypeInt 64 091; CHECK-SPIRV-DAG: %[[#half:]] = OpTypeFloat 1692; CHECK-SPIRV-DAG: %[[#float:]] = OpTypeFloat 3293; CHECK-SPIRV-DAG: %[[#double:]] = OpTypeFloat 6494 95; CHECK-SPIRV-DAG: %[[#ScopeSubgroup:]] = OpConstant %[[#int]] 3{{$}}96; CHECK-SPIRV-DAG: %[[#char_0:]] = OpConstantNull %[[#char]]97; CHECK-SPIRV-DAG: %[[#short_0:]] = OpConstantNull %[[#short]]98; CHECK-SPIRV-DAG: %[[#int_0:]] = OpConstantNull %[[#int]]99; CHECK-SPIRV-DAG: %[[#long_0:]] = OpConstantNull %[[#long]]100; CHECK-SPIRV-DAG: %[[#half_0:]] = OpConstantNull %[[#half]]101; CHECK-SPIRV-DAG: %[[#float_0:]] = OpConstantNull %[[#float]]102; CHECK-SPIRV-DAG: %[[#double_0:]] = OpConstantNull %[[#double]]103 104; CHECK-SPIRV: OpFunction105; CHECK-SPIRV: %[[#]] = OpGroupNonUniformShuffle %[[#char]] %[[#ScopeSubgroup]] %[[#char_0]] %[[#int_0]]106; CHECK-SPIRV: %[[#]] = OpGroupNonUniformShuffleXor %[[#char]] %[[#ScopeSubgroup]] %[[#char_0]] %[[#int_0]]107; CHECK-SPIRV: OpFunctionEnd108 109define dso_local spir_kernel void @testShuffleChar(i8 addrspace(1)* nocapture) local_unnamed_addr {110 %2 = tail call spir_func signext i8 @_Z17sub_group_shufflecj(i8 signext 0, i32 0)111 %r2 = tail call spir_func signext i8 @__spirv_GroupNonUniformShuffle(i32 3, i8 signext 0, i32 0)112 store i8 %2, i8 addrspace(1)* %0, align 1113 %3 = tail call spir_func signext i8 @_Z21sub_group_shuffle_xorcj(i8 signext 0, i32 0)114 %r3 = tail call spir_func signext i8 @__spirv_GroupNonUniformShuffleXor(i32 3, i8 signext 0, i32 0)115 %4 = getelementptr inbounds i8, i8 addrspace(1)* %0, i64 1116 store i8 %3, i8 addrspace(1)* %4, align 1117 ret void118}119 120declare dso_local spir_func signext i8 @_Z17sub_group_shufflecj(i8 signext, i32) local_unnamed_addr121declare dso_local spir_func signext i8 @__spirv_GroupNonUniformShuffle(i32, i8 signext, i32)122 123declare dso_local spir_func signext i8 @_Z21sub_group_shuffle_xorcj(i8 signext, i32) local_unnamed_addr124declare dso_local spir_func signext i8 @__spirv_GroupNonUniformShuffleXor(i32, i8 signext, i32)125 126; CHECK-SPIRV: OpFunction127; CHECK-SPIRV: %[[#]] = OpGroupNonUniformShuffle %[[#char]] %[[#ScopeSubgroup]] %[[#char_0]] %[[#int_0]]128; CHECK-SPIRV: %[[#]] = OpGroupNonUniformShuffleXor %[[#char]] %[[#ScopeSubgroup]] %[[#char_0]] %[[#int_0]]129; CHECK-SPIRV: OpFunctionEnd130 131define dso_local spir_kernel void @testShuffleUChar(i8 addrspace(1)* nocapture) local_unnamed_addr {132 %2 = tail call spir_func zeroext i8 @_Z17sub_group_shufflehj(i8 zeroext 0, i32 0)133 store i8 %2, i8 addrspace(1)* %0, align 1134 %3 = tail call spir_func zeroext i8 @_Z21sub_group_shuffle_xorhj(i8 zeroext 0, i32 0)135 %4 = getelementptr inbounds i8, i8 addrspace(1)* %0, i64 1136 store i8 %3, i8 addrspace(1)* %4, align 1137 ret void138}139 140declare dso_local spir_func zeroext i8 @_Z17sub_group_shufflehj(i8 zeroext, i32) local_unnamed_addr141 142declare dso_local spir_func zeroext i8 @_Z21sub_group_shuffle_xorhj(i8 zeroext, i32) local_unnamed_addr143 144; CHECK-SPIRV: OpFunction145; CHECK-SPIRV: %[[#]] = OpGroupNonUniformShuffle %[[#short]] %[[#ScopeSubgroup]] %[[#short_0]] %[[#int_0]]146; CHECK-SPIRV: %[[#]] = OpGroupNonUniformShuffleXor %[[#short]] %[[#ScopeSubgroup]] %[[#short_0]] %[[#int_0]]147; CHECK-SPIRV: OpFunctionEnd148 149define dso_local spir_kernel void @testShuffleShort(i16 addrspace(1)* nocapture) local_unnamed_addr {150 %2 = tail call spir_func signext i16 @_Z17sub_group_shufflesj(i16 signext 0, i32 0)151 store i16 %2, i16 addrspace(1)* %0, align 2152 %3 = tail call spir_func signext i16 @_Z21sub_group_shuffle_xorsj(i16 signext 0, i32 0)153 %4 = getelementptr inbounds i16, i16 addrspace(1)* %0, i64 1154 store i16 %3, i16 addrspace(1)* %4, align 2155 ret void156}157 158declare dso_local spir_func signext i16 @_Z17sub_group_shufflesj(i16 signext, i32) local_unnamed_addr159 160declare dso_local spir_func signext i16 @_Z21sub_group_shuffle_xorsj(i16 signext, i32) local_unnamed_addr161 162; CHECK-SPIRV: OpFunction163; CHECK-SPIRV: %[[#]] = OpGroupNonUniformShuffle %[[#short]] %[[#ScopeSubgroup]] %[[#short_0]] %[[#int_0]]164; CHECK-SPIRV: %[[#]] = OpGroupNonUniformShuffleXor %[[#short]] %[[#ScopeSubgroup]] %[[#short_0]] %[[#int_0]]165; CHECK-SPIRV: OpFunctionEnd166 167define dso_local spir_kernel void @testShuffleUShort(i16 addrspace(1)* nocapture) local_unnamed_addr {168 %2 = tail call spir_func zeroext i16 @_Z17sub_group_shuffletj(i16 zeroext 0, i32 0)169 store i16 %2, i16 addrspace(1)* %0, align 2170 %3 = tail call spir_func zeroext i16 @_Z21sub_group_shuffle_xortj(i16 zeroext 0, i32 0)171 %4 = getelementptr inbounds i16, i16 addrspace(1)* %0, i64 1172 store i16 %3, i16 addrspace(1)* %4, align 2173 ret void174}175 176declare dso_local spir_func zeroext i16 @_Z17sub_group_shuffletj(i16 zeroext, i32) local_unnamed_addr177 178declare dso_local spir_func zeroext i16 @_Z21sub_group_shuffle_xortj(i16 zeroext, i32) local_unnamed_addr179 180; CHECK-SPIRV: OpFunction181; CHECK-SPIRV: %[[#]] = OpGroupNonUniformShuffle %[[#int]] %[[#ScopeSubgroup]] %[[#int_0]] %[[#int_0]]182; CHECK-SPIRV: %[[#]] = OpGroupNonUniformShuffleXor %[[#int]] %[[#ScopeSubgroup]] %[[#int_0]] %[[#int_0]]183; CHECK-SPIRV: OpFunctionEnd184 185define dso_local spir_kernel void @testShuffleInt(i32 addrspace(1)* nocapture) local_unnamed_addr {186 %2 = tail call spir_func i32 @_Z17sub_group_shuffleij(i32 0, i32 0)187 store i32 %2, i32 addrspace(1)* %0, align 4188 %3 = tail call spir_func i32 @_Z21sub_group_shuffle_xorij(i32 0, i32 0)189 %4 = getelementptr inbounds i32, i32 addrspace(1)* %0, i64 1190 store i32 %3, i32 addrspace(1)* %4, align 4191 ret void192}193 194declare dso_local spir_func i32 @_Z17sub_group_shuffleij(i32, i32) local_unnamed_addr195 196declare dso_local spir_func i32 @_Z21sub_group_shuffle_xorij(i32, i32) local_unnamed_addr197 198; CHECK-SPIRV: OpFunction199; CHECK-SPIRV: %[[#]] = OpGroupNonUniformShuffle %[[#int]] %[[#ScopeSubgroup]] %[[#int_0]] %[[#int_0]]200; CHECK-SPIRV: %[[#]] = OpGroupNonUniformShuffleXor %[[#int]] %[[#ScopeSubgroup]] %[[#int_0]] %[[#int_0]]201; CHECK-SPIRV: OpFunctionEnd202 203define dso_local spir_kernel void @testShuffleUInt(i32 addrspace(1)* nocapture) local_unnamed_addr {204 %2 = tail call spir_func i32 @_Z17sub_group_shufflejj(i32 0, i32 0)205 store i32 %2, i32 addrspace(1)* %0, align 4206 %3 = tail call spir_func i32 @_Z21sub_group_shuffle_xorjj(i32 0, i32 0)207 %4 = getelementptr inbounds i32, i32 addrspace(1)* %0, i64 1208 store i32 %3, i32 addrspace(1)* %4, align 4209 ret void210}211 212declare dso_local spir_func i32 @_Z17sub_group_shufflejj(i32, i32) local_unnamed_addr213 214declare dso_local spir_func i32 @_Z21sub_group_shuffle_xorjj(i32, i32) local_unnamed_addr215 216; CHECK-SPIRV: OpFunction217; CHECK-SPIRV: %[[#]] = OpGroupNonUniformShuffle %[[#long]] %[[#ScopeSubgroup]] %[[#long_0]] %[[#int_0]]218; CHECK-SPIRV: %[[#]] = OpGroupNonUniformShuffleXor %[[#long]] %[[#ScopeSubgroup]] %[[#long_0]] %[[#int_0]]219; CHECK-SPIRV: OpFunctionEnd220 221define dso_local spir_kernel void @testShuffleLong(i64 addrspace(1)* nocapture) local_unnamed_addr {222 %2 = tail call spir_func i64 @_Z17sub_group_shufflelj(i64 0, i32 0)223 store i64 %2, i64 addrspace(1)* %0, align 8224 %3 = tail call spir_func i64 @_Z21sub_group_shuffle_xorlj(i64 0, i32 0)225 %4 = getelementptr inbounds i64, i64 addrspace(1)* %0, i64 1226 store i64 %3, i64 addrspace(1)* %4, align 8227 ret void228}229 230declare dso_local spir_func i64 @_Z17sub_group_shufflelj(i64, i32) local_unnamed_addr231 232declare dso_local spir_func i64 @_Z21sub_group_shuffle_xorlj(i64, i32) local_unnamed_addr233 234; CHECK-SPIRV: OpFunction235; CHECK-SPIRV: %[[#]] = OpGroupNonUniformShuffle %[[#long]] %[[#ScopeSubgroup]] %[[#long_0]] %[[#int_0]]236; CHECK-SPIRV: %[[#]] = OpGroupNonUniformShuffleXor %[[#long]] %[[#ScopeSubgroup]] %[[#long_0]] %[[#int_0]]237; CHECK-SPIRV: OpFunctionEnd238 239define dso_local spir_kernel void @testShuffleULong(i64 addrspace(1)* nocapture) local_unnamed_addr {240 %2 = tail call spir_func i64 @_Z17sub_group_shufflemj(i64 0, i32 0)241 store i64 %2, i64 addrspace(1)* %0, align 8242 %3 = tail call spir_func i64 @_Z21sub_group_shuffle_xormj(i64 0, i32 0)243 %4 = getelementptr inbounds i64, i64 addrspace(1)* %0, i64 1244 store i64 %3, i64 addrspace(1)* %4, align 8245 ret void246}247 248declare dso_local spir_func i64 @_Z17sub_group_shufflemj(i64, i32) local_unnamed_addr249 250declare dso_local spir_func i64 @_Z21sub_group_shuffle_xormj(i64, i32) local_unnamed_addr251 252; CHECK-SPIRV: OpFunction253; CHECK-SPIRV: %[[#]] = OpGroupNonUniformShuffle %[[#float]] %[[#ScopeSubgroup]] %[[#float_0]] %[[#int_0]]254; CHECK-SPIRV: %[[#]] = OpGroupNonUniformShuffleXor %[[#float]] %[[#ScopeSubgroup]] %[[#float_0]] %[[#int_0]]255; CHECK-SPIRV: OpFunctionEnd256 257define dso_local spir_kernel void @testShuffleFloat(float addrspace(1)* nocapture) local_unnamed_addr {258 %2 = tail call spir_func float @_Z17sub_group_shufflefj(float 0.000000e+00, i32 0)259 store float %2, float addrspace(1)* %0, align 4260 %3 = tail call spir_func float @_Z21sub_group_shuffle_xorfj(float 0.000000e+00, i32 0)261 %4 = getelementptr inbounds float, float addrspace(1)* %0, i64 1262 store float %3, float addrspace(1)* %4, align 4263 ret void264}265 266declare dso_local spir_func float @_Z17sub_group_shufflefj(float, i32) local_unnamed_addr267 268declare dso_local spir_func float @_Z21sub_group_shuffle_xorfj(float, i32) local_unnamed_addr269 270; CHECK-SPIRV: OpFunction271; CHECK-SPIRV: %[[#]] = OpGroupNonUniformShuffle %[[#half]] %[[#ScopeSubgroup]] %[[#half_0]] %[[#int_0]]272; CHECK-SPIRV: %[[#]] = OpGroupNonUniformShuffleXor %[[#half]] %[[#ScopeSubgroup]] %[[#half_0]] %[[#int_0]]273; CHECK-SPIRV: OpFunctionEnd274 275define dso_local spir_kernel void @testShuffleHalf(half addrspace(1)* nocapture) local_unnamed_addr {276 %2 = tail call spir_func half @_Z17sub_group_shuffleDhj(half 0xH0000, i32 0)277 store half %2, half addrspace(1)* %0, align 2278 %3 = tail call spir_func half @_Z21sub_group_shuffle_xorDhj(half 0xH0000, i32 0)279 %4 = getelementptr inbounds half, half addrspace(1)* %0, i64 1280 store half %3, half addrspace(1)* %4, align 2281 ret void282}283 284declare dso_local spir_func half @_Z17sub_group_shuffleDhj(half, i32) local_unnamed_addr285 286declare dso_local spir_func half @_Z21sub_group_shuffle_xorDhj(half, i32) local_unnamed_addr287 288; CHECK-SPIRV: OpFunction289; CHECK-SPIRV: %[[#]] = OpGroupNonUniformShuffle %[[#double]] %[[#ScopeSubgroup]] %[[#double_0]] %[[#int_0]]290; CHECK-SPIRV: %[[#]] = OpGroupNonUniformShuffleXor %[[#double]] %[[#ScopeSubgroup]] %[[#double_0]] %[[#int_0]]291; CHECK-SPIRV: OpFunctionEnd292 293define dso_local spir_kernel void @testShuffleDouble(double addrspace(1)* nocapture) local_unnamed_addr {294 %2 = tail call spir_func double @_Z17sub_group_shuffledj(double 0.000000e+00, i32 0)295 store double %2, double addrspace(1)* %0, align 8296 %3 = tail call spir_func double @_Z21sub_group_shuffle_xordj(double 0.000000e+00, i32 0)297 %4 = getelementptr inbounds double, double addrspace(1)* %0, i64 1298 store double %3, double addrspace(1)* %4, align 8299 ret void300}301 302declare dso_local spir_func double @_Z17sub_group_shuffledj(double, i32) local_unnamed_addr303 304declare dso_local spir_func double @_Z21sub_group_shuffle_xordj(double, i32) local_unnamed_addr305