SKIP: FAILED

void set_scalar_float4x3(inout float4x3 mat, int col, int row, float val) {
  switch (col) {
    case 0:
      mat[0] = (row.xxx == int3(0, 1, 2)) ? val.xxx : mat[0];
      break;
    case 1:
      mat[1] = (row.xxx == int3(0, 1, 2)) ? val.xxx : mat[1];
      break;
    case 2:
      mat[2] = (row.xxx == int3(0, 1, 2)) ? val.xxx : mat[2];
      break;
    case 3:
      mat[3] = (row.xxx == int3(0, 1, 2)) ? val.xxx : mat[3];
      break;
  }
}

struct tint_padded_array_element {
  float el;
};

cbuffer cbuffer_x_6 : register(b1, space0) {
  uint4 x_6[3];
};
cbuffer cbuffer_x_8 : register(b0, space0) {
  uint4 x_8[4];
};
static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);

void main_1() {
  float4x3 m43 = float4x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
  tint_padded_array_element sums[3] = (tint_padded_array_element[3])0;
  int i = 0;
  int a = 0;
  int x_67_phi = 0;
  const float x_44 = asfloat(x_6[1].x);
  const float3 x_48 = float3(0.0f, 0.0f, 0.0f);
  m43 = float4x3(float3(x_44, 0.0f, 0.0f), float3(0.0f, x_44, 0.0f), float3(0.0f, 0.0f, x_44), float3(0.0f, 0.0f, 0.0f));
  const uint scalar_offset = ((16u * uint(0))) / 4;
  const int x_51 = asint(x_8[scalar_offset / 4][scalar_offset % 4]);
  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
  const int x_53 = asint(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
  const float x_55 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
  set_scalar_float4x3(m43, x_53, x_51, x_55);
  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
  const float x_58 = asfloat(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
  const float x_60 = asfloat(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
  const uint scalar_offset_5 = ((16u * uint(0))) / 4;
  const float x_62 = asfloat(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
  const tint_padded_array_element tint_symbol_3[3] = {{x_58}, {x_60}, {x_62}};
  sums = tint_symbol_3;
  const uint scalar_offset_6 = ((16u * uint(0))) / 4;
  const int x_65 = asint(x_8[scalar_offset_6 / 4][scalar_offset_6 % 4]);
  i = x_65;
  x_67_phi = x_65;
  [loop] while (true) {
    const int x_67 = x_67_phi;
    const int x_73 = asint(x_8[3].x);
    if ((x_67 < x_73)) {
    } else {
      break;
    }
    const uint scalar_offset_7 = ((16u * uint(0))) / 4;
    const int x_77 = asint(x_8[scalar_offset_7 / 4][scalar_offset_7 % 4]);
    const uint scalar_offset_8 = ((16u * uint(0))) / 4;
    const int x_79 = asint(x_8[scalar_offset_8 / 4][scalar_offset_8 % 4]);
    const float x_81 = m43[x_67][x_79];
    const float x_83 = sums[x_77].el;
    sums[x_77].el = (x_83 + x_81);
    {
      const int x_68 = (x_67 + 1);
      i = x_68;
      x_67_phi = x_68;
    }
  }
  const int x_87 = asint(x_8[1].x);
  if ((x_87 == 1)) {
    a = 4;
    const int x_92 = asint(x_8[2].x);
    const uint scalar_offset_9 = ((16u * uint(0))) / 4;
    const int x_94 = asint(x_8[scalar_offset_9 / 4][scalar_offset_9 % 4]);
    const float x_96 = m43[4][x_94];
    const float x_98 = sums[x_92].el;
    sums[x_92].el = (x_98 + x_96);
  }
  const int x_102 = asint(x_8[1].x);
  const float x_104 = sums[x_102].el;
  const uint scalar_offset_10 = ((16u * uint(0))) / 4;
  const int x_106 = asint(x_8[scalar_offset_10 / 4][scalar_offset_10 % 4]);
  const float x_108 = sums[x_106].el;
  const float x_111 = asfloat(x_6[2].x);
  if (((x_104 + x_108) == x_111)) {
    const uint scalar_offset_11 = ((16u * uint(0))) / 4;
    const int x_117 = asint(x_8[scalar_offset_11 / 4][scalar_offset_11 % 4]);
    const int x_120 = asint(x_8[1].x);
    const int x_123 = asint(x_8[1].x);
    const uint scalar_offset_12 = ((16u * uint(0))) / 4;
    const int x_126 = asint(x_8[scalar_offset_12 / 4][scalar_offset_12 % 4]);
    x_GLF_color = float4(float(x_117), float(x_120), float(x_123), float(x_126));
  } else {
    const int x_130 = asint(x_8[1].x);
    const float x_131 = float(x_130);
    x_GLF_color = float4(x_131, x_131, x_131, x_131);
  }
  return;
}

struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol {
  float4 x_GLF_color_1 : SV_Target0;
};

main_out main_inner() {
  main_1();
  const main_out tint_symbol_4 = {x_GLF_color};
  return tint_symbol_4;
}

tint_symbol main() {
  const main_out inner_result = main_inner();
  tint_symbol wrapper_result = (tint_symbol)0;
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}
C:\src\tint\test\Shader@0x00000111C3C21900(84,24-29): error X3504: array index out of bounds

