SKIP: FAILED

../../src/tint/lang/msl/writer/printer/printer.cc:500 internal compiler error: strided_arr = struct @align(4) {
  el:i32 @offset(0)
}

buf0 = struct @align(4) {
  x_GLF_uniform_int_values:array<strided_arr, 2> @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: {
    %a:ptr<function, i32, read_write> = var
    %i:ptr<function, i32, read_write> = var
    %6:ptr<uniform, i32, read> = access %x_6, 0u, 1i, 0u
    %7:i32 = load %6
    %x_25:i32 = let %7
    store %a, %x_25
    %9:ptr<uniform, i32, read> = access %x_6, 0u, 0i, 0u
    %10:i32 = load %9
    %x_27:i32 = let %10
    %12:i32 = negation %x_27
    store %i, %12
    loop [b: $B3, c: $B4] {  # loop_1
      $B3: {  # body
        %13:i32 = load %i
        %x_33:i32 = let %13
        %15:ptr<uniform, i32, read> = access %x_6, 0u, 0i, 0u
        %16:i32 = load %15
        %x_35:i32 = let %16
        %18:ptr<uniform, i32, read> = access %x_6, 0u, 0i, 0u
        %19:i32 = load %18
        %x_38:i32 = let %19
        %21:i32 = or %x_33, %x_35
        %22:bool = lt %21, %x_38
        if %22 [t: $B5, f: $B6] {  # if_1
          $B5: {  # true
            exit_if  # if_1
          }
          $B6: {  # false
            exit_loop  # loop_1
          }
        }
        %23:i32 = load %i
        %x_41:i32 = let %23
        %25:ptr<uniform, i32, read> = access %x_6, 0u, 0i, 0u
        %26:i32 = load %25
        %x_43:i32 = let %26
        %28:i32 = mul %x_41, %x_43
        store %a, %28
        continue  # -> $B4
      }
      $B4: {  # continuing
        %29:i32 = load %i
        %x_45:i32 = let %29
        %31:i32 = add %x_45, 1i
        store %i, %31
        next_iteration  # -> $B3
      }
    }
    %32:i32 = load %a
    %x_47:i32 = let %32
    %34:ptr<uniform, i32, read> = access %x_6, 0u, 0i, 0u
    %35:i32 = load %34
    %x_49:i32 = let %35
    %37:i32 = negation %x_49
    %38:bool = eq %x_47, %37
    if %38 [t: $B7, f: $B8] {  # if_2
      $B7: {  # true
        %39:ptr<uniform, i32, read> = access %x_6, 0u, 0i, 0u
        %40:i32 = load %39
        %x_56:i32 = let %40
        %42:ptr<uniform, i32, read> = access %x_6, 0u, 1i, 0u
        %43:i32 = load %42
        %x_59:i32 = let %43
        %45:ptr<uniform, i32, read> = access %x_6, 0u, 1i, 0u
        %46:i32 = load %45
        %x_62:i32 = let %46
        %48:ptr<uniform, i32, read> = access %x_6, 0u, 0i, 0u
        %49:i32 = load %48
        %x_65:i32 = let %49
        %51:f32 = convert %x_56
        %52:f32 = let %51
        %53:f32 = convert %x_59
        %54:f32 = let %53
        %55:f32 = convert %x_62
        %56:f32 = let %55
        %57:f32 = convert %x_65
        %58:vec4<f32> = construct %52, %54, %56, %57
        store %x_GLF_color, %58
        exit_if  # if_2
      }
      $B8: {  # false
        %59:i32 = load %a
        %x_68:i32 = let %59
        %61:f32 = convert %x_68
        %x_69:f32 = let %61
        %63:vec4<f32> = construct %x_69, %x_69, %x_69, %x_69
        store %x_GLF_color, %63
        exit_if  # if_2
      }
    }
    ret
  }
}
%tint_symbol = @fragment func():main_out {
  $B9: {
    %65:void = call %main_1
    %66:vec4<f32> = load %x_GLF_color
    %67:main_out = construct %66
    ret %67
  }
}

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.  *
********************************************************************
