#include <metal_stdlib>
using namespace metal;
struct tint_module_vars_struct {
  device uint* prevent_dce;
};
struct VertexOutput {
  float4 pos;
  uint prevent_dce;
};
struct vertex_main_outputs {
  float4 VertexOutput_pos [[position]];
  uint VertexOutput_prevent_dce [[user(locn0)]] [[flat]];
};

uint firstTrailingBit_47d475() {
  uint arg_0 = 1u;
  uint const v = arg_0;
  uint const v_1 = select(0u, 16u, ((v & 65535u) == 0u));
  uint const v_2 = select(0u, 8u, (((v >> v_1) & 255u) == 0u));
  uint const v_3 = select(0u, 4u, ((((v >> v_1) >> v_2) & 15u) == 0u));
  uint const v_4 = select(0u, 2u, (((((v >> v_1) >> v_2) >> v_3) & 3u) == 0u));
  uint res = select((v_1 | (v_2 | (v_3 | (v_4 | select(0u, 1u, ((((((v >> v_1) >> v_2) >> v_3) >> v_4) & 1u) == 0u)))))), 4294967295u, (((((v >> v_1) >> v_2) >> v_3) >> v_4) == 0u));
  return res;
}
fragment void fragment_main(device uint* 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) = firstTrailingBit_47d475();
}
kernel void compute_main(device uint* 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) = firstTrailingBit_47d475();
}
VertexOutput vertex_main_inner() {
  VertexOutput out = {};
  out.pos = float4(0.0f);
  out.prevent_dce = firstTrailingBit_47d475();
  return out;
}
vertex vertex_main_outputs vertex_main() {
  VertexOutput const v_5 = vertex_main_inner();
  return vertex_main_outputs{.VertexOutput_pos=v_5.pos, .VertexOutput_prevent_dce=v_5.prevent_dce};
}
