SKIP: FAILED

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

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

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

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

%func_ = func():i32 {
  $B2: {
    loop [b: $B3] {  # loop_1
      $B3: {  # body
        %5:i32 = load %x_GLF_global_loop_count
        %x_72:i32 = let %5
        %7:bool = lt %x_72, 100i
        if %7 [t: $B4, f: $B5] {  # if_1
          $B4: {  # true
            exit_if  # if_1
          }
          $B5: {  # false
            exit_loop  # loop_1
          }
        }
        %8:i32 = load %x_GLF_global_loop_count
        %x_75:i32 = let %8
        %10:i32 = add %x_75, 1i
        store %x_GLF_global_loop_count, %10
        %11:ptr<uniform, i32, read> = access %x_7, 0u, 0i, 0u
        %12:i32 = load %11
        %x_78:i32 = let %12
        ret %x_78
      }
    }
    %14:ptr<uniform, i32, read> = access %x_7, 0u, 2i, 0u
    %15:i32 = load %14
    %x_80:i32 = let %15
    ret %x_80
  }
}
%main_1 = func():void {
  $B6: {
    %a:ptr<function, i32, read_write> = var
    store %x_GLF_global_loop_count, 0i
    loop [b: $B7, c: $B8] {  # loop_2
      $B7: {  # body
        %19:i32 = load %x_GLF_global_loop_count
        %x_35:i32 = let %19
        %21:i32 = add %x_35, 1i
        store %x_GLF_global_loop_count, %21
        if false [t: $B9] {  # if_2
          $B9: {  # true
            ret
          }
        }
        continue  # -> $B8
      }
      $B8: {  # continuing
        %22:i32 = load %x_GLF_global_loop_count
        %x_39:i32 = let %22
        %24:bool = lt %x_39, 100i
        %25:bool = and true, %24
        %26:bool = eq %25, false
        break_if %26  # -> [t: exit_loop loop_2, f: $B7]
      }
    }
    %27:i32 = call %func_
    %x_42:i32 = let %27
    store %a, %x_42
    %29:i32 = load %a
    %x_43:i32 = let %29
    %31:ptr<uniform, i32, read> = access %x_7, 0u, 2i, 0u
    %32:i32 = load %31
    %x_45:i32 = let %32
    %34:bool = eq %x_43, %x_45
    if %34 [t: $B10, f: $B11] {  # if_3
      $B10: {  # true
        %35:ptr<uniform, i32, read> = access %x_7, 0u, 0i, 0u
        %36:i32 = load %35
        %x_51:i32 = let %36
        %38:ptr<uniform, i32, read> = access %x_7, 0u, 1i, 0u
        %39:i32 = load %38
        %x_54:i32 = let %39
        %41:ptr<uniform, i32, read> = access %x_7, 0u, 1i, 0u
        %42:i32 = load %41
        %x_57:i32 = let %42
        %44:ptr<uniform, i32, read> = access %x_7, 0u, 0i, 0u
        %45:i32 = load %44
        %x_60:i32 = let %45
        %47:f32 = convert %x_51
        %48:f32 = let %47
        %49:f32 = convert %x_54
        %50:f32 = let %49
        %51:f32 = convert %x_57
        %52:f32 = let %51
        %53:f32 = convert %x_60
        %54:vec4<f32> = construct %48, %50, %52, %53
        store %x_GLF_color, %54
        exit_if  # if_3
      }
      $B11: {  # false
        %55:ptr<uniform, i32, read> = access %x_7, 0u, 1i, 0u
        %56:i32 = load %55
        %x_64:i32 = let %56
        %58:f32 = convert %x_64
        %x_65:f32 = let %58
        %60:vec4<f32> = construct %x_65, %x_65, %x_65, %x_65
        store %x_GLF_color, %60
        exit_if  # if_3
      }
    }
    ret
  }
}
%tint_symbol = @fragment func():main_out {
  $B12: {
    %62:void = call %main_1
    %63:vec4<f32> = load %x_GLF_color
    %64:main_out = construct %63
    ret %64
  }
}

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