#version 310 es
precision mediump float;

shared int a;
void uses_a() {
  a = (a + 1);
}

struct tint_symbol_1 {
  uint local_invocation_index;
};

void main1_inner(uint local_invocation_index) {
  {
    a = 0;
  }
  memoryBarrierShared();
  a = 42;
  uses_a();
}

struct tint_symbol_3 {
  uint local_invocation_index_1;
};

struct tint_symbol_5 {
  uint local_invocation_index_2;
};

layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void main1(tint_symbol_1 tint_symbol) {
  main1_inner(tint_symbol.local_invocation_index);
  return;
}


void main() {
  tint_symbol_1 inputs;
  inputs.local_invocation_index = uint(gl_LocalInvocationIndex);
  main1(inputs);
}

#version 310 es
precision mediump float;

shared int b;
void uses_b() {
  b = (b * 2);
}

struct tint_symbol_1 {
  uint local_invocation_index;
};

struct tint_symbol_3 {
  uint local_invocation_index_1;
};

void main2_inner(uint local_invocation_index_1) {
  {
    b = 0;
  }
  memoryBarrierShared();
  b = 7;
  uses_b();
}

struct tint_symbol_5 {
  uint local_invocation_index_2;
};

layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void main2(tint_symbol_3 tint_symbol_2) {
  main2_inner(tint_symbol_2.local_invocation_index_1);
  return;
}


void main() {
  tint_symbol_3 inputs;
  inputs.local_invocation_index_1 = uint(gl_LocalInvocationIndex);
  main2(inputs);
}

#version 310 es
precision mediump float;

shared int a;
shared int b;
void uses_a() {
  a = (a + 1);
}

void uses_b() {
  b = (b * 2);
}

void uses_a_and_b() {
  b = a;
}

void no_uses() {
}

void outer() {
  a = 0;
  uses_a();
  uses_a_and_b();
  uses_b();
  no_uses();
}

struct tint_symbol_1 {
  uint local_invocation_index;
};

struct tint_symbol_3 {
  uint local_invocation_index_1;
};

struct tint_symbol_5 {
  uint local_invocation_index_2;
};

void main3_inner(uint local_invocation_index_2) {
  {
    a = 0;
    b = 0;
  }
  memoryBarrierShared();
  outer();
  no_uses();
}

layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void main3(tint_symbol_5 tint_symbol_4) {
  main3_inner(tint_symbol_4.local_invocation_index_2);
  return;
}


void main() {
  tint_symbol_5 inputs;
  inputs.local_invocation_index_2 = uint(gl_LocalInvocationIndex);
  main3(inputs);
}

#version 310 es
precision mediump float;

void no_uses() {
}

struct tint_symbol_1 {
  uint local_invocation_index;
};

struct tint_symbol_3 {
  uint local_invocation_index_1;
};

struct tint_symbol_5 {
  uint local_invocation_index_2;
};

layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void main4() {
  no_uses();
  return;
}

void main() {
  main4();
}

