#include <metal_stdlib>
using namespace metal;

struct tint_module_vars_struct {
  device int* prevent_dce;
};

struct VertexOutput {
  float4 pos;
  int prevent_dce;
};

struct vertex_main_outputs {
  float4 VertexOutput_pos [[position]];
  int VertexOutput_prevent_dce [[user(locn0)]] [[flat]];
};

int reverseBits_7c4269() {
  int res = (-2147483647 - 1);
  return res;
}

fragment void fragment_main(device int* prevent_dce [[buffer(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
  (*tint_module_vars.prevent_dce) = reverseBits_7c4269();
}

kernel void compute_main(device int* prevent_dce [[buffer(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
  (*tint_module_vars.prevent_dce) = reverseBits_7c4269();
}

VertexOutput vertex_main_inner() {
  VertexOutput out = {};
  out.pos = float4(0.0f);
  out.prevent_dce = reverseBits_7c4269();
  return out;
}

vertex vertex_main_outputs vertex_main() {
  VertexOutput const v = vertex_main_inner();
  vertex_main_outputs tint_wrapper_result = {};
  tint_wrapper_result.VertexOutput_pos = v.pos;
  tint_wrapper_result.VertexOutput_prevent_dce = v.prevent_dce;
  return tint_wrapper_result;
}
