SKIP: FAILED

../../src/tint/lang/msl/writer/printer/printer.cc:500 internal compiler error: buf0 = struct @align(8) {
  injectionSwitch:vec2<f32> @offset(0)
}

main_out = struct @align(16) {
  x_GLF_color_1:vec4<f32> @offset(0), @location(0)
}

$B1: {  # root
  %x_6:ptr<uniform, buf0, read> = var @binding_point(0, 0)
  %x_GLF_color:ptr<private, vec4<f32>, read_write> = var
}

%main_1 = func():void {
  $B2: {
    %i:ptr<function, i32, read_write> = var
    %GLF_dead5cols:ptr<function, i32, read_write> = var
    %GLF_dead5rows:ptr<function, i32, read_write> = var
    %GLF_dead5c:ptr<function, i32, read_write> = var
    %GLF_dead5r:ptr<function, i32, read_write> = var
    %msb10:ptr<function, i32, read_write> = var
    %donor_replacementGLF_dead5sums:ptr<function, array<f32, 9>, read_write> = var
    store %i, 0i
    loop [b: $B3, c: $B4] {  # loop_1
      $B3: {  # body
        %11:i32 = load %i
        %12:i32 = let %11
        %13:ptr<uniform, vec2<f32>, read> = access %x_6, 0u
        %14:f32 = load_vector_element %13, 0u
        %15:i32 = call %tint_f32_to_i32, %14
        %17:bool = gte %12, %15
        if %17 [t: $B5] {  # if_1
          $B5: {  # true
            exit_loop  # loop_1
          }
        }
        %18:ptr<uniform, vec2<f32>, read> = access %x_6, 0u
        %19:f32 = load_vector_element %18, 1u
        %20:bool = gt 0.0f, %19
        if %20 [t: $B6] {  # if_2
          $B6: {  # true
            store %GLF_dead5cols, 2i
            loop [b: $B7, c: $B8] {  # loop_2
              $B7: {  # body
                %21:i32 = load %GLF_dead5cols
                %22:bool = lte %21, 4i
                if %22 [t: $B9, f: $B10] {  # if_3
                  $B9: {  # true
                    exit_if  # if_3
                  }
                  $B10: {  # false
                    exit_loop  # loop_2
                  }
                }
                store %GLF_dead5rows, 2i
                loop [b: $B11, c: $B12] {  # loop_3
                  $B11: {  # body
                    %23:i32 = load %GLF_dead5rows
                    %24:bool = lte %23, 4i
                    if %24 [t: $B13, f: $B14] {  # if_4
                      $B13: {  # true
                        exit_if  # if_4
                      }
                      $B14: {  # false
                        exit_loop  # loop_3
                      }
                    }
                    store %GLF_dead5c, 0i
                    loop [b: $B15, c: $B16] {  # loop_4
                      $B15: {  # body
                        %25:i32 = load %GLF_dead5c
                        %26:i32 = load %GLF_dead5cols
                        %27:bool = lt %25, %26
                        if %27 [t: $B17, f: $B18] {  # if_5
                          $B17: {  # true
                            exit_if  # if_5
                          }
                          $B18: {  # false
                            exit_loop  # loop_4
                          }
                        }
                        store %GLF_dead5r, 0i
                        loop [b: $B19, c: $B20] {  # loop_5
                          $B19: {  # body
                            %28:i32 = load %GLF_dead5r
                            %29:i32 = load %GLF_dead5rows
                            %30:bool = lt %28, %29
                            if %30 [t: $B21, f: $B22] {  # if_6
                              $B21: {  # true
                                exit_if  # if_6
                              }
                              $B22: {  # false
                                exit_loop  # loop_5
                              }
                            }
                            %31:i32 = load %msb10
                            %x_87:i32 = let %31
                            switch %x_87 [c: (1i 8i, $B23), c: (default, $B24)] {  # switch_1
                              $B23: {  # case
                                %33:i32 = load %msb10
                                %34:i32 = load %msb10
                                %35:bool = gte %34, 0i
                                %36:i32 = load %msb10
                                %37:bool = lt %36, 9i
                                %38:bool = and %35, %37
                                %39:i32 = select 0i, %33, %38
                                %x_96:i32 = let %39
                                %41:ptr<function, f32, read_write> = access %donor_replacementGLF_dead5sums, %x_96
                                %42:ptr<function, f32, read_write> = access %donor_replacementGLF_dead5sums, %x_96
                                %43:f32 = load %42
                                %44:f32 = add %43, 1.0f
                                store %41, %44
                                exit_switch  # switch_1
                              }
                              $B24: {  # case
                                exit_switch  # switch_1
                              }
                            }
                            continue  # -> $B20
                          }
                          $B20: {  # continuing
                            %45:i32 = load %GLF_dead5r
                            %46:i32 = add %45, 1i
                            store %GLF_dead5r, %46
                            next_iteration  # -> $B19
                          }
                        }
                        continue  # -> $B16
                      }
                      $B16: {  # continuing
                        %47:i32 = load %GLF_dead5c
                        %48:i32 = add %47, 1i
                        store %GLF_dead5c, %48
                        next_iteration  # -> $B15
                      }
                    }
                    %49:i32 = load %msb10
                    %50:i32 = add %49, 1i
                    store %msb10, %50
                    continue  # -> $B12
                  }
                  $B12: {  # continuing
                    %51:i32 = load %GLF_dead5rows
                    %52:i32 = add %51, 1i
                    store %GLF_dead5rows, %52
                    next_iteration  # -> $B11
                  }
                }
                continue  # -> $B8
              }
              $B8: {  # continuing
                %53:i32 = load %GLF_dead5cols
                %54:i32 = add %53, 1i
                store %GLF_dead5cols, %54
                next_iteration  # -> $B7
              }
            }
            exit_if  # if_2
          }
        }
        %55:i32 = load %i
        %56:i32 = add %55, 1i
        store %i, %56
        continue  # -> $B4
      }
      $B4: {  # continuing
        %57:i32 = load %i
        %x_113:i32 = let %57
        %59:bool = lt %x_113, 200i
        %60:bool = eq %59, false
        break_if %60  # -> [t: exit_loop loop_1, f: $B3]
      }
    }
    store %x_GLF_color, vec4<f32>(1.0f, 0.0f, 0.0f, 1.0f)
    ret
  }
}
%tint_symbol = @fragment func():main_out {
  $B25: {
    %62:void = call %main_1
    %63:vec4<f32> = load %x_GLF_color
    %64:main_out = construct %63
    ret %64
  }
}
%tint_f32_to_i32 = func(%value:f32):i32 {
  $B26: {
    %66:i32 = convert %value
    %67:bool = gte %value, -2147483648.0f
    %68:i32 = select -2147483648i, %66, %67
    %69:bool = lte %value, 2147483520.0f
    %70:i32 = select 2147483647i, %68, %69
    ret %70
  }
}

unhandled variable address space
********************************************************************
*  The tint shader compiler has encountered an unexpected error.   *
*                                                                  *
*  Please help us fix this issue by submitting a bug report at     *
*  crbug.com/tint with the source program that triggered the bug.  *
********************************************************************
