SKIP: FAILED

../../src/tint/lang/msl/writer/printer/printer.cc:500 internal compiler error: buf0 = struct @align(4) {
  injected:i32 @offset(0)
}

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

$B1: {  # root
  %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: {
    %idx:ptr<function, i32, read_write> = var
    %m43:ptr<function, mat4x3<f32>, read_write> = var
    %ll_1:ptr<function, i32, read_write> = var
    %GLF_live6rows:ptr<function, i32, read_write> = var
    %z:ptr<function, i32, read_write> = var
    %ll_2:ptr<function, i32, read_write> = var
    %ctr:ptr<function, i32, read_write> = var
    %tempm43:ptr<function, mat4x3<f32>, read_write> = var
    %ll_3:ptr<function, i32, read_write> = var
    %c:ptr<function, i32, read_write> = var
    %d:ptr<function, i32, read_write> = var
    %GLF_live6sums:ptr<function, array<f32, 9>, read_write> = var
    store %idx, 0i
    store %m43, mat4x3<f32>(vec3<f32>(1.0f, 0.0f, 0.0f), vec3<f32>(0.0f, 1.0f, 0.0f), vec3<f32>(0.0f, 0.0f, 1.0f), vec3<f32>(0.0f))
    store %ll_1, 0i
    store %GLF_live6rows, 2i
    loop [b: $B3, c: $B4] {  # loop_1
      $B3: {  # body
        %16:i32 = load %ll_1
        %17:ptr<uniform, i32, read> = access %x_9, 0u
        %18:i32 = load %17
        %19:bool = gte %16, %18
        if %19 [t: $B5] {  # if_1
          $B5: {  # true
            store %x_GLF_color, vec4<f32>(1.0f, 0.0f, 0.0f, 1.0f)
            exit_loop  # loop_1
          }
        }
        %20:i32 = load %ll_1
        %21:i32 = add %20, 1i
        store %ll_1, %21
        %22:ptr<uniform, i32, read> = access %x_9, 0u
        %23:i32 = load %22
        store %z, %23
        store %ll_2, 0i
        store %ctr, 0i
        loop [b: $B6, c: $B7] {  # loop_2
          $B6: {  # body
            %24:i32 = load %ctr
            %25:bool = lt %24, 1i
            if %25 [t: $B8, f: $B9] {  # if_2
              $B8: {  # true
                exit_if  # if_2
              }
              $B9: {  # false
                exit_loop  # loop_2
              }
            }
            %26:i32 = load %ll_2
            %27:ptr<uniform, i32, read> = access %x_9, 0u
            %28:i32 = load %27
            %29:bool = gte %26, %28
            if %29 [t: $B10] {  # if_3
              $B10: {  # true
                exit_loop  # loop_2
              }
            }
            %30:i32 = load %ll_2
            %31:i32 = add %30, 1i
            store %ll_2, %31
            %32:mat4x3<f32> = load %m43
            store %tempm43, %32
            store %ll_3, 0i
            store %c, 0i
            loop [b: $B11, c: $B12] {  # loop_3
              $B11: {  # body
                %33:i32 = load %z
                %34:bool = lt 1i, %33
                if %34 [t: $B13, f: $B14] {  # if_4
                  $B13: {  # true
                    exit_if  # if_4
                  }
                  $B14: {  # false
                    exit_loop  # loop_3
                  }
                }
                store %d, 0i
                %35:i32 = load %c
                %x_29:i32 = let %35
                %37:i32 = load %c
                %x_30:i32 = let %37
                %39:i32 = load %c
                %x_31:i32 = let %39
                %41:i32 = load %d
                %x_32:i32 = let %41
                %43:i32 = load %d
                %x_33:i32 = let %43
                %45:i32 = load %d
                %x_34:i32 = let %45
                %47:bool = gte %x_29, 0i
                %48:bool = lt %x_30, 4i
                %49:bool = and %47, %48
                %50:i32 = select 0i, %x_31, %49
                %51:ptr<function, vec3<f32>, read_write> = access %tempm43, %50
                %52:ptr<function, vec3<f32>, read_write> = let %51
                %53:bool = gte %x_32, 0i
                %54:bool = lt %x_33, 3i
                %55:bool = and %53, %54
                %56:i32 = select 0i, %x_34, %55
                store_vector_element %52, %56, 1.0f
                continue  # -> $B12
              }
              $B12: {  # continuing
                %57:i32 = load %c
                %58:i32 = add %57, 1i
                store %c, %58
                next_iteration  # -> $B11
              }
            }
            %59:i32 = load %idx
            %60:i32 = load %idx
            %61:bool = gte %60, 0i
            %62:i32 = load %idx
            %63:bool = lt %62, 9i
            %64:bool = and %61, %63
            %65:i32 = select 0i, %59, %64
            %x_117:i32 = let %65
            %67:ptr<function, f32, read_write> = access %GLF_live6sums, %x_117
            %68:ptr<function, f32, read_write> = access %GLF_live6sums, %x_117
            %69:f32 = load %68
            %70:i32 = load %ctr
            %71:ptr<function, vec3<f32>, read_write> = access %m43, %70
            %72:f32 = load_vector_element %71, 1u
            %73:f32 = add %69, %72
            store %67, %73
            continue  # -> $B7
          }
          $B7: {  # continuing
            %74:i32 = load %ctr
            %75:i32 = add %74, 1i
            store %ctr, %75
            next_iteration  # -> $B6
          }
        }
        %76:i32 = load %idx
        %77:i32 = add %76, 1i
        store %idx, %77
        continue  # -> $B4
      }
      $B4: {  # continuing
        next_iteration  # -> $B3
      }
    }
    ret
  }
}
%tint_symbol = @fragment func():main_out {
  $B15: {
    %79:void = call %main_1
    %80:vec4<f32> = load %x_GLF_color
    %81:main_out = construct %80
    ret %81
  }
}

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