#include <metal_stdlib>
using namespace metal;

struct tint_immediate_data_struct {
  /* 0x0000 */ uint tint_non_constant_zero;
  /* 0x0004 */ array<int8_t, 2044> tint_pad;
  /* 0x0800 */ array<uint, 1> tint_storage_buffer_sizes;
};

struct tint_module_vars_struct {
  device array<uchar, 1>* v;
  const constant tint_immediate_data_struct* tint_immediate_data;
};

struct tint_array_lengths_struct {
  uint tint_array_length_0_0;
};

struct S {
  /* 0x0000 */ float4 a;
  /* 0x0010 */ array<uint, 1> b;
  /* 0x0014 */ array<int8_t, 12> tint_pad_1;
};
typedef S __attribute__((__may_alias__)) tint_aliased_S;

[[max_total_threads_per_threadgroup(1)]]
kernel void v_1(device array<uchar, 1>* v [[buffer(0)]], const constant tint_immediate_data_struct* tint_immediate_data [[buffer(30)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.v=v, .tint_immediate_data=tint_immediate_data};
  bool const v_2 = (tint_array_lengths_struct{.tint_array_length_0_0=(*tint_module_vars.tint_immediate_data).tint_storage_buffer_sizes[0u]}.tint_array_length_0_0 < 64u);
  device tint_aliased_S* const v_3 = reinterpret_cast<device S*>(reinterpret_cast<device char*>(tint_module_vars.v) + select(0u, 0u, v_2));
  device tint_aliased_S* const p = v_3;
  (*p).b[min(4u, (((select(64u, 20u, v_2) - 16u) / 4u) - 1u))] = 4u;
}
