SKIP: FAILED

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

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

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

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

%main_1 = func():void -> %b2 {
  %b2 = block {
    %m0:ptr<function, mat3x4<f32>, read_write> = var
    %m1:ptr<function, mat3x4<f32>, read_write> = var
    %undefined:ptr<function, vec3<f32>, read_write> = var
    %defined:ptr<function, vec3<f32>, read_write> = var
    %v0:ptr<function, vec4<f32>, read_write> = var
    %v1:ptr<function, vec4<f32>, read_write> = var
    %v2:ptr<function, vec4<f32>, read_write> = var
    %v3:ptr<function, vec4<f32>, read_write> = var
    %13:ptr<uniform, i32, read> = access %x_6, 0u, 4i, 0u
    %x_17:i32 = load %13
    %15:ptr<uniform, i32, read> = access %x_6, 0u, 5i, 0u
    %x_18:i32 = load %15
    %17:ptr<uniform, i32, read> = access %x_6, 0u, 6i, 0u
    %x_19:i32 = load %17
    %19:ptr<uniform, i32, read> = access %x_6, 0u, 10i, 0u
    %x_20:i32 = load %19
    %21:ptr<uniform, i32, read> = access %x_6, 0u, 7i, 0u
    %x_21:i32 = load %21
    %23:ptr<uniform, i32, read> = access %x_6, 0u, 8i, 0u
    %x_22:i32 = load %23
    %25:ptr<uniform, i32, read> = access %x_6, 0u, 11i, 0u
    %x_23:i32 = load %25
    %27:ptr<uniform, i32, read> = access %x_6, 0u, 1i, 0u
    %x_24:i32 = load %27
    %29:ptr<uniform, i32, read> = access %x_6, 0u, 2i, 0u
    %x_25:i32 = load %29
    %31:ptr<uniform, i32, read> = access %x_6, 0u, 3i, 0u
    %x_26:i32 = load %31
    %33:f32 = convert %x_17
    %34:f32 = convert %x_18
    %35:f32 = convert %x_19
    %36:vec4<f32> = construct %33, %34, %35, 4.0f
    %37:f32 = convert %x_20
    %38:f32 = convert %x_21
    %39:f32 = convert %x_22
    %40:vec4<f32> = construct %37, %38, %39, 8.0f
    %41:f32 = convert %x_23
    %42:f32 = convert %x_24
    %43:f32 = convert %x_25
    %44:f32 = convert %x_26
    %45:vec4<f32> = construct %41, %42, %43, %44
    %46:mat3x4<f32> = construct %36, %40, %45
    store %m0, %46
    %47:ptr<uniform, i32, read> = access %x_6, 0u, 4i, 0u
    %x_27:i32 = load %47
    %x_104:f32 = convert %x_27
    %50:vec4<f32> = construct %x_104, 0.0f, 0.0f, 0.0f
    %51:vec4<f32> = construct 0.0f, %x_104, 0.0f, 0.0f
    %52:vec4<f32> = construct 0.0f, 0.0f, %x_104, 0.0f
    %53:mat3x4<f32> = construct %50, %51, %52
    store %m1, %53
    store %undefined, vec3<f32>(2.0f)
    %54:ptr<uniform, i32, read> = access %x_6, 0u, 4i, 0u
    %x_28:i32 = load %54
    %x_111:f32 = convert %x_28
    %57:ptr<uniform, i32, read> = access %x_6, 0u, 0i, 0u
    %x_29:i32 = load %57
    %59:vec3<f32> = construct %x_111, %x_111, %x_111
    %60:vec3<i32> = construct %x_29, %x_29, %x_29
    %61:vec3<f32> = ldexp %59, %60
    store %defined, %61
    %x_116:mat3x4<f32> = load %m0
    %x_117:vec3<f32> = load %undefined
    %64:vec4<f32> = mul %x_116, %x_117
    store %v0, %64
    %x_119:mat3x4<f32> = load %m1
    %x_120:vec3<f32> = load %undefined
    %67:vec4<f32> = mul %x_119, %x_120
    store %v1, %67
    %x_122:mat3x4<f32> = load %m0
    %x_123:vec3<f32> = load %defined
    %70:vec4<f32> = mul %x_122, %x_123
    store %v2, %70
    %x_125:mat3x4<f32> = load %m1
    %x_126:vec3<f32> = load %defined
    %73:vec4<f32> = mul %x_125, %x_126
    store %v3, %73
    %x_129:f32 = load_vector_element %v2, 0u
    %x_131:f32 = load_vector_element %v3, 0u
    %76:bool = gt %x_129, %x_131
    if %76 [t: %b3, f: %b4] {  # if_1
      %b3 = block {  # true
        %77:ptr<uniform, i32, read> = access %x_6, 0u, 4i, 0u
        %x_30:i32 = load %77
        %79:ptr<uniform, i32, read> = access %x_6, 0u, 9i, 0u
        %x_31:i32 = load %79
        %81:ptr<uniform, i32, read> = access %x_6, 0u, 9i, 0u
        %x_32:i32 = load %81
        %83:ptr<uniform, i32, read> = access %x_6, 0u, 4i, 0u
        %x_33:i32 = load %83
        %85:f32 = convert %x_30
        %86:f32 = convert %x_31
        %87:f32 = convert %x_32
        %88:f32 = convert %x_33
        %89:vec4<f32> = construct %85, %86, %87, %88
        store %x_GLF_color, %89
        exit_if  # if_1
      }
      %b4 = block {  # false
        %90:ptr<uniform, i32, read> = access %x_6, 0u, 9i, 0u
        %x_34:i32 = load %90
        %x_146:f32 = convert %x_34
        %93:vec4<f32> = construct %x_146, %x_146, %x_146, %x_146
        store %x_GLF_color, %93
        exit_if  # if_1
      }
    }
    %x_149:f32 = load_vector_element %v0, 0u
    %x_151:f32 = load_vector_element %v1, 0u
    %96:bool = lt %x_149, %x_151
    if %96 [t: %b5] {  # if_2
      %b5 = block {  # true
        %97:ptr<uniform, f32, read> = access %x_15, 0u, 0i, 0u
        %x_156:f32 = load %97
        store_vector_element %x_GLF_color, 1u, %x_156
        exit_if  # if_2
      }
    }
    ret
  }
}
%tint_symbol = @fragment func():main_out -> %b6 {
  %b6 = block {
    %100:void = call %main_1
    %101:vec4<f32> = load %x_GLF_color
    %102:main_out = construct %101
    ret %102
  }
}

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