SKIP: FAILED

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

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

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

%b1 = block {  # root
  %x_6:ptr<uniform, buf0, read> = var @binding_point(0, 0)
  %x_GLF_color:ptr<private, vec4<f32>, read_write> = var
}

%main_1 = func():void -> %b2 {
  %b2 = block {
    %a:ptr<function, i32, read_write> = var
    %i:ptr<function, i32, read_write> = var
    %6:ptr<uniform, i32, read> = access %x_6, 0u, 1i, 0u
    %7:i32 = load %6
    store %a, %7
    %8:ptr<uniform, i32, read> = access %x_6, 0u, 3i, 0u
    %9:i32 = load %8
    %10:i32 = negation %9
    store %i, %10
    loop [b: %b3, c: %b4] {  # loop_1
      %b3 = block {  # body
        %11:i32 = load %i
        %x_36:i32 = add %11, 1i
        store %i, %x_36
        %13:i32 = reverseBits %x_36
        %14:ptr<uniform, i32, read> = access %x_6, 0u, 2i, 0u
        %15:i32 = load %14
        %16:bool = lte %13, %15
        if %16 [t: %b5, f: %b6] {  # if_1
          %b5 = block {  # true
            exit_if  # if_1
          }
          %b6 = block {  # false
            exit_loop  # loop_1
          }
        }
        %17:i32 = load %a
        %18:i32 = add %17, 1i
        store %a, %18
        continue %b4
      }
      %b4 = block {  # continuing
        next_iteration %b3
      }
    }
    %19:i32 = load %a
    %20:ptr<uniform, i32, read> = access %x_6, 0u, 0i, 0u
    %21:i32 = load %20
    %22:bool = eq %19, %21
    if %22 [t: %b7, f: %b8] {  # if_2
      %b7 = block {  # true
        %23:ptr<uniform, i32, read> = access %x_6, 0u, 2i, 0u
        %24:i32 = load %23
        %25:f32 = convert %24
        %26:ptr<uniform, i32, read> = access %x_6, 0u, 1i, 0u
        %27:i32 = load %26
        %28:f32 = convert %27
        %29:ptr<uniform, i32, read> = access %x_6, 0u, 1i, 0u
        %30:i32 = load %29
        %31:f32 = convert %30
        %32:ptr<uniform, i32, read> = access %x_6, 0u, 2i, 0u
        %33:i32 = load %32
        %34:f32 = convert %33
        %35:vec4<f32> = construct %25, %28, %31, %34
        store %x_GLF_color, %35
        exit_if  # if_2
      }
      %b8 = block {  # false
        %36:ptr<uniform, i32, read> = access %x_6, 0u, 1i, 0u
        %37:i32 = load %36
        %38:f32 = convert %37
        %39:vec4<f32> = construct %38
        store %x_GLF_color, %39
        exit_if  # if_2
      }
    }
    ret
  }
}
%tint_symbol = @fragment func():main_out -> %b9 {
  %b9 = block {
    %41:void = call %main_1
    %42:vec4<f32> = load %x_GLF_color
    %43:main_out = construct %42
    ret %43
  }
}

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