SKIP: FAILED

../../src/tint/lang/msl/writer/printer/printer.cc:500 internal compiler error: buf0 = struct @align(4) {
  one: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_8:ptr<uniform, buf0, read> = var @binding_point(0, 0)
  %x_GLF_color:ptr<private, vec4<f32>, read_write> = var
}

%main_1 = func():void {
  $B2: {
    %a:ptr<function, vec2<f32>, read_write> = var
    %b:ptr<function, vec3<f32>, read_write> = var
    %x_105:ptr<function, bool, read_write> = var
    %x_111:ptr<function, bool, read_write> = var
    %x_106_phi:ptr<function, bool, read_write> = var
    %x_112_phi:ptr<function, bool, read_write> = var
    store %a, vec2<f32>(1.0f)
    store %b, vec3<f32>(0.0f)
    %11:f32 = load_vector_element %gl_FragCoord, 1u
    %x_52:f32 = let %11
    %13:i32 = call %tint_f32_to_i32, %x_52
    %15:bool = lt %13, 40i
    if %15 [t: $B3, f: $B4] {  # if_1
      $B3: {  # true
        store %b, vec3<f32>(0.10000000149011611938f)
        exit_if  # if_1
      }
      $B4: {  # false
        %16:f32 = load_vector_element %gl_FragCoord, 1u
        %x_59:f32 = let %16
        %18:i32 = call %tint_f32_to_i32, %x_59
        %19:bool = lt %18, 60i
        if %19 [t: $B5, f: $B6] {  # if_2
          $B5: {  # true
            store %b, vec3<f32>(0.20000000298023223877f)
            exit_if  # if_2
          }
          $B6: {  # false
            %20:f32 = load_vector_element %gl_FragCoord, 1u
            %x_66:f32 = let %20
            %22:bool = lt %x_66, 80.0f
            if %22 [t: $B7, f: $B8] {  # if_3
              $B7: {  # true
                %23:f32 = load_vector_element %a, 0u
                %x_72:f32 = let %23
                %25:ptr<uniform, f32, read> = access %x_8, 0u
                %26:f32 = load %25
                %x_74:f32 = let %26
                %28:vec3<f32> = construct %x_72, %x_72, %x_72
                %29:vec3<f32> = let %28
                %30:vec3<f32> = construct %x_74, %x_74, %x_74
                %31:vec3<f32> = add %29, %30
                %32:vec3<f32> = cos %31
                %33:vec3<f32> = add %32, vec3<f32>(0.00999999977648258209f)
                store %b, %33
                exit_if  # if_3
              }
              $B8: {  # false
                %34:f32 = load_vector_element %gl_FragCoord, 1u
                %x_82:f32 = let %34
                %36:i32 = call %tint_f32_to_i32, %x_82
                %37:bool = lt %36, 100i
                if %37 [t: $B9, f: $B10] {  # if_4
                  $B9: {  # true
                    %38:ptr<uniform, f32, read> = access %x_8, 0u
                    %39:f32 = load %38
                    %x_89:f32 = let %39
                    %41:vec3<f32> = construct %x_89, %x_89, %x_89
                    %42:vec3<f32> = cos %41
                    store %b, %42
                    exit_if  # if_4
                  }
                  $B10: {  # false
                    %43:f32 = load_vector_element %gl_FragCoord, 1u
                    %x_93:f32 = let %43
                    %45:i32 = call %tint_f32_to_i32, %x_93
                    %46:bool = lt %45, 500i
                    if %46 [t: $B11] {  # if_5
                      $B11: {  # true
                        store %b, vec3<f32>(0.540302276611328125f, 0.540302276611328125f, -0.99996083974838256836f)
                        exit_if  # if_5
                      }
                    }
                    exit_if  # if_4
                  }
                }
                exit_if  # if_3
              }
            }
            exit_if  # if_2
          }
        }
        exit_if  # if_1
      }
    }
    %47:f32 = load_vector_element %b, 0u
    %x_99:f32 = let %47
    %49:bool = lt %x_99, 1.01999998092651367188f
    %x_100:bool = let %49
    store %x_106_phi, %x_100
    if %x_100 [t: $B12] {  # if_6
      $B12: {  # true
        %51:f32 = load_vector_element %b, 1u
        %x_104:f32 = let %51
        %53:bool = lt %x_104, 1.01999998092651367188f
        store %x_105, %53
        %54:bool = load %x_105
        store %x_106_phi, %54
        exit_if  # if_6
      }
    }
    %55:bool = load %x_106_phi
    %x_106:bool = let %55
    store %x_112_phi, %x_106
    if %x_106 [t: $B13] {  # if_7
      $B13: {  # true
        %57:f32 = load_vector_element %b, 2u
        %x_110:f32 = let %57
        %59:bool = lt %x_110, 1.01999998092651367188f
        store %x_111, %59
        %60:bool = load %x_111
        store %x_112_phi, %60
        exit_if  # if_7
      }
    }
    %61:bool = load %x_112_phi
    %x_112:bool = let %61
    if %x_112 [t: $B14, f: $B15] {  # if_8
      $B14: {  # true
        store %x_GLF_color, vec4<f32>(1.0f, 0.0f, 0.0f, 1.0f)
        exit_if  # if_8
      }
      $B15: {  # false
        store %x_GLF_color, vec4<f32>(0.0f)
        exit_if  # if_8
      }
    }
    ret
  }
}
%tint_symbol = @fragment func(%gl_FragCoord_param:vec4<f32> [@position]):main_out {
  $B16: {
    store %gl_FragCoord, %gl_FragCoord_param
    %65:void = call %main_1
    %66:vec4<f32> = load %x_GLF_color
    %67:main_out = construct %66
    ret %67
  }
}
%tint_f32_to_i32 = func(%value:f32):i32 {
  $B17: {
    %69:i32 = convert %value
    %70:bool = gte %value, -2147483648.0f
    %71:i32 = select -2147483648i, %69, %70
    %72:bool = lte %value, 2147483520.0f
    %73:i32 = select 2147483647i, %71, %72
    ret %73
  }
}

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