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
        %x_18:i32 = let %16
        %18:ptr<uniform, i32, read> = access %x_9, 0u
        %19:i32 = load %18
        %x_19:i32 = let %19
        %21:bool = gte %x_18, %x_19
        if %21 [t: $B5] {  # if_1
          $B5: {  # true
            store %x_GLF_color, vec4<f32>(1.0f, 0.0f, 0.0f, 1.0f)
            exit_loop  # loop_1
          }
        }
        %22:i32 = load %ll_1
        %x_20:i32 = let %22
        %24:i32 = add %x_20, 1i
        store %ll_1, %24
        %25:ptr<uniform, i32, read> = access %x_9, 0u
        %26:i32 = load %25
        %x_22:i32 = let %26
        store %z, %x_22
        store %ll_2, 0i
        store %ctr, 0i
        loop [b: $B6, c: $B7] {  # loop_2
          $B6: {  # body
            %28:i32 = load %ctr
            %x_23:i32 = let %28
            %30:bool = lt %x_23, 1i
            if %30 [t: $B8, f: $B9] {  # if_2
              $B8: {  # true
                exit_if  # if_2
              }
              $B9: {  # false
                exit_loop  # loop_2
              }
            }
            %31:i32 = load %ll_2
            %x_24:i32 = let %31
            %33:ptr<uniform, i32, read> = access %x_9, 0u
            %34:i32 = load %33
            %x_25:i32 = let %34
            %36:bool = gte %x_24, %x_25
            if %36 [t: $B10] {  # if_3
              $B10: {  # true
                exit_loop  # loop_2
              }
            }
            %37:i32 = load %ll_2
            %x_26:i32 = let %37
            %39:i32 = add %x_26, 1i
            store %ll_2, %39
            %40:mat4x3<f32> = load %m43
            %x_98:mat4x3<f32> = let %40
            store %tempm43, %x_98
            store %ll_3, 0i
            store %c, 0i
            loop [b: $B11, c: $B12] {  # loop_3
              $B11: {  # body
                %42:i32 = load %z
                %x_28:i32 = let %42
                %44:bool = lt 1i, %x_28
                if %44 [t: $B13, f: $B14] {  # if_4
                  $B13: {  # true
                    exit_if  # if_4
                  }
                  $B14: {  # false
                    exit_loop  # loop_3
                  }
                }
                store %d, 0i
                %45:i32 = load %c
                %x_29:i32 = let %45
                %47:i32 = load %c
                %x_30:i32 = let %47
                %49:i32 = load %c
                %x_31:i32 = let %49
                %51:i32 = load %d
                %x_32:i32 = let %51
                %53:i32 = load %d
                %x_33:i32 = let %53
                %55:i32 = load %d
                %x_34:i32 = let %55
                %57:bool = gte %x_29, 0i
                %58:bool = lt %x_30, 4i
                %59:bool = and %57, %58
                %60:i32 = select 0i, %x_31, %59
                %61:ptr<function, vec3<f32>, read_write> = access %tempm43, %60
                %62:ptr<function, vec3<f32>, read_write> = let %61
                %63:bool = gte %x_32, 0i
                %64:bool = lt %x_33, 3i
                %65:bool = and %63, %64
                %66:i32 = select 0i, %x_34, %65
                store_vector_element %62, %66, 1.0f
                continue  # -> $B12
              }
              $B12: {  # continuing
                %67:i32 = load %c
                %x_35:i32 = let %67
                %69:i32 = add %x_35, 1i
                store %c, %69
                next_iteration  # -> $B11
              }
            }
            %70:i32 = load %idx
            %x_37:i32 = let %70
            %72:i32 = load %idx
            %x_38:i32 = let %72
            %74:i32 = load %idx
            %x_39:i32 = let %74
            %76:bool = gte %x_37, 0i
            %77:bool = lt %x_38, 9i
            %78:bool = and %76, %77
            %79:i32 = select 0i, %x_39, %78
            %x_117:i32 = let %79
            %81:i32 = load %ctr
            %x_40:i32 = let %81
            %83:ptr<function, vec3<f32>, read_write> = access %m43, %x_40
            %84:f32 = load_vector_element %83, 1u
            %x_119:f32 = let %84
            %86:ptr<function, f32, read_write> = access %GLF_live6sums, %x_117
            %87:f32 = load %86
            %x_121:f32 = let %87
            %89:ptr<function, f32, read_write> = access %GLF_live6sums, %x_117
            %90:f32 = add %x_121, %x_119
            store %89, %90
            continue  # -> $B7
          }
          $B7: {  # continuing
            %91:i32 = load %ctr
            %x_41:i32 = let %91
            %93:i32 = add %x_41, 1i
            store %ctr, %93
            next_iteration  # -> $B6
          }
        }
        %94:i32 = load %idx
        %x_43:i32 = let %94
        %96:i32 = add %x_43, 1i
        store %idx, %96
        continue  # -> $B4
      }
      $B4: {  # continuing
        next_iteration  # -> $B3
      }
    }
    ret
  }
}
%tint_symbol = @fragment func():main_out {
  $B15: {
    %98:void = call %main_1
    %99:vec4<f32> = load %x_GLF_color
    %100:main_out = construct %99
    ret %100
  }
}

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