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

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

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

%main_1 = func():void {
  $B2: {
    %arr:ptr<function, array<f32, 3>, read_write> = var
    %a:ptr<function, i32, read_write> = var
    %x_69:ptr<function, bool, read_write> = var
    %x_79:ptr<function, bool, read_write> = var
    %x_70_phi:ptr<function, bool, read_write> = var
    %x_80_phi:ptr<function, bool, read_write> = var
    %11:ptr<uniform, f32, read> = access %x_6, 0u, 1i, 0u
    %12:f32 = load %11
    %x_34:f32 = let %12
    %14:ptr<uniform, f32, read> = access %x_6, 0u, 0i, 0u
    %15:f32 = load %14
    %x_36:f32 = let %15
    %17:ptr<uniform, f32, read> = access %x_6, 0u, 2i, 0u
    %18:f32 = load %17
    %x_38:f32 = let %18
    %20:array<f32, 3> = construct %x_34, %x_36, %x_38
    store %arr, %20
    store %a, 0i
    loop [b: $B3, c: $B4] {  # loop_1
      $B3: {  # body
        %21:i32 = load %a
        %x_44:i32 = let %21
        %23:ptr<uniform, i32, read> = access %x_9, 0u, 1i, 0u
        %24:i32 = load %23
        %x_46:i32 = let %24
        %26:bool = lte %x_44, %x_46
        if %26 [t: $B5, f: $B6] {  # if_1
          $B5: {  # true
            exit_if  # if_1
          }
          $B6: {  # false
            exit_loop  # loop_1
          }
        }
        %27:i32 = load %a
        %x_49:i32 = let %27
        %29:i32 = add %x_49, 1i
        store %a, %29
        %30:ptr<uniform, f32, read> = access %x_6, 0u, 0i, 0u
        %31:f32 = load %30
        %x_52:f32 = let %31
        %33:ptr<function, f32, read_write> = access %arr, %x_49
        store %33, %x_52
        continue  # -> $B4
      }
      $B4: {  # continuing
        next_iteration  # -> $B3
      }
    }
    %34:ptr<uniform, i32, read> = access %x_9, 0u, 1i, 0u
    %35:i32 = load %34
    %x_55:i32 = let %35
    %37:ptr<function, f32, read_write> = access %arr, %x_55
    %38:f32 = load %37
    %x_57:f32 = let %38
    %40:ptr<uniform, f32, read> = access %x_6, 0u, 0i, 0u
    %41:f32 = load %40
    %x_59:f32 = let %41
    %43:bool = eq %x_57, %x_59
    %x_60:bool = let %43
    store %x_70_phi, %x_60
    if %x_60 [t: $B7] {  # if_2
      $B7: {  # true
        %45:ptr<uniform, i32, read> = access %x_9, 0u, 2i, 0u
        %46:i32 = load %45
        %x_64:i32 = let %46
        %48:ptr<function, f32, read_write> = access %arr, %x_64
        %49:f32 = load %48
        %x_66:f32 = let %49
        %51:ptr<uniform, f32, read> = access %x_6, 0u, 0i, 0u
        %52:f32 = load %51
        %x_68:f32 = let %52
        %54:bool = eq %x_66, %x_68
        store %x_69, %54
        %55:bool = load %x_69
        store %x_70_phi, %55
        exit_if  # if_2
      }
    }
    %56:bool = load %x_70_phi
    %x_70:bool = let %56
    store %x_80_phi, %x_70
    if %x_70 [t: $B8] {  # if_3
      $B8: {  # true
        %58:ptr<uniform, i32, read> = access %x_9, 0u, 0i, 0u
        %59:i32 = load %58
        %x_74:i32 = let %59
        %61:ptr<function, f32, read_write> = access %arr, %x_74
        %62:f32 = load %61
        %x_76:f32 = let %62
        %64:ptr<uniform, f32, read> = access %x_6, 0u, 2i, 0u
        %65:f32 = load %64
        %x_78:f32 = let %65
        %67:bool = eq %x_76, %x_78
        store %x_79, %67
        %68:bool = load %x_79
        store %x_80_phi, %68
        exit_if  # if_3
      }
    }
    %69:bool = load %x_80_phi
    %x_80:bool = let %69
    if %x_80 [t: $B9, f: $B10] {  # if_4
      $B9: {  # true
        %71:ptr<uniform, i32, read> = access %x_9, 0u, 1i, 0u
        %72:i32 = load %71
        %x_85:i32 = let %72
        %74:ptr<function, f32, read_write> = access %arr, %x_85
        %75:f32 = load %74
        %x_87:f32 = let %75
        %77:ptr<uniform, f32, read> = access %x_6, 0u, 1i, 0u
        %78:f32 = load %77
        %x_89:f32 = let %78
        %80:ptr<uniform, f32, read> = access %x_6, 0u, 1i, 0u
        %81:f32 = load %80
        %x_91:f32 = let %81
        %83:ptr<uniform, f32, read> = access %x_6, 0u, 0i, 0u
        %84:f32 = load %83
        %x_93:f32 = let %84
        %86:vec4<f32> = construct %x_87, %x_89, %x_91, %x_93
        store %x_GLF_color, %86
        exit_if  # if_4
      }
      $B10: {  # false
        %87:ptr<uniform, f32, read> = access %x_6, 0u, 1i, 0u
        %88:f32 = load %87
        %x_96:f32 = let %88
        %90:vec4<f32> = construct %x_96, %x_96, %x_96, %x_96
        store %x_GLF_color, %90
        exit_if  # if_4
      }
    }
    ret
  }
}
%tint_symbol = @fragment func():main_out {
  $B11: {
    %92:void = call %main_1
    %93:vec4<f32> = load %x_GLF_color
    %94:main_out = construct %93
    ret %94
  }
}

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