; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 7
; Bound: 29
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %main "main" %vIndex %FragColor
               OpExecutionMode %main OriginUpperLeft
               OpSource GLSL 450
               OpName %main "main"
               OpName %vIndex "vIndex"
               OpName %FragColor "FragColor"
               OpName %i "i"
               OpName %j "j"
               OpDecorate %vIndex Flat
               OpDecorate %vIndex Location 0
               OpDecorate %FragColor Location 0
       %void = OpTypeVoid
          %3 = OpTypeFunction %void
        %int = OpTypeInt 32 1
       %bool = OpTypeBool
 %int_0 = OpConstant %int 0
 %int_1 = OpConstant %int 1
 %int_2 = OpConstant %int 2
 %int_3 = OpConstant %int 3
%_ptr_Input_int = OpTypePointer Input %int
     %vIndex = OpVariable %_ptr_Input_int Input
      %float = OpTypeFloat 32
    %v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
  %FragColor = OpVariable %_ptr_Output_v4float Output
%_ptr_Function_int = OpTypePointer Function %int
       %main = OpFunction %void None %3
          %header = OpLabel
          %i = OpVariable %_ptr_Function_int Function %int_0
          %j = OpVariable %_ptr_Function_int Function
          %9 = OpLoad %int %vIndex
               OpSelectionMerge %switch_merge None
               OpSwitch %9 %default_case 100 %default_case 0 %case_0 1 %case_1 11 %case_1 2 %case_2 3 %case_3 4 %case_4 5 %case_5

         %case_0 = OpLabel
               OpBranch %default_case

         %default_case = OpLabel
               %default_case_phi = OpPhi %int %int_2 %header %int_3 %case_0
               ; Test what happens when a case block dominates access to a variable.
               OpStore %j %default_case_phi
               OpBranch %case_1

         %case_1 = OpLabel
               ; Test phi nodes between case labels.
               %case_1_phi = OpPhi %int %int_0 %default_case %int_1 %header
               OpStore %j %case_1_phi
               OpBranch %case_2

         %case_2 = OpLabel
               OpBranch %switch_merge

         %case_3 = OpLabel
            ; Conditionally branch to another case block. This is really dumb, but it is apparently legal.
            %case_3_cond = OpSGreaterThan %bool %9 %int_3
            OpBranchConditional %case_3_cond %case_4 %switch_merge

         %case_4 = OpLabel
            ; When emitted from case 3, we should *not* see fallthrough behavior.
            OpBranch %case_5

         %case_5 = OpLabel
            OpStore %i %int_0
            OpBranch %switch_merge

         %switch_merge = OpLabel
         %26 = OpLoad %int %i
         %27 = OpConvertSToF %float %26
         %28 = OpCompositeConstruct %v4float %27 %27 %27 %27
               OpStore %FragColor %28
               OpReturn
               OpFunctionEnd
