SKIP: FAILED

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

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

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

buf1 = 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_7: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
}

%f1_vf2_ = func(%v1:ptr<function, vec2<f32>, read_write>):i32 {
  $B2: {
    %x_99:ptr<function, bool, read_write> = var
    %x_100_phi:ptr<function, bool, read_write> = var
    %8:f32 = load_vector_element %v1, 0u
    %x_89:f32 = let %8
    %10:ptr<uniform, f32, read> = access %x_7, 0u, 0i, 0u
    %11:f32 = load %10
    %x_91:f32 = let %11
    %13:bool = eq %x_89, %x_91
    %x_92:bool = let %13
    store %x_100_phi, %x_92
    if %x_92 [t: $B3] {  # if_1
      $B3: {  # true
        %15:f32 = load_vector_element %v1, 1u
        %x_96:f32 = let %15
        %17:ptr<uniform, f32, read> = access %x_7, 0u, 1i, 0u
        %18:f32 = load %17
        %x_98:f32 = let %18
        %20:bool = eq %x_96, %x_98
        store %x_99, %20
        %21:bool = load %x_99
        store %x_100_phi, %21
        exit_if  # if_1
      }
    }
    %22:bool = load %x_100_phi
    %x_100:bool = let %22
    if %x_100 [t: $B4] {  # if_2
      $B4: {  # true
        %24:ptr<uniform, i32, read> = access %x_9, 0u, 1i, 0u
        %25:i32 = load %24
        %x_104:i32 = let %25
        ret %x_104
      }
    }
    %27:ptr<uniform, i32, read> = access %x_9, 0u, 0i, 0u
    %28:i32 = load %27
    %x_106:i32 = let %28
    ret %x_106
  }
}
%main_1 = func():void {
  $B5: {
    %m1:ptr<function, mat2x2<f32>, read_write> = var
    %m2:ptr<function, mat2x2<f32>, read_write> = var
    %v1_1:ptr<function, vec2<f32>, read_write> = var
    %a:ptr<function, i32, read_write> = var
    %param:ptr<function, vec2<f32>, read_write> = var
    %36:ptr<uniform, f32, read> = access %x_7, 0u, 0i, 0u
    %37:f32 = load %36
    %x_45:f32 = let %37
    %39:ptr<uniform, f32, read> = access %x_7, 0u, 1i, 0u
    %40:f32 = load %39
    %x_47:f32 = let %40
    %42:ptr<uniform, f32, read> = access %x_7, 0u, 1i, 0u
    %43:f32 = load %42
    %x_50:f32 = let %43
    %45:ptr<uniform, f32, read> = access %x_7, 0u, 1i, 0u
    %46:f32 = load %45
    %x_52:f32 = let %46
    %48:f32 = negation %x_47
    %49:vec2<f32> = construct %x_45, %48
    %50:vec2<f32> = let %49
    %51:f32 = sin %x_52
    %52:vec2<f32> = construct %x_50, %51
    %53:mat2x2<f32> = construct %50, %52
    store %m1, %53
    %54:mat2x2<f32> = load %m1
    %x_57:mat2x2<f32> = let %54
    %56:mat2x2<f32> = load %m1
    %x_58:mat2x2<f32> = let %56
    %58:mat2x2<f32> = mul %x_57, %x_58
    store %m2, %58
    %59:ptr<uniform, f32, read> = access %x_7, 0u, 0i, 0u
    %60:f32 = load %59
    %x_61:f32 = let %60
    %62:mat2x2<f32> = load %m2
    %x_63:mat2x2<f32> = let %62
    %64:vec2<f32> = construct %x_61, %x_61
    %65:vec2<f32> = mul %64, %x_63
    store %v1_1, %65
    %66:vec2<f32> = load %v1_1
    %x_65:vec2<f32> = let %66
    store %param, %x_65
    %68:i32 = call %f1_vf2_, %param
    %x_66:i32 = let %68
    store %a, %x_66
    %70:i32 = load %a
    %x_67:i32 = let %70
    %72:ptr<uniform, i32, read> = access %x_9, 0u, 1i, 0u
    %73:i32 = load %72
    %x_69:i32 = let %73
    %75:bool = eq %x_67, %x_69
    if %75 [t: $B6, f: $B7] {  # if_3
      $B6: {  # true
        %76:ptr<uniform, f32, read> = access %x_7, 0u, 0i, 0u
        %77:f32 = load %76
        %x_75:f32 = let %77
        %79:ptr<uniform, f32, read> = access %x_7, 0u, 1i, 0u
        %80:f32 = load %79
        %x_77:f32 = let %80
        %82:ptr<uniform, f32, read> = access %x_7, 0u, 1i, 0u
        %83:f32 = load %82
        %x_79:f32 = let %83
        %85:ptr<uniform, f32, read> = access %x_7, 0u, 0i, 0u
        %86:f32 = load %85
        %x_81:f32 = let %86
        %88:vec4<f32> = construct %x_75, %x_77, %x_79, %x_81
        store %x_GLF_color, %88
        exit_if  # if_3
      }
      $B7: {  # false
        %89:ptr<uniform, i32, read> = access %x_9, 0u, 1i, 0u
        %90:i32 = load %89
        %x_84:i32 = let %90
        %92:f32 = convert %x_84
        %x_85:f32 = let %92
        %94:vec4<f32> = construct %x_85, %x_85, %x_85, %x_85
        store %x_GLF_color, %94
        exit_if  # if_3
      }
    }
    ret
  }
}
%tint_symbol = @fragment func():main_out {
  $B8: {
    %96:void = call %main_1
    %97:vec4<f32> = load %x_GLF_color
    %98:main_out = construct %97
    ret %98
  }
}

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