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, 2> @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, 4> @offset(0)
}

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

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

%main_1 = func():void {
  $B2: {
    %m23:ptr<function, mat2x3<f32>, read_write> = var
    %i:ptr<function, i32, read_write> = var
    %8:ptr<uniform, f32, read> = access %x_7, 0u, 1i, 0u
    %9:f32 = load %8
    %x_46:f32 = let %9
    %11:vec3<f32> = construct %x_46, 0.0f, 0.0f
    %12:vec3<f32> = let %11
    %13:vec3<f32> = construct 0.0f, %x_46, 0.0f
    %14:mat2x3<f32> = construct %12, %13
    store %m23, %14
    store %i, 1i
    loop [b: $B3, c: $B4] {  # loop_1
      $B3: {  # body
        %x_80:ptr<function, bool, read_write> = var
        %x_81:ptr<function, bool, read_write> = var
        %17:i32 = load %i
        %18:ptr<uniform, i32, read> = access %x_10, 0u, 3i, 0u
        %19:i32 = load %18
        %20:bool = lt %17, %19
        if %20 [t: $B5, f: $B6] {  # if_1
          $B5: {  # true
            exit_if  # if_1
          }
          $B6: {  # false
            exit_loop  # loop_1
          }
        }
        %21:ptr<uniform, i32, read> = access %x_10, 0u, 0i, 0u
        %22:i32 = load %21
        %x_60:i32 = let %22
        %24:ptr<uniform, i32, read> = access %x_10, 0u, 2i, 0u
        %25:i32 = load %24
        %x_62:i32 = let %25
        %27:ptr<function, vec3<f32>, read_write> = access %m23, %x_60
        %28:ptr<function, vec3<f32>, read_write> = access %m23, %x_60
        %29:f32 = load_vector_element %28, %x_62
        %30:ptr<uniform, f32, read> = access %x_7, 0u, 0i, 0u
        %31:f32 = load %30
        %32:f32 = add %29, %31
        store_vector_element %27, %x_62, %32
        %33:f32 = load_vector_element %gl_FragCoord, 1u
        %34:ptr<uniform, f32, read> = access %x_7, 0u, 0i, 0u
        %35:f32 = load %34
        %36:bool = lt %33, %35
        if %36 [t: $B7] {  # if_2
          $B7: {  # true
            exit_if  # if_2
          }
        }
        store %x_81, true
        if true [t: $B8] {  # if_3
          $B8: {  # true
            %37:f32 = load_vector_element %gl_FragCoord, 0u
            %38:bool = lt %37, 0.0f
            store %x_80, %38
            %39:bool = load %x_80
            store %x_81, %39
            exit_if  # if_3
          }
        }
        %40:bool = load %x_81
        %41:bool = eq %40, false
        if %41 [t: $B9] {  # if_4
          $B9: {  # true
            exit_loop  # loop_1
          }
        }
        continue  # -> $B4
      }
      $B4: {  # continuing
        %42:i32 = load %i
        %43:i32 = add %42, 1i
        store %i, %43
        next_iteration  # -> $B3
      }
    }
    %44:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
    %45:i32 = load %44
    %46:f32 = convert %45
    %47:f32 = let %46
    %48:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
    %49:i32 = load %48
    %50:f32 = convert %49
    %51:f32 = let %50
    %52:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
    %53:i32 = load %52
    %54:f32 = convert %53
    %55:vec3<f32> = construct %47, %51, %54
    %56:vec3<f32> = let %55
    %57:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
    %58:i32 = load %57
    %59:f32 = convert %58
    %60:f32 = let %59
    %61:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
    %62:i32 = load %61
    %63:f32 = convert %62
    %64:f32 = let %63
    %65:ptr<uniform, i32, read> = access %x_10, 0u, 0i, 0u
    %66:i32 = load %65
    %67:f32 = convert %66
    %68:vec3<f32> = construct %60, %64, %67
    %69:mat2x3<f32> = construct %56, %68
    %x_108:mat2x3<f32> = let %69
    %71:ptr<function, vec3<f32>, read_write> = access %m23, 0u
    %72:vec3<f32> = load %71
    %73:vec3<f32> = access %x_108, 0u
    %74:vec3<bool> = eq %72, %73
    %75:bool = all %74
    %76:bool = let %75
    %77:ptr<function, vec3<f32>, read_write> = access %m23, 1u
    %78:vec3<f32> = load %77
    %79:vec3<f32> = access %x_108, 1u
    %80:vec3<bool> = eq %78, %79
    %81:bool = all %80
    %82:bool = and %76, %81
    if %82 [t: $B10, f: $B11] {  # if_5
      $B10: {  # true
        %83:ptr<uniform, i32, read> = access %x_10, 0u, 0i, 0u
        %84:i32 = load %83
        %85:f32 = convert %84
        %86:f32 = let %85
        %87:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
        %88:i32 = load %87
        %89:f32 = convert %88
        %90:f32 = let %89
        %91:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
        %92:i32 = load %91
        %93:f32 = convert %92
        %94:f32 = let %93
        %95:ptr<uniform, i32, read> = access %x_10, 0u, 0i, 0u
        %96:i32 = load %95
        %97:f32 = convert %96
        %98:vec4<f32> = construct %86, %90, %94, %97
        store %x_GLF_color, %98
        exit_if  # if_5
      }
      $B11: {  # false
        %99:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
        %100:i32 = load %99
        %101:f32 = convert %100
        %102:vec4<f32> = construct %101
        store %x_GLF_color, %102
        exit_if  # if_5
      }
    }
    ret
  }
}
%tint_symbol = @fragment func(%gl_FragCoord_param:vec4<f32> [@position]):main_out {
  $B12: {
    store %gl_FragCoord, %gl_FragCoord_param
    %105:void = call %main_1
    %106:vec4<f32> = load %x_GLF_color
    %107:main_out = construct %106
    ret %107
  }
}

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