SKIP: FAILED

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

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 = block {  # root
  %m:ptr<private, mat4x2<f32>, read_write> = var
  %x_10:ptr<uniform, buf2, read> = var @binding_point(0, 2)
  %x_12:ptr<uniform, buf0, read> = var @binding_point(0, 0)
  %gl_FragCoord:ptr<private, vec4<f32>, read_write> = var
  %x_16:ptr<uniform, buf1, read> = var @binding_point(0, 1)
  %x_GLF_color:ptr<private, vec4<f32>, read_write> = var
}

%func0_i1_ = func(%x:ptr<function, i32, read_write>):void -> %b2 {
  %b2 = block {
    %i:ptr<function, i32, read_write> = var
    %x_137:ptr<function, bool, read_write> = var
    %x_138:ptr<function, bool, read_write> = var
    %x_139:ptr<function, bool, read_write> = var
    %13:i32 = load %x
    %x_125:bool = lt %13, 1i
    store %x_139, %x_125
    %15:bool = eq %x_125, false
    if %15 [t: %b3] {  # if_1
      %b3 = block {  # true
        %16:i32 = load %x
        %x_130:bool = gt %16, 1i
        store %x_138, %x_130
        if %x_130 [t: %b4] {  # if_2
          %b4 = block {  # true
            %18:ptr<uniform, f32, read> = access %x_10, 0u
            %19:f32 = load %18
            %20:ptr<uniform, f32, read> = access %x_12, 0u, 0i, 0u
            %21:f32 = load %20
            %22:bool = gt %19, %21
            store %x_137, %22
            %23:bool = load %x_137
            store %x_138, %23
            exit_if  # if_2
          }
        }
        %24:bool = load %x_138
        store %x_139, %24
        exit_if  # if_1
      }
    }
    %25:bool = load %x_139
    if %25 [t: %b5] {  # if_3
      %b5 = block {  # true
        ret
      }
    }
    %26:ptr<uniform, f32, read> = access %x_10, 0u
    %27:f32 = load %26
    %28:ptr<uniform, f32, read> = access %x_12, 0u, 0i, 0u
    %29:f32 = load %28
    %30:bool = eq %27, %29
    if %30 [t: %b6] {  # if_4
      %b6 = block {  # true
        store %i, 0i
        loop [b: %b7, c: %b8] {  # loop_1
          %b7 = block {  # body
            %31:i32 = load %i
            %32:bool = lt %31, 2i
            if %32 [t: %b9, f: %b10] {  # if_5
              %b9 = block {  # true
                exit_if  # if_5
              }
              %b10 = block {  # false
                exit_loop  # loop_1
              }
            }
            continue %b8
          }
          %b8 = block {  # continuing
            %33:i32 = load %x
            %x_155:i32 = clamp %33, 0i, 3i
            %x_156:i32 = load %i
            %36:ptr<private, vec2<f32>, read_write> = access %m, %x_155
            %37:ptr<private, vec2<f32>, read_write> = access %m, %x_155
            %38:i32 = load %i
            %39:f32 = load_vector_element %37, %38
            %40:ptr<uniform, f32, read> = access %x_12, 0u, 0i, 0u
            %41:f32 = load %40
            %42:f32 = add %39, %41
            store_vector_element %36, %x_156, %42
            %43:i32 = load %i
            %44:i32 = add %43, 1i
            store %i, %44
            next_iteration %b7
          }
        }
        exit_if  # if_4
      }
    }
    ret
  }
}
%func1_ = func():void -> %b11 {
  %b11 = block {
    %param:ptr<function, i32, read_write> = var
    %47:f32 = load_vector_element %gl_FragCoord, 1u
    %48:bool = lt %47, 0.0f
    if %48 [t: %b12] {  # if_6
      %b12 = block {  # true
        ret
      }
    }
    store %param, 1i
    %49:void = call %func0_i1_, %param
    ret
  }
}
%main_1 = func():void -> %b13 {
  %b13 = block {
    store %m, mat4x2<f32>(vec2<f32>(0.0f))
    %51:void = call %func1_
    %52:void = call %func1_
    %53:ptr<uniform, i32, read> = access %x_16, 0u, 0i, 0u
    %54:i32 = load %53
    %55:f32 = convert %54
    %56:ptr<uniform, i32, read> = access %x_16, 0u, 0i, 0u
    %57:i32 = load %56
    %58:f32 = convert %57
    %59:vec2<f32> = construct %55, %58
    %60:ptr<uniform, i32, read> = access %x_16, 0u, 1i, 0u
    %61:i32 = load %60
    %62:f32 = convert %61
    %63:ptr<uniform, i32, read> = access %x_16, 0u, 1i, 0u
    %64:i32 = load %63
    %65:f32 = convert %64
    %66:vec2<f32> = construct %62, %65
    %67:ptr<uniform, i32, read> = access %x_16, 0u, 0i, 0u
    %68:i32 = load %67
    %69:f32 = convert %68
    %70:ptr<uniform, i32, read> = access %x_16, 0u, 0i, 0u
    %71:i32 = load %70
    %72:f32 = convert %71
    %73:vec2<f32> = construct %69, %72
    %74:ptr<uniform, i32, read> = access %x_16, 0u, 0i, 0u
    %75:i32 = load %74
    %76:f32 = convert %75
    %77:ptr<uniform, i32, read> = access %x_16, 0u, 0i, 0u
    %78:i32 = load %77
    %79:f32 = convert %78
    %80:vec2<f32> = construct %76, %79
    %x_83:mat4x2<f32> = construct %59, %66, %73, %80
    %82:ptr<private, vec2<f32>, read_write> = access %m, 0u
    %83:vec2<f32> = load %82
    %84:vec2<f32> = access %x_83, 0u
    %85:vec2<bool> = eq %83, %84
    %86:bool = all %85
    %87:ptr<private, vec2<f32>, read_write> = access %m, 1u
    %88:vec2<f32> = load %87
    %89:vec2<f32> = access %x_83, 1u
    %90:vec2<bool> = eq %88, %89
    %91:bool = all %90
    %92:bool = and %86, %91
    %93:ptr<private, vec2<f32>, read_write> = access %m, 2u
    %94:vec2<f32> = load %93
    %95:vec2<f32> = access %x_83, 2u
    %96:vec2<bool> = eq %94, %95
    %97:bool = all %96
    %98:bool = and %92, %97
    %99:ptr<private, vec2<f32>, read_write> = access %m, 3u
    %100:vec2<f32> = load %99
    %101:vec2<f32> = access %x_83, 3u
    %102:vec2<bool> = eq %100, %101
    %103:bool = all %102
    %104:bool = and %98, %103
    if %104 [t: %b14, f: %b15] {  # if_7
      %b14 = block {  # true
        %105:ptr<uniform, i32, read> = access %x_16, 0u, 3i, 0u
        %106:i32 = load %105
        %107:f32 = convert %106
        %108:ptr<uniform, i32, read> = access %x_16, 0u, 0i, 0u
        %109:i32 = load %108
        %110:f32 = convert %109
        %111:ptr<uniform, i32, read> = access %x_16, 0u, 0i, 0u
        %112:i32 = load %111
        %113:f32 = convert %112
        %114:ptr<uniform, i32, read> = access %x_16, 0u, 3i, 0u
        %115:i32 = load %114
        %116:f32 = convert %115
        %117:vec4<f32> = construct %107, %110, %113, %116
        store %x_GLF_color, %117
        exit_if  # if_7
      }
      %b15 = block {  # false
        %118:ptr<uniform, i32, read> = access %x_16, 0u, 0i, 0u
        %119:i32 = load %118
        %120:f32 = convert %119
        %121:vec4<f32> = construct %120
        store %x_GLF_color, %121
        exit_if  # if_7
      }
    }
    ret
  }
}
%tint_symbol = @fragment func(%gl_FragCoord_param:vec4<f32> [@position]):main_out -> %b16 {
  %b16 = block {
    store %gl_FragCoord, %gl_FragCoord_param
    %124:void = call %main_1
    %125:vec4<f32> = load %x_GLF_color
    %126:main_out = construct %125
    ret %126
  }
}

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