llvm/llvm/test/Other/spirv-sim/wave-read-lane-first.spv

; RUN: %if spirv-tools %{ spirv-as %s -o - | spirv-val - %}
; RUN: spirv-sim --function=simple --wave=4 --expects=0,1,2,0 -i %s

; int simple() {
;   int m[4] = { 0, 1, 2, 0 };
;   int idx = WaveGetLaneIndex();
;   for (int i = 0; i < 4; i++) {
;     if (i == m[idx]) {
;       return WaveReadLaneFirst(idx);
;     }
;   }
;   return 0;
; }
                       OpCapability Shader
                       OpCapability GroupNonUniform
                       OpCapability GroupNonUniformBallot
                       OpMemoryModel Logical GLSL450
                       OpEntryPoint GLCompute %main "main" %WaveIndex
                       OpExecutionMode %main LocalSize 1 1 1
                       OpSource HLSL 670
                       OpName %simple "simple"
                       OpName %main "main"
                       OpDecorate %WaveIndex BuiltIn SubgroupLocalInvocationId
                %int = OpTypeInt 32 1
               %uint = OpTypeInt 32 0
               %bool = OpTypeBool
              %int_0 = OpConstant %int 0
              %int_1 = OpConstant %int 1
              %int_2 = OpConstant %int 2
              %int_4 = OpConstant %int 4
             %uint_3 = OpConstant %uint 3
             %uint_4 = OpConstant %uint 4
               %void = OpTypeVoid
          %main_type = OpTypeFunction %void
        %simple_type = OpTypeFunction %int
          %uint_iptr = OpTypePointer Input %uint
           %int_fptr = OpTypePointer Function %int
     %arr_int_uint_4 = OpTypeArray %int %uint_4
%arr_int_uint_4_fptr = OpTypePointer Function %arr_int_uint_4
          %WaveIndex = OpVariable %uint_iptr Input
               %main = OpFunction %void None %main_type
              %entry = OpLabel
                       OpReturn
                       OpFunctionEnd
             %simple = OpFunction %int None %simple_type
         %bb_entry_0 = OpLabel
                  %m = OpVariable %arr_int_uint_4_fptr Function
                %idx = OpVariable %int_fptr Function
                  %i = OpVariable %int_fptr Function
                 %27 = OpCompositeConstruct %arr_int_uint_4 %int_0 %int_1 %int_2 %int_0
                       OpStore %m %27
                 %28 = OpLoad %uint %WaveIndex
                 %29 = OpBitcast %int %28
                       OpStore %idx %29
                       OpStore %i %int_0
                       OpBranch %for_check
          %for_check = OpLabel
                 %31 = OpLoad %int %i
                 %33 = OpSLessThan %bool %31 %int_4
                       OpLoopMerge %for_merge %for_continue None
                       OpBranchConditional %33 %for_body %for_merge
           %for_body = OpLabel
                 %37 = OpLoad %int %i
                 %38 = OpLoad %int %idx
                 %39 = OpAccessChain %int_fptr %m %38
                 %40 = OpLoad %int %39
                 %41 = OpIEqual %bool %37 %40
                       OpSelectionMerge %if_merge None
                       OpBranchConditional %41 %if_true %if_merge
            %if_true = OpLabel
                 %44 = OpLoad %int %idx
                 %45 = OpGroupNonUniformBroadcastFirst %int %uint_3 %44
                       OpReturnValue %45
           %if_merge = OpLabel
                       OpBranch %for_continue
       %for_continue = OpLabel
                 %47 = OpLoad %int %i
                 %48 = OpIAdd %int %47 %int_1
                       OpStore %i %48
                       OpBranch %for_check
          %for_merge = OpLabel
                       OpReturnValue %int_0
                       OpFunctionEnd