SKIP: FAILED

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

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

buf2 = struct @align(8) {
  injectionSwitch:vec2<f32> @offset(0)
}

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

%b1 = block {  # root
  %x_GLF_global_loop_count:ptr<private, i32, read_write> = var
  %x_7:ptr<uniform, buf1, read> = var @binding_point(0, 1)
  %x_10:ptr<uniform, buf0, read> = var @binding_point(0, 0)
  %x_12:ptr<uniform, buf2, read> = var @binding_point(0, 2)
  %x_GLF_color:ptr<private, vec4<f32>, read_write> = var
}

%main_1 = func():void -> %b2 {
  %b2 = block {
    %f:ptr<function, f32, read_write> = var
    %r:ptr<function, i32, read_write> = var
    store %x_GLF_global_loop_count, 0i
    %9:ptr<uniform, f32, read> = access %x_7, 0u, 0i, 0u
    %x_42:f32 = load %9
    store %f, %x_42
    %11:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
    %x_44:i32 = load %11
    store %r, %x_44
    loop [b: %b3, c: %b4] {  # loop_1
      %b3 = block {  # body
        %x_49:i32 = load %r
        %14:ptr<uniform, i32, read> = access %x_10, 0u, 2i, 0u
        %x_51:i32 = load %14
        %16:bool = lt %x_49, %x_51
        if %16 [t: %b5, f: %b6] {  # if_1
          %b5 = block {  # true
            exit_if  # if_1
          }
          %b6 = block {  # false
            exit_loop  # loop_1
          }
        }
        %x_54:i32 = load %x_GLF_global_loop_count
        %18:i32 = add %x_54, 1i
        store %x_GLF_global_loop_count, %18
        %19:ptr<uniform, vec2<f32>, read> = access %x_12, 0u
        %x_57:vec2<f32> = load %19
        %x_60:f32 = load %f
        %22:vec2<f32> = dpdx %x_57
        %23:f32 = access %22, 1u
        %24:f32 = add %x_60, %23
        store %f, %24
        continue %b4
      }
      %b4 = block {  # continuing
        %x_62:i32 = load %r
        %26:i32 = add %x_62, 1i
        store %r, %26
        next_iteration %b3
      }
    }
    loop [b: %b7, c: %b8] {  # loop_2
      %b7 = block {  # body
        %x_68:i32 = load %x_GLF_global_loop_count
        %28:bool = lt %x_68, 100i
        if %28 [t: %b9, f: %b10] {  # if_2
          %b9 = block {  # true
            exit_if  # if_2
          }
          %b10 = block {  # false
            exit_loop  # loop_2
          }
        }
        %x_71:i32 = load %x_GLF_global_loop_count
        %30:i32 = add %x_71, 1i
        store %x_GLF_global_loop_count, %30
        %31:ptr<uniform, f32, read> = access %x_7, 0u, 0i, 0u
        %x_74:f32 = load %31
        %x_75:f32 = load %f
        %34:f32 = add %x_75, %x_74
        store %f, %34
        continue %b8
      }
      %b8 = block {  # continuing
        next_iteration %b7
      }
    }
    %x_77:f32 = load %f
    %36:ptr<uniform, f32, read> = access %x_7, 0u, 1i, 0u
    %x_79:f32 = load %36
    %38:bool = eq %x_77, %x_79
    if %38 [t: %b11, f: %b12] {  # if_3
      %b11 = block {  # true
        %39:ptr<uniform, i32, read> = access %x_10, 0u, 0i, 0u
        %x_85:i32 = load %39
        %41:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
        %x_88:i32 = load %41
        %43:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
        %x_91:i32 = load %43
        %45:ptr<uniform, i32, read> = access %x_10, 0u, 0i, 0u
        %x_94:i32 = load %45
        %47:f32 = convert %x_85
        %48:f32 = convert %x_88
        %49:f32 = convert %x_91
        %50:f32 = convert %x_94
        %51:vec4<f32> = construct %47, %48, %49, %50
        store %x_GLF_color, %51
        exit_if  # if_3
      }
      %b12 = block {  # false
        %52:ptr<uniform, i32, read> = access %x_10, 0u, 1i, 0u
        %x_98:i32 = load %52
        %x_99:f32 = convert %x_98
        %55:vec4<f32> = construct %x_99, %x_99, %x_99, %x_99
        store %x_GLF_color, %55
        exit_if  # if_3
      }
    }
    ret
  }
}
%tint_symbol = @fragment func():main_out -> %b13 {
  %b13 = block {
    %57:void = call %main_1
    %58:vec4<f32> = load %x_GLF_color
    %59:main_out = construct %58
    ret %59
  }
}

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