SKIP: FAILED

../../src/tint/lang/msl/writer/printer/printer.cc:1257 internal compiler error: main_out = struct @align(16) {
  x_GLF_color_1:vec4<f32> @offset(0), @location(0)
}

$B1: {  # root
  %data:ptr<private, array<i32, 9>, read_write> = var
  %gl_FragCoord:ptr<private, vec4<f32>, read_write> = var
  %temp:ptr<private, array<i32, 7>, read_write> = var
  %x_GLF_color:ptr<private, vec4<f32>, read_write> = var
}

%func_i1_ = func(%a:ptr<function, i32, read_write>):f32 {
  $B2: {
    %b:ptr<function, i32, read_write> = var
    %i:ptr<function, i32, read_write> = var
    %x_115:ptr<function, bool, read_write> = var
    %x_116_phi:ptr<function, bool, read_write> = var
    store %b, 0i
    %11:ptr<private, i32, read_write> = access %data, 0i
    store %11, 5i
    %12:ptr<private, i32, read_write> = access %data, 2i
    store %12, 0i
    %13:ptr<private, i32, read_write> = access %data, 4i
    store %13, 0i
    %14:ptr<private, i32, read_write> = access %data, 6i
    store %14, 0i
    %15:ptr<private, i32, read_write> = access %data, 8i
    store %15, 0i
    %16:f32 = load_vector_element %gl_FragCoord, 0u
    %x_71:f32 = let %16
    %18:bool = gte %x_71, 0.0f
    if %18 [t: $B3] {  # if_1
      $B3: {  # true
        loop [b: $B4, c: $B5] {  # loop_1
          $B4: {  # body
            %19:i32 = load %b
            %x_79:i32 = let %19
            %21:i32 = load %a
            %x_80:i32 = let %21
            %23:bool = lte %x_79, %x_80
            if %23 [t: $B6, f: $B7] {  # if_2
              $B6: {  # true
                exit_if  # if_2
              }
              $B7: {  # false
                exit_loop  # loop_1
              }
            }
            %24:i32 = load %b
            %x_83:i32 = let %24
            %26:bool = lte %x_83, 5i
            if %26 [t: $B8] {  # if_3
              $B8: {  # true
                %27:i32 = load %b
                %x_87:i32 = let %27
                %29:i32 = load %b
                %x_88:i32 = let %29
                %31:ptr<private, i32, read_write> = access %data, %x_88
                %32:i32 = load %31
                %x_90:i32 = let %32
                %34:ptr<private, i32, read_write> = access %temp, %x_87
                store %34, %x_90
                %35:i32 = load %b
                %x_92:i32 = let %35
                %37:i32 = add %x_92, 2i
                store %b, %37
                exit_if  # if_3
              }
            }
            continue  # -> $B5
          }
          $B5: {  # continuing
            next_iteration  # -> $B4
          }
        }
        exit_if  # if_1
      }
    }
    store %i, 0i
    loop [b: $B9, c: $B10] {  # loop_2
      $B9: {  # body
        %38:i32 = load %i
        %x_98:i32 = let %38
        %40:bool = lt %x_98, 3i
        if %40 [t: $B11, f: $B12] {  # if_4
          $B11: {  # true
            exit_if  # if_4
          }
          $B12: {  # false
            exit_loop  # loop_2
          }
        }
        %41:i32 = load %i
        %x_101:i32 = let %41
        %43:ptr<private, i32, read_write> = access %temp, 0i
        %44:i32 = load %43
        %x_103:i32 = let %44
        %46:ptr<private, i32, read_write> = access %data, %x_101
        %47:i32 = add %x_103, 1i
        store %46, %47
        continue  # -> $B10
      }
      $B10: {  # continuing
        %48:i32 = load %i
        %x_106:i32 = let %48
        %50:i32 = add %x_106, 1i
        store %i, %50
        next_iteration  # -> $B9
      }
    }
    %51:ptr<private, i32, read_write> = access %temp, 0i
    %52:i32 = load %51
    %x_109:i32 = let %52
    %54:bool = eq %x_109, 5i
    %x_110:bool = let %54
    store %x_116_phi, %x_110
    if %x_110 [t: $B13] {  # if_5
      $B13: {  # true
        %56:ptr<private, i32, read_write> = access %data, 0i
        %57:i32 = load %56
        %x_114:i32 = let %57
        %59:bool = eq %x_114, 6i
        store %x_115, %59
        %60:bool = load %x_115
        store %x_116_phi, %60
        exit_if  # if_5
      }
    }
    %61:bool = load %x_116_phi
    %x_116:bool = let %61
    if %x_116 [t: $B14, f: $B15] {  # if_6
      $B14: {  # true
        ret 1.0f
      }
      $B15: {  # false
        ret 0.0f
      }
    }
    unreachable
  }
}
%main_1 = func():void {
  $B16: {
    %i_1:ptr<function, i32, read_write> = var
    %param:ptr<function, i32, read_write> = var
    %param_1:ptr<function, i32, read_write> = var
    store %i_1, 0i
    loop [b: $B17, c: $B18] {  # loop_3
      $B17: {  # body
        %67:i32 = load %i_1
        %x_51:i32 = let %67
        %69:bool = lt %x_51, 6i
        if %69 [t: $B19, f: $B20] {  # if_7
          $B19: {  # true
            exit_if  # if_7
          }
          $B20: {  # false
            exit_loop  # loop_3
          }
        }
        %70:i32 = load %i_1
        %x_54:i32 = let %70
        store %param, %x_54
        %72:f32 = call %func_i1_, %param
        %x_55:f32 = let %72
        %74:i32 = load %i_1
        %x_56:i32 = let %74
        store %param_1, %x_56
        %76:f32 = call %func_i1_, %param_1
        %x_57:f32 = let %76
        %78:bool = eq %x_57, 1.0f
        if %78 [t: $B21, f: $B22] {  # if_8
          $B21: {  # true
            store %x_GLF_color, vec4<f32>(1.0f, 0.0f, 0.0f, 1.0f)
            exit_if  # if_8
          }
          $B22: {  # false
            store %x_GLF_color, vec4<f32>(0.0f)
            exit_if  # if_8
          }
        }
        continue  # -> $B18
      }
      $B18: {  # continuing
        %79:i32 = load %i_1
        %x_62:i32 = let %79
        %81:i32 = add %x_62, 1i
        store %i_1, %81
        next_iteration  # -> $B17
      }
    }
    ret
  }
}
%tint_symbol = @fragment func(%gl_FragCoord_param:vec4<f32> [@position]):main_out {
  $B23: {
    store %gl_FragCoord, %gl_FragCoord_param
    %84:void = call %main_1
    %85:vec4<f32> = load %x_GLF_color
    %86:main_out = construct %85
    ret %86
  }
}

invalid entry point IO struct uses
********************************************************************
*  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.  *
********************************************************************
