SKIP: FAILED

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

buf1 = struct @align(4) {
  x_GLF_uniform_int_values:array<strided_arr, 3> @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, 2> @offset(0)
}

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

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

%main_1 = func():void {
  $B2: {
    %i:ptr<function, i32, read_write> = var
    %j:ptr<function, i32, read_write> = var
    %9:ptr<uniform, i32, read> = access %x_7, 0u, 1i, 0u
    %10:i32 = load %9
    store %i, %10
    loop [b: $B3, c: $B4] {  # loop_1
      $B3: {  # body
        %11:i32 = load %i
        %12:ptr<uniform, i32, read> = access %x_7, 0u, 0i, 0u
        %13:i32 = load %12
        %14:bool = lt %11, %13
        if %14 [t: $B5, f: $B6] {  # if_1
          $B5: {  # true
            exit_if  # if_1
          }
          $B6: {  # false
            exit_loop  # loop_1
          }
        }
        %15:ptr<uniform, f32, read> = access %x_9, 0u, 0i, 0u
        %16:f32 = load %15
        %17:ptr<uniform, f32, read> = access %x_9, 0u, 1i, 0u
        %18:f32 = load %17
        %19:bool = gt %16, %18
        if %19 [t: $B7] {  # if_2
          $B7: {  # true
            store %continue_execution, false
            exit_if  # if_2
          }
        }
        %20:ptr<uniform, i32, read> = access %x_7, 0u, 1i, 0u
        %21:i32 = load %20
        store %j, %21
        loop [b: $B8, c: $B9] {  # loop_2
          $B8: {  # body
            %22:i32 = load %j
            %23:ptr<uniform, i32, read> = access %x_7, 0u, 0i, 0u
            %24:i32 = load %23
            %25:bool = lt %22, %24
            if %25 [t: $B10, f: $B11] {  # if_3
              $B10: {  # true
                exit_if  # if_3
              }
              $B11: {  # false
                exit_loop  # loop_2
              }
            }
            %26:f32 = load_vector_element %gl_FragCoord, 0u
            %27:ptr<uniform, f32, read> = access %x_9, 0u, 0i, 0u
            %28:f32 = load %27
            %29:bool = lt %26, %28
            if %29 [t: $B12] {  # if_4
              $B12: {  # true
                store %continue_execution, false
                exit_if  # if_4
              }
            }
            %30:ptr<uniform, i32, read> = access %x_7, 0u, 2i, 0u
            %31:i32 = load %30
            %32:f32 = convert %31
            %33:f32 = let %32
            %34:ptr<uniform, i32, read> = access %x_7, 0u, 1i, 0u
            %35:i32 = load %34
            %36:f32 = convert %35
            %37:f32 = let %36
            %38:ptr<uniform, i32, read> = access %x_7, 0u, 1i, 0u
            %39:i32 = load %38
            %40:f32 = convert %39
            %41:f32 = let %40
            %42:ptr<uniform, i32, read> = access %x_7, 0u, 2i, 0u
            %43:i32 = load %42
            %44:f32 = convert %43
            %45:vec4<f32> = construct %33, %37, %41, %44
            store %x_GLF_v1, %45
            continue  # -> $B9
          }
          $B9: {  # continuing
            %46:i32 = load %j
            %47:i32 = add %46, 1i
            store %j, %47
            next_iteration  # -> $B8
          }
        }
        continue  # -> $B4
      }
      $B4: {  # continuing
        %48:i32 = load %i
        %49:i32 = add %48, 1i
        store %i, %49
        next_iteration  # -> $B3
      }
    }
    ret
  }
}
%tint_symbol = @fragment func(%gl_FragCoord_param:vec4<f32> [@position]):main_out {
  $B13: {
    store %gl_FragCoord, %gl_FragCoord_param
    %52:void = call %main_1
    %53:vec4<f32> = load %x_GLF_v1
    %54:main_out = construct %53
    %55:bool = load %continue_execution
    %56:bool = eq %55, false
    if %56 [t: $B14] {  # if_5
      $B14: {  # true
        terminate_invocation
      }
    }
    ret %54
  }
}

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