SKIP: FAILED

../../src/tint/lang/msl/writer/printer/printer.cc:500 internal compiler error: buf1 = struct @align(8) {
  resolution:vec2<f32> @offset(0)
}

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

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

$B1: {  # root
  %gl_FragCoord:ptr<private, vec4<f32>, read_write> = var
  %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: {
    %data:ptr<function, array<f32, 10>, read_write> = var
    %x_40:ptr<function, i32, read_write> = var
    %x_52:ptr<function, i32, read_write> = var
    store %x_40, 0i
    loop [b: $B3, c: $B4] {  # loop_1
      $B3: {  # body
        %x_41:ptr<function, i32, read_write> = var
        %10:i32 = load %x_40
        %11:bool = lt %10, 10i
        if %11 [t: $B5, f: $B6] {  # if_1
          $B5: {  # true
            exit_if  # if_1
          }
          $B6: {  # false
            exit_loop  # loop_1
          }
        }
        continue  # -> $B4
      }
      $B4: {  # continuing
        %12:i32 = load %x_40
        %13:ptr<function, f32, read_write> = access %data, %12
        %14:ptr<function, f32, read_write> = let %13
        %15:i32 = load %x_40
        %16:i32 = sub 10i, %15
        %17:f32 = convert %16
        %18:ptr<uniform, vec2<f32>, read> = access %x_9, 0u
        %19:f32 = load_vector_element %18, 1u
        %20:f32 = mul %17, %19
        store %14, %20
        %21:i32 = load %x_40
        %22:i32 = add %21, 1i
        store %x_41, %22
        %23:i32 = load %x_41
        store %x_40, %23
        next_iteration  # -> $B3
      }
    }
    store %x_52, 0i
    loop [b: $B7, c: $B8] {  # loop_2
      $B7: {  # body
        %x_59:ptr<function, i32, read_write> = var
        %x_53:ptr<function, i32, read_write> = var
        %26:i32 = load %x_52
        %27:bool = lt %26, 9i
        if %27 [t: $B9, f: $B10] {  # if_2
          $B9: {  # true
            exit_if  # if_2
          }
          $B10: {  # false
            exit_loop  # loop_2
          }
        }
        store %x_59, 0i
        loop [b: $B11, c: $B12] {  # loop_3
          $B11: {  # body
            %x_82:ptr<function, bool, read_write> = var
            %x_83:ptr<function, bool, read_write> = var
            %x_84:ptr<function, bool, read_write> = var
            %x_60:ptr<function, i32, read_write> = var
            %32:i32 = load %x_59
            %33:bool = lt %32, 10i
            if %33 [t: $B13, f: $B14] {  # if_3
              $B13: {  # true
                exit_if  # if_3
              }
              $B14: {  # false
                exit_loop  # loop_3
              }
            }
            %34:i32 = load %x_59
            %35:i32 = load %x_52
            %36:i32 = add %35, 1i
            %37:bool = lt %34, %36
            if %37 [t: $B15] {  # if_4
              $B15: {  # true
                continue  # -> $B12
              }
            }
            %38:i32 = load %x_52
            %x_69_save:i32 = let %38
            %40:i32 = load %x_52
            %41:ptr<function, f32, read_write> = access %data, %40
            %42:f32 = load %41
            %x_70:f32 = let %42
            %44:i32 = load %x_59
            %x_71_save:i32 = let %44
            %46:i32 = load %x_59
            %47:ptr<function, f32, read_write> = access %data, %46
            %48:f32 = load %47
            %x_72:f32 = let %48
            %50:f32 = load_vector_element %gl_FragCoord, 1u
            %51:ptr<uniform, vec2<f32>, read> = access %x_6, 0u
            %52:f32 = load_vector_element %51, 1u
            %53:f32 = mul %52, 0.5f
            %54:bool = lt %50, %53
            if %54 [t: $B16, f: $B17] {  # if_5
              $B16: {  # true
                %55:bool = gt %x_70, %x_72
                store %x_82, %55
                %56:bool = load %x_82
                store %x_84, %56
                exit_if  # if_5
              }
              $B17: {  # false
                %57:bool = lt %x_70, %x_72
                store %x_83, %57
                %58:bool = load %x_83
                store %x_84, %58
                exit_if  # if_5
              }
            }
            %59:bool = load %x_84
            if %59 [t: $B18] {  # if_6
              $B18: {  # true
                %60:ptr<function, f32, read_write> = access %data, %x_69_save
                %61:f32 = load %60
                %x_87:f32 = let %61
                %63:ptr<function, f32, read_write> = access %data, %x_69_save
                %64:ptr<function, f32, read_write> = access %data, %x_71_save
                %65:f32 = load %64
                store %63, %65
                %66:ptr<function, f32, read_write> = access %data, %x_71_save
                store %66, %x_87
                exit_if  # if_6
              }
            }
            continue  # -> $B12
          }
          $B12: {  # continuing
            %67:i32 = load %x_59
            %68:i32 = add %67, 1i
            store %x_60, %68
            %69:i32 = load %x_60
            store %x_59, %69
            next_iteration  # -> $B11
          }
        }
        continue  # -> $B8
      }
      $B8: {  # continuing
        %70:i32 = load %x_52
        %71:i32 = add %70, 1i
        store %x_53, %71
        %72:i32 = load %x_53
        store %x_52, %72
        next_iteration  # -> $B7
      }
    }
    %73:f32 = load_vector_element %gl_FragCoord, 0u
    %74:ptr<uniform, vec2<f32>, read> = access %x_6, 0u
    %75:f32 = load_vector_element %74, 0u
    %76:f32 = mul %75, 0.5f
    %77:bool = lt %73, %76
    if %77 [t: $B19, f: $B20] {  # if_7
      $B19: {  # true
        %78:ptr<function, f32, read_write> = access %data, 0i
        %79:f32 = load %78
        %80:f32 = mul %79, 0.10000000149011611938f
        %81:ptr<function, f32, read_write> = access %data, 5i
        %82:f32 = load %81
        %83:f32 = mul %82, 0.10000000149011611938f
        %84:ptr<function, f32, read_write> = access %data, 9i
        %85:f32 = load %84
        %86:f32 = mul %85, 0.10000000149011611938f
        %87:vec4<f32> = construct %80, %83, %86, 1.0f
        store %x_GLF_color, %87
        exit_if  # if_7
      }
      $B20: {  # false
        %88:ptr<function, f32, read_write> = access %data, 5i
        %89:f32 = load %88
        %90:f32 = mul %89, 0.10000000149011611938f
        %91:ptr<function, f32, read_write> = access %data, 9i
        %92:f32 = load %91
        %93:f32 = mul %92, 0.10000000149011611938f
        %94:ptr<function, f32, read_write> = access %data, 0i
        %95:f32 = load %94
        %96:f32 = mul %95, 0.10000000149011611938f
        %97:vec4<f32> = construct %90, %93, %96, 1.0f
        store %x_GLF_color, %97
        exit_if  # if_7
      }
    }
    ret
  }
}
%tint_symbol = @fragment func(%gl_FragCoord_param:vec4<f32> [@position]):main_out {
  $B21: {
    store %gl_FragCoord, %gl_FragCoord_param
    %100:void = call %main_1
    %101:vec4<f32> = load %x_GLF_color
    %102:main_out = construct %101
    ret %102
  }
}

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