SKIP: FAILED

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

buf1 = struct @align(4) {
  x_GLF_uniform_float_values:array<strided_arr, 3> @offset(0)
}

buf2 = struct @align(8) {
  resolution:vec2<f32> @offset(0)
}

strided_arr_1 = struct @align(4) {
  el:i32 @offset(0)
}

buf0 = struct @align(4) {
  x_GLF_uniform_int_values:array<strided_arr_1, 2> @offset(0)
}

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

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

%main_1 = func():void {
  $B2: {
    %f:ptr<function, f32, read_write> = var
    %7:ptr<uniform, f32, read> = access %x_6, 0u, 1i, 0u
    %8:f32 = load %7
    %x_37:f32 = let %8
    %10:ptr<uniform, vec2<f32>, read> = access %x_8, 0u
    %11:f32 = load_vector_element %10, 0u
    %x_39:f32 = let %11
    %13:ptr<uniform, f32, read> = access %x_6, 0u, 2i, 0u
    %14:f32 = load %13
    %x_42:f32 = let %14
    %16:ptr<uniform, vec2<f32>, read> = access %x_8, 0u
    %17:f32 = load_vector_element %16, 0u
    %x_44:f32 = let %17
    %19:ptr<uniform, vec2<f32>, read> = access %x_8, 0u
    %20:f32 = load_vector_element %19, 1u
    %x_49:f32 = let %20
    %22:f32 = mul %x_37, %x_39
    %23:f32 = round %x_44
    %24:f32 = mul %x_42, %23
    %25:f32 = add %22, %24
    %26:f32 = add %25, %x_49
    store %f, %26
    %27:f32 = load %f
    %x_51:f32 = let %27
    %29:ptr<uniform, f32, read> = access %x_6, 0u, 0i, 0u
    %30:f32 = load %29
    %x_53:f32 = let %30
    %32:bool = eq %x_51, %x_53
    if %32 [t: $B3, f: $B4] {  # if_1
      $B3: {  # true
        %33:ptr<uniform, i32, read> = access %x_10, 0u, 0i, 0u
        %34:i32 = load %33
        %x_59:i32 = let %34
        %36:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
        %37:i32 = load %36
        %x_62:i32 = let %37
        %39:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
        %40:i32 = load %39
        %x_65:i32 = let %40
        %42:ptr<uniform, i32, read> = access %x_10, 0u, 0i, 0u
        %43:i32 = load %42
        %x_68:i32 = let %43
        %45:f32 = convert %x_59
        %46:f32 = let %45
        %47:f32 = convert %x_62
        %48:f32 = let %47
        %49:f32 = convert %x_65
        %50:f32 = let %49
        %51:f32 = convert %x_68
        %52:vec4<f32> = construct %46, %48, %50, %51
        store %x_GLF_color, %52
        exit_if  # if_1
      }
      $B4: {  # false
        %53:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
        %54:i32 = load %53
        %x_72:i32 = let %54
        %56:f32 = convert %x_72
        %x_73:f32 = let %56
        %58:vec4<f32> = construct %x_73, %x_73, %x_73, %x_73
        store %x_GLF_color, %58
        exit_if  # if_1
      }
    }
    ret
  }
}
%tint_symbol = @fragment func():main_out {
  $B5: {
    %60:void = call %main_1
    %61:vec4<f32> = load %x_GLF_color
    %62:main_out = construct %61
    ret %62
  }
}

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