SKIP: FAILED

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

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

buf2 = struct @align(4) {
  zero:i32 @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 = block {  # root
  %x_6:ptr<uniform, buf1, read> = var @binding_point(0, 1)
  %x_8:ptr<uniform, buf2, read> = var @binding_point(0, 2)
  %x_10:ptr<uniform, buf0, read> = var @binding_point(0, 0)
  %x_GLF_color:ptr<private, vec4<f32>, read_write> = var
}

%main_1 = func():void -> %b2 {
  %b2 = block {
    %f:ptr<function, f32, read_write> = var
    %x_48:ptr<function, bool, read_write> = var
    %x_49_phi:ptr<function, bool, read_write> = var
    %9:ptr<uniform, f32, read> = access %x_6, 0u, 1i, 0u
    %x_33:f32 = load %9
    %11:f32 = negation %x_33
    %12:f32 = pow %11, 1.17520117759704589844f
    store %f, %12
    %x_37:f32 = load %f
    %14:ptr<uniform, f32, read> = access %x_6, 0u, 0i, 0u
    %x_39:f32 = load %14
    %x_40:bool = eq %x_37, %x_39
    store %x_49_phi, %x_40
    %17:bool = eq %x_40, false
    if %17 [t: %b3] {  # if_1
      %b3 = block {  # true
        %18:ptr<uniform, i32, read> = access %x_8, 0u
        %x_45:i32 = load %18
        %20:ptr<uniform, i32, read> = access %x_10, 0u, 0i, 0u
        %x_47:i32 = load %20
        %22:bool = eq %x_45, %x_47
        store %x_48, %22
        %23:bool = load %x_48
        store %x_49_phi, %23
        exit_if  # if_1
      }
    }
    %x_49:bool = load %x_49_phi
    if %x_49 [t: %b4, f: %b5] {  # if_2
      %b4 = block {  # true
        %25:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
        %x_54:i32 = load %25
        %27:ptr<uniform, i32, read> = access %x_10, 0u, 0i, 0u
        %x_57:i32 = load %27
        %29:ptr<uniform, i32, read> = access %x_10, 0u, 0i, 0u
        %x_60:i32 = load %29
        %31:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
        %x_63:i32 = load %31
        %33:f32 = convert %x_54
        %34:f32 = convert %x_57
        %35:f32 = convert %x_60
        %36:f32 = convert %x_63
        %37:vec4<f32> = construct %33, %34, %35, %36
        store %x_GLF_color, %37
        exit_if  # if_2
      }
      %b5 = block {  # false
        %38:ptr<uniform, i32, read> = access %x_10, 0u, 0i, 0u
        %x_67:i32 = load %38
        %x_68:f32 = convert %x_67
        %41:vec4<f32> = construct %x_68, %x_68, %x_68, %x_68
        store %x_GLF_color, %41
        exit_if  # if_2
      }
    }
    ret
  }
}
%tint_symbol = @fragment func():main_out -> %b6 {
  %b6 = block {
    %43:void = call %main_1
    %44:vec4<f32> = load %x_GLF_color
    %45:main_out = construct %44
    ret %45
  }
}

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