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

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

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

%main_1 = func():void {
  $B2: {
    %x_23:ptr<function, i32, read_write> = var
    %x_27:ptr<function, i32, read_write> = var
    %x_37:ptr<function, i32, read_write> = var
    %x_23_phi:ptr<function, i32, read_write> = var
    %x_45_phi:ptr<function, i32, read_write> = var
    store %x_23_phi, 0i
    loop [b: $B3, c: $B4] {  # loop_1
      $B3: {  # body
        %x_24:ptr<function, i32, read_write> = var
        %10:i32 = load %x_23_phi
        store %x_23, %10
        %11:ptr<uniform, i32, read> = access %x_5, 0u, 1i, 0u
        %12:i32 = load %11
        store %x_27, %12
        %13:i32 = load %x_23
        %14:i32 = let %13
        %15:i32 = load %x_27
        %16:i32 = bitcast %15
        %17:i32 = sub 100i, %16
        %18:bool = lt %14, %17
        if %18 [t: $B5, f: $B6] {  # if_1
          $B5: {  # true
            exit_if  # if_1
          }
          $B6: {  # false
            exit_loop  # loop_1
          }
        }
        continue  # -> $B4
      }
      $B4: {  # continuing
        %19:i32 = load %x_23
        %20:i32 = add %19, 1i
        %21:i32 = bitcast %20
        store %x_24, %21
        %22:i32 = load %x_24
        store %x_23_phi, %22
        next_iteration  # -> $B3
      }
    }
    %x_37_phi:ptr<function, i32, read_write> = var
    %x_40_phi:ptr<function, i32, read_write> = var
    %25:ptr<uniform, i32, read> = access %x_5, 0u, 0i, 0u
    %26:i32 = load %25
    %x_32:i32 = let %26
    store %x_45_phi, 1i
    %28:bool = eq %x_32, 0i
    if %28 [t: $B7] {  # if_2
      $B7: {  # true
        store %x_37_phi, 1i
        %29:i32 = load %x_23
        store %x_40_phi, %29
        loop [b: $B8, c: $B9] {  # loop_2
          $B8: {  # body
            %x_41:ptr<function, i32, read_write> = var
            %x_38:ptr<function, i32, read_write> = var
            %32:i32 = load %x_37_phi
            store %x_37, %32
            %33:i32 = load %x_40_phi
            %x_40:i32 = let %33
            %35:bool = lt %x_40, 100i
            if %35 [t: $B10, f: $B11] {  # if_3
              $B10: {  # true
                exit_if  # if_3
              }
              $B11: {  # false
                exit_loop  # loop_2
              }
            }
            continue  # -> $B9
          }
          $B9: {  # continuing
            %36:i32 = add %x_40, 1i
            store %x_41, %36
            %37:i32 = load %x_37
            %38:i32 = let %37
            %39:i32 = load %x_37
            %40:i32 = bitcast %39
            %41:i32 = sub 1i, %40
            %42:i32 = bitcast %41
            %43:i32 = mul %38, %42
            %44:i32 = bitcast %43
            store %x_38, %44
            %45:i32 = load %x_38
            store %x_37_phi, %45
            %46:i32 = load %x_41
            store %x_40_phi, %46
            next_iteration  # -> $B8
          }
        }
        %47:i32 = load %x_37
        store %x_45_phi, %47
        exit_if  # if_2
      }
    }
    %48:i32 = load %x_45_phi
    %x_45:i32 = let %48
    %50:bool = eq %x_45, %x_32
    if %50 [t: $B12, f: $B13] {  # if_4
      $B12: {  # true
        %51:i32 = load %x_27
        %52:f32 = convert %51
        %x_50:f32 = let %52
        %54:f32 = convert %x_32
        %x_51:f32 = let %54
        %56:vec4<f32> = construct %x_50, %x_51, %x_51, %x_50
        store %x_GLF_color, %56
        exit_if  # if_4
      }
      $B13: {  # false
        %57:f32 = convert %x_32
        %x_53:f32 = let %57
        %59:vec4<f32> = construct %x_53, %x_53, %x_53, %x_53
        store %x_GLF_color, %59
        exit_if  # if_4
      }
    }
    ret
  }
}
%tint_symbol = @fragment func():main_out {
  $B14: {
    %61:void = call %main_1
    %62:vec4<f32> = load %x_GLF_color
    %63:main_out = construct %62
    ret %63
  }
}

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