SKIP: FAILED

#version 310 es
precision mediump float;

struct Uniforms {
  float NAN;
  ivec3 aShape;
  ivec3 bShape;
  ivec3 outShape;
  ivec2 outShapeStrides;
};

struct ssbOut {
  float result[];
};

struct ssbA {
  float A[];
};

struct ssbB {
  float B[];
};

int dimAOuter_1 = 0;
layout(binding = 3) uniform Uniforms_1 {
  float NAN;
  ivec3 aShape;
  ivec3 bShape;
  ivec3 outShape;
  ivec2 outShapeStrides;
} x_48;

int dimInner_1 = 0;
int dimBOuter_1 = 0;
layout(binding = 0) buffer ssbOut_1 {
  float result[];
} x_54;
uvec3 tint_symbol = uvec3(0u, 0u, 0u);
uvec3 tint_symbol_1 = uvec3(0u, 0u, 0u);
shared float mm_Asub[64][64];
shared float mm_Bsub[64][1];
layout(binding = 1) buffer ssbA_1 {
  float A[];
} x_165;
int batch = 0;
layout(binding = 2) buffer ssbB_1 {
  float B[];
} x_185;
bool coordsInBounds_vi2_vi2_(inout ivec2 coord, inout ivec2 shape) {
  bool x_87 = false;
  bool x_88_phi = false;
  ivec2 x_76 = coord;
  bool x_81 = all(greaterThanEqual(x_76, ivec2(0, 0)));
  x_88_phi = x_81;
  if (x_81) {
    ivec2 x_84 = coord;
    ivec2 x_85 = shape;
    x_87 = all(lessThan(x_84, x_85));
    x_88_phi = x_87;
  }
  return x_88_phi;
}

float mm_readA_i1_i1_(inout int row, inout int col) {
  int batchASize = 0;
  ivec2 param_10 = ivec2(0, 0);
  ivec2 param_11 = ivec2(0, 0);
  float x_430 = 0.0f;
  int x_417 = x_48.aShape.y;
  int x_419 = x_48.aShape.z;
  batchASize = (x_417 * x_419);
  int x_421 = row;
  int x_422 = col;
  int x_424 = dimAOuter_1;
  int x_425 = dimInner_1;
  param_10 = ivec2(x_421, x_422);
  param_11 = ivec2(x_424, x_425);
  bool x_429 = coordsInBounds_vi2_vi2_(param_10, param_11);
  if (x_429) {
    int x_438 = batch;
    int x_439 = batchASize;
    int x_441 = row;
    int x_442 = dimInner_1;
    int x_445 = col;
    float x_448 = x_165.A[(((x_438 * x_439) + (x_441 * x_442)) + x_445)];
    x_430 = x_448;
  } else {
    x_430 = 0.0f;
  }
  return x_430;
}

float mm_readB_i1_i1_(inout int row_1, inout int col_1) {
  int batchBSize = 0;
  ivec2 param_12 = ivec2(0, 0);
  ivec2 param_13 = ivec2(0, 0);
  float x_468 = 0.0f;
  int x_455 = x_48.bShape.y;
  int x_457 = x_48.bShape.z;
  batchBSize = (x_455 * x_457);
  int x_459 = row_1;
  int x_460 = col_1;
  int x_462 = dimInner_1;
  int x_463 = dimBOuter_1;
  param_12 = ivec2(x_459, x_460);
  param_13 = ivec2(x_462, x_463);
  bool x_467 = coordsInBounds_vi2_vi2_(param_12, param_13);
  if (x_467) {
    int x_475 = batch;
    int x_476 = batchBSize;
    int x_478 = row_1;
    int x_479 = dimBOuter_1;
    int x_482 = col_1;
    float x_485 = x_185.B[(((x_475 * x_476) + (x_478 * x_479)) + x_482)];
    x_468 = x_485;
  } else {
    x_468 = 0.0f;
  }
  return x_468;
}

int getOutputFlatIndex_vi3_(inout ivec3 coords) {
  ivec3 x_99 = coords;
  int x_105 = x_48.outShapeStrides.x;
  int x_107 = x_48.outShapeStrides.y;
  return int(dot(vec3(x_99), vec3(ivec3(x_105, x_107, 1))));
}

void setOutput_i1_f1_(inout int flatIndex, inout float value) {
  int x_95 = flatIndex;
  float x_96 = value;
  x_54.result[x_95] = x_96;
  return;
}

void setOutput_i1_i1_i1_f1_(inout int d0, inout int d1, inout int d2, inout float value_1) {
  int flatIndex_1 = 0;
  ivec3 param = ivec3(0, 0, 0);
  int param_1 = 0;
  float param_2 = 0.0f;
  int x_115 = d0;
  int x_116 = d1;
  int x_117 = d2;
  param = ivec3(x_115, x_116, x_117);
  int x_120 = getOutputFlatIndex_vi3_(param);
  flatIndex_1 = x_120;
  param_1 = flatIndex_1;
  float x_124 = value_1;
  param_2 = x_124;
  setOutput_i1_f1_(param_1, param_2);
  return;
}

void mm_write_i1_i1_f1_(inout int row_2, inout int col_2, inout float value_2) {
  ivec3 outCoord = ivec3(0, 0, 0);
  int param_14 = 0;
  int param_15 = 0;
  int param_16 = 0;
  float param_17 = 0.0f;
  int x_491 = batch;
  int x_492 = row_2;
  int x_493 = col_2;
  outCoord = ivec3(x_491, x_492, x_493);
  param_14 = batch;
  int x_498 = row_2;
  param_15 = x_498;
  int x_500 = col_2;
  param_16 = x_500;
  float x_502 = value_2;
  param_17 = x_502;
  setOutput_i1_i1_i1_f1_(param_14, param_15, param_16, param_17);
  return;
}

void mm_matMul_i1_i1_i1_(inout int dimAOuter, inout int dimInner, inout int dimBOuter) {
  int tileRow = 0;
  int tileCol = 0;
  int globalRow = 0;
  int globalCol = 0;
  int numTiles = 0;
  int innerRow = 0;
  int innerCol = 0;
  float acc[1][1] = float[1][1](float[1](0.0f));
  int tileColA = 0;
  int tileRowB = 0;
  int t = 0;
  int innerRow_1 = 0;
  int innerCol_1 = 0;
  int inputRow = 0;
  int inputCol = 0;
  int param_3 = 0;
  int param_4 = 0;
  int innerRow_2 = 0;
  int innerCol_2 = 0;
  int inputRow_1 = 0;
  int inputCol_1 = 0;
  int param_5 = 0;
  int param_6 = 0;
  int k = 0;
  int inner = 0;
  float BCached[1] = float[1](0.0f);
  int innerRow_3 = 0;
  float ACached = 0.0f;
  int innerCol_3 = 0;
  int innerRow_4 = 0;
  int innerCol_4 = 0;
  int param_7 = 0;
  int param_8 = 0;
  float param_9 = 0.0f;
  uint x_132 = tint_symbol.y;
  tileRow = (int(x_132) * 1);
  uint x_137 = tint_symbol.x;
  tileCol = (int(x_137) * 1);
  uint x_143 = tint_symbol_1.y;
  globalRow = (int(x_143) * 1);
  uint x_148 = tint_symbol_1.x;
  globalCol = (int(x_148) * 1);
  int x_152 = dimInner;
  numTiles = (((x_152 - 1) / 64) + 1);
  innerRow = 0;
  {
    for(; (innerRow < 1); innerRow = (innerRow + 1)) {
      innerCol = 0;
      {
        for(; (innerCol < 1); innerCol = (innerCol + 1)) {
          acc[innerRow][innerCol] = 0.0f;
        }
      }
    }
  }
  uint x_187 = tint_symbol.x;
  tileColA = (int(x_187) * 64);
  uint x_192 = tint_symbol.y;
  tileRowB = (int(x_192) * 1);
  t = 0;
  {
    for(; (t < numTiles); t = (t + 1)) {
      innerRow_1 = 0;
      {
        for(; (innerRow_1 < 1); innerRow_1 = (innerRow_1 + 1)) {
          innerCol_1 = 0;
          {
            for(; (innerCol_1 < 64); innerCol_1 = (innerCol_1 + 1)) {
              inputRow = (tileRow + innerRow_1);
              inputCol = (tileColA + innerCol_1);
              int x_233 = inputRow;
              int x_234 = inputCol;
              int x_238 = t;
              int x_240 = inputCol;
              param_3 = (globalRow + innerRow_1);
              param_4 = ((x_238 * 64) + x_240);
              float x_244 = mm_readA_i1_i1_(param_3, param_4);
              mm_Asub[x_233][x_234] = x_244;
            }
          }
        }
      }
      innerRow_2 = 0;
      {
        for(; (innerRow_2 < 1); innerRow_2 = (innerRow_2 + 1)) {
          innerCol_2 = 0;
          {
            for(; (innerCol_2 < 1); innerCol_2 = (innerCol_2 + 1)) {
              inputRow_1 = (tileRowB + innerRow_2);
              inputCol_1 = (tileCol + innerCol_2);
              int x_278 = inputRow_1;
              int x_279 = inputCol_1;
              int x_284 = globalCol;
              int x_285 = innerCol_2;
              param_5 = ((t * 64) + inputRow_1);
              param_6 = (x_284 + x_285);
              float x_289 = mm_readB_i1_i1_(param_5, param_6);
              mm_Bsub[x_278][x_279] = x_289;
            }
          }
        }
      }
      memoryBarrierShared();
      k = 0;
      {
        for(; (k < 64); k = (k + 1)) {
          inner = 0;
          {
            for(; (inner < 1); inner = (inner + 1)) {
              int x_314 = inner;
              float x_320 = mm_Bsub[k][(tileCol + inner)];
              BCached[x_314] = x_320;
            }
          }
          innerRow_3 = 0;
          {
            for(; (innerRow_3 < 1); innerRow_3 = (innerRow_3 + 1)) {
              float x_338 = mm_Asub[(tileRow + innerRow_3)][k];
              ACached = x_338;
              innerCol_3 = 0;
              {
                for(; (innerCol_3 < 1); innerCol_3 = (innerCol_3 + 1)) {
                  int x_347 = innerRow_3;
                  int x_348 = innerCol_3;
                  float x_349 = ACached;
                  float x_352 = BCached[innerCol_3];
                  float x_355 = acc[x_347][x_348];
                  acc[x_347][x_348] = (x_355 + (x_349 * x_352));
                }
              }
            }
          }
        }
      }
      memoryBarrierShared();
    }
  }
  innerRow_4 = 0;
  {
    for(; (innerRow_4 < 1); innerRow_4 = (innerRow_4 + 1)) {
      innerCol_4 = 0;
      while (true) {
        bool x_393 = false;
        bool x_394_phi = false;
        if ((innerCol_4 < 1)) {
        } else {
          break;
        }
        int x_382 = globalCol;
        int x_383 = innerCol_4;
        int x_385 = dimBOuter;
        bool x_386 = ((x_382 + x_383) < x_385);
        x_394_phi = x_386;
        if (x_386) {
          int x_389 = globalRow;
          int x_390 = innerRow_4;
          int x_392 = dimAOuter;
          x_393 = ((x_389 + x_390) < x_392);
          x_394_phi = x_393;
        }
        if (x_394_phi) {
          int x_400 = globalCol;
          int x_401 = innerCol_4;
          int x_403 = innerRow_4;
          int x_404 = innerCol_4;
          param_7 = (globalRow + innerRow_4);
          param_8 = (x_400 + x_401);
          float x_409 = acc[x_403][x_404];
          param_9 = x_409;
          mm_write_i1_i1_f1_(param_7, param_8, param_9);
        }
        {
          innerCol_4 = (innerCol_4 + 1);
        }
      }
    }
  }
  return;
}

void main_1() {
  int param_18 = 0;
  int param_19 = 0;
  int param_20 = 0;
  int x_67 = x_48.aShape.y;
  dimAOuter_1 = x_67;
  int x_71 = x_48.aShape.z;
  dimInner_1 = x_71;
  int x_75 = x_48.bShape.z;
  dimBOuter_1 = x_75;
  uint x_505 = tint_symbol_1.z;
  batch = int(x_505);
  param_18 = dimAOuter_1;
  param_19 = dimInner_1;
  param_20 = dimBOuter_1;
  mm_matMul_i1_i1_i1_(param_18, param_19, param_20);
  return;
}

struct tint_symbol_6 {
  uvec3 tint_symbol_3;
  uint local_invocation_index;
  uvec3 tint_symbol_4;
};

void tint_symbol_2_inner(uvec3 tint_symbol_3, uvec3 tint_symbol_4, uint local_invocation_index) {
  {
    uint i_1 = local_invocation_index;
    uint i_2 = (local_invocation_index % 1u);
    mm_Bsub[i_1][i_2] = 0.0f;
  }
  {
    for(uint idx = local_invocation_index; (idx < 4096u); idx = (idx + 64u)) {
      uint i = (idx / 64u);
      uint i_1 = (idx % 64u);
      mm_Asub[i][i_1] = 0.0f;
    }
  }
  memoryBarrierShared();
  tint_symbol = tint_symbol_3;
  tint_symbol_1 = tint_symbol_4;
  main_1();
}

layout(local_size_x = 1, local_size_y = 64, local_size_z = 1) in;
void tint_symbol_2(tint_symbol_6 tint_symbol_5) {
  tint_symbol_2_inner(tint_symbol_5.tint_symbol_3, tint_symbol_5.tint_symbol_4, tint_symbol_5.local_invocation_index);
  return;
}




void main() {
  tint_symbol_6 inputs;
  inputs.tint_symbol_3 = gl_LocalInvocationID;
  inputs.local_invocation_index = uint(gl_LocalInvocationIndex);
  inputs.tint_symbol_4 = gl_GlobalInvocationID;
  tint_symbol_2(inputs);
}

Error parsing GLSL shader:
ERROR: 0:13: '' : array size required 
ERROR: 0:14: '' : compilation terminated 
ERROR: 2 compilation errors.  No code generated.



