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)
}

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

buf1 = struct @align(4) {
  x_GLF_uniform_float_values:array<strided_arr_1, 4> @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_9:ptr<uniform, buf1, read> = var @binding_point(0, 1)
  %x_GLF_color:ptr<private, vec4<f32>, read_write> = var
}

%main_1 = func():void {
  $B2: {
    %a:ptr<function, i32, read_write> = var
    %v:ptr<function, vec4<f32>, read_write> = var
    %m:ptr<function, mat3x4<f32>, read_write> = var
    %indexable:ptr<function, mat4x4<f32>, read_write> = var
    %9:ptr<uniform, i32, read> = access %x_6, 0u, 0i, 0u
    %10:i32 = load %9
    store %a, %10
    %11:ptr<uniform, f32, read> = access %x_9, 0u, 2i, 0u
    %12:f32 = load %11
    %13:vec4<f32> = construct %12
    store %v, %13
    %14:ptr<uniform, f32, read> = access %x_9, 0u, 3i, 0u
    %15:f32 = load %14
    %x_49:f32 = let %15
    %17:vec4<f32> = construct %x_49, 0.0f, 0.0f, 0.0f
    %18:vec4<f32> = let %17
    %19:vec4<f32> = construct 0.0f, %x_49, 0.0f, 0.0f
    %20:vec4<f32> = let %19
    %21:vec4<f32> = construct 0.0f, 0.0f, %x_49, 0.0f
    %22:mat3x4<f32> = construct %18, %20, %21
    store %m, %22
    %23:i32 = load %a
    %x_54:i32 = let %23
    %25:i32 = load %a
    %x_55:i32 = let %25
    %27:ptr<function, vec4<f32>, read_write> = access %m, %x_54
    %28:ptr<uniform, f32, read> = access %x_9, 0u, 0i, 0u
    %29:f32 = load %28
    store_vector_element %27, %x_55, %29
    %30:i32 = load %a
    %x_59:i32 = let %30
    %32:i32 = load %a
    %x_78:i32 = let %32
    %34:i32 = load %a
    %x_79:i32 = let %34
    %36:ptr<function, vec4<f32>, read_write> = access %m, 0u
    %37:f32 = load_vector_element %36, 0u
    %38:ptr<function, vec4<f32>, read_write> = access %m, 0u
    %39:f32 = load_vector_element %38, 1u
    %40:ptr<function, vec4<f32>, read_write> = access %m, 0u
    %41:f32 = load_vector_element %40, 2u
    %42:ptr<function, vec4<f32>, read_write> = access %m, 0u
    %43:f32 = load_vector_element %42, 3u
    %44:vec4<f32> = construct %37, %39, %41, %43
    %45:vec4<f32> = let %44
    %46:ptr<function, vec4<f32>, read_write> = access %m, 1u
    %47:f32 = load_vector_element %46, 0u
    %48:ptr<function, vec4<f32>, read_write> = access %m, 1u
    %49:f32 = load_vector_element %48, 1u
    %50:ptr<function, vec4<f32>, read_write> = access %m, 1u
    %51:f32 = load_vector_element %50, 2u
    %52:ptr<function, vec4<f32>, read_write> = access %m, 1u
    %53:f32 = load_vector_element %52, 3u
    %54:vec4<f32> = construct %47, %49, %51, %53
    %55:vec4<f32> = let %54
    %56:ptr<function, vec4<f32>, read_write> = access %m, 2u
    %57:f32 = load_vector_element %56, 0u
    %58:ptr<function, vec4<f32>, read_write> = access %m, 2u
    %59:f32 = load_vector_element %58, 1u
    %60:ptr<function, vec4<f32>, read_write> = access %m, 2u
    %61:f32 = load_vector_element %60, 2u
    %62:ptr<function, vec4<f32>, read_write> = access %m, 2u
    %63:f32 = load_vector_element %62, 3u
    %64:vec4<f32> = construct %57, %59, %61, %63
    %65:mat4x4<f32> = construct %45, %55, %64, vec4<f32>(0.0f, 0.0f, 0.0f, 1.0f)
    store %indexable, %65
    %66:f32 = load_vector_element %v, %x_59
    %67:ptr<function, vec4<f32>, read_write> = access %indexable, %x_78
    %68:f32 = load_vector_element %67, %x_79
    %69:f32 = add %66, %68
    store_vector_element %v, %x_59, %69
    %70:f32 = load_vector_element %v, 1u
    %71:ptr<uniform, f32, read> = access %x_9, 0u, 1i, 0u
    %72:f32 = load %71
    %73:bool = eq %70, %72
    if %73 [t: $B3, f: $B4] {  # if_1
      $B3: {  # true
        %74:ptr<uniform, i32, read> = access %x_6, 0u, 0i, 0u
        %75:i32 = load %74
        %76:f32 = convert %75
        %77:f32 = let %76
        %78:ptr<uniform, i32, read> = access %x_6, 0u, 1i, 0u
        %79:i32 = load %78
        %80:f32 = convert %79
        %81:f32 = let %80
        %82:ptr<uniform, i32, read> = access %x_6, 0u, 1i, 0u
        %83:i32 = load %82
        %84:f32 = convert %83
        %85:f32 = let %84
        %86:ptr<uniform, i32, read> = access %x_6, 0u, 0i, 0u
        %87:i32 = load %86
        %88:f32 = convert %87
        %89:vec4<f32> = construct %77, %81, %85, %88
        store %x_GLF_color, %89
        exit_if  # if_1
      }
      $B4: {  # false
        %90:ptr<uniform, i32, read> = access %x_6, 0u, 1i, 0u
        %91:i32 = load %90
        %92:f32 = convert %91
        %93:vec4<f32> = construct %92
        store %x_GLF_color, %93
        exit_if  # if_1
      }
    }
    ret
  }
}
%tint_symbol = @fragment func():main_out {
  $B5: {
    %95:void = call %main_1
    %96:vec4<f32> = load %x_GLF_color
    %97:main_out = construct %96
    ret %97
  }
}

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