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, 1> @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, 4> @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_10:ptr<uniform, buf1, read> = var @binding_point(0, 1)
  %gl_FragCoord:ptr<private, vec4<f32>, read_write> = var
  %x_GLF_color:ptr<private, vec4<f32>, read_write> = var
}

%main_1 = func():void {
  $B2: {
    %data:ptr<function, array<vec4<f32>, 2>, read_write> = var
    %b:ptr<function, i32, read_write> = var
    %y:ptr<function, i32, read_write> = var
    %i:ptr<function, i32, read_write> = var
    %10:ptr<uniform, f32, read> = access %x_7, 0u, 0i, 0u
    %11:f32 = load %10
    %12:vec4<f32> = construct %11
    %13:vec4<f32> = let %12
    %14:ptr<uniform, f32, read> = access %x_7, 0u, 0i, 0u
    %15:f32 = load %14
    %16:vec4<f32> = construct %15
    %17:array<vec4<f32>, 2> = construct %13, %16
    store %data, %17
    %18:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
    %19:i32 = load %18
    store %b, %19
    %20:f32 = load_vector_element %gl_FragCoord, 1u
    %21:i32 = call %tint_f32_to_i32, %20
    %23:i32 = let %21
    %24:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
    %25:i32 = load %24
    %26:i32 = let %25
    %27:f32 = load_vector_element %gl_FragCoord, 1u
    %28:i32 = call %tint_f32_to_i32, %27
    %29:i32 = or %26, %28
    %30:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
    %31:i32 = load %30
    %32:i32 = let %31
    %33:i32 = max %23, %29
    %34:i32 = min %33, %32
    store %y, %34
    %35:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
    %36:i32 = load %35
    store %i, %36
    loop [b: $B3, c: $B4] {  # loop_1
      $B3: {  # body
        %x_82:ptr<function, bool, read_write> = var
        %x_83:ptr<function, bool, read_write> = var
        %39:i32 = load %i
        %40:ptr<uniform, i32, read> = access %x_10, 0u, 0i, 0u
        %41:i32 = load %40
        %42:bool = lt %39, %41
        if %42 [t: $B5, f: $B6] {  # if_1
          $B5: {  # true
            exit_if  # if_1
          }
          $B6: {  # false
            exit_loop  # loop_1
          }
        }
        %43:i32 = load %b
        %44:ptr<uniform, i32, read> = access %x_10, 0u, 0i, 0u
        %45:i32 = load %44
        %46:bool = gt %43, %45
        %x_76:bool = let %46
        store %x_83, %x_76
        if %x_76 [t: $B7] {  # if_2
          $B7: {  # true
            %48:i32 = load %y
            %49:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
            %50:i32 = load %49
            %51:bool = gt %48, %50
            store %x_82, %51
            %52:bool = load %x_82
            store %x_83, %52
            exit_if  # if_2
          }
        }
        %53:bool = load %x_83
        if %53 [t: $B8] {  # if_3
          $B8: {  # true
            exit_loop  # loop_1
          }
        }
        %54:i32 = load %b
        %55:i32 = add %54, 1i
        store %b, %55
        continue  # -> $B4
      }
      $B4: {  # continuing
        %56:i32 = load %i
        %57:i32 = add %56, 1i
        store %i, %57
        next_iteration  # -> $B3
      }
    }
    %58:i32 = load %b
    %59:ptr<uniform, i32, read> = access %x_10, 0u, 0i, 0u
    %60:i32 = load %59
    %61:bool = eq %58, %60
    if %61 [t: $B9] {  # if_4
      $B9: {  # true
        %62:ptr<uniform, i32, read> = access %x_10, 0u, 2i, 0u
        %63:i32 = load %62
        %x_97:i32 = let %63
        %65:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
        %66:i32 = load %65
        %x_99:i32 = let %66
        %68:ptr<uniform, i32, read> = access %x_10, 0u, 3i, 0u
        %69:i32 = load %68
        %x_101:i32 = let %69
        %71:i32 = max %x_97, %x_99
        %72:i32 = min %71, %x_101
        %73:ptr<function, vec4<f32>, read_write> = access %data, %72
        %74:ptr<function, vec4<f32>, read_write> = let %73
        %75:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
        %76:i32 = load %75
        %77:f32 = convert %76
        %78:f32 = let %77
        %79:ptr<uniform, i32, read> = access %x_10, 0u, 2i, 0u
        %80:i32 = load %79
        %81:f32 = convert %80
        %82:f32 = let %81
        %83:ptr<uniform, i32, read> = access %x_10, 0u, 2i, 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:vec4<f32> = construct %78, %82, %86, %89
        store %74, %90
        exit_if  # if_4
      }
    }
    %91:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
    %92:i32 = load %91
    %93:ptr<function, vec4<f32>, read_write> = access %data, %92
    %94:vec4<f32> = load %93
    %x_120:vec4<f32> = let %94
    %96:f32 = access %x_120, 0u
    %97:f32 = access %x_120, 1u
    %98:f32 = access %x_120, 2u
    %99:f32 = access %x_120, 3u
    %100:vec4<f32> = construct %96, %97, %98, %99
    store %x_GLF_color, %100
    ret
  }
}
%tint_symbol = @fragment func(%gl_FragCoord_param:vec4<f32> [@position]):main_out {
  $B10: {
    store %gl_FragCoord, %gl_FragCoord_param
    %103:void = call %main_1
    %104:vec4<f32> = load %x_GLF_color
    %105:main_out = construct %104
    ret %105
  }
}
%tint_f32_to_i32 = func(%value:f32):i32 {
  $B11: {
    %107:i32 = convert %value
    %108:bool = gte %value, -2147483648.0f
    %109:i32 = select -2147483648i, %107, %108
    %110:bool = lte %value, 2147483520.0f
    %111:i32 = select 2147483647i, %109, %110
    ret %111
  }
}

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