GC_invalidate_map (struct hdr * hhdr)
{
  map_entry_type * GC_invalid_map.0;
  char * GC_invalid_map.1;
  sizetype displ.2;
  map_entry_type * D.4524;
  long unsigned int displ.3;
  register int displ;

  GC_invalid_map.0 = GC_invalid_map;
  if (GC_invalid_map.0 == 0B) goto <D.4518>; else goto <D.4519>;
  <D.4518>:
  GC_invalid_map.1 = GC_scratch_alloc (4096);
  GC_invalid_map = GC_invalid_map.1;
  GC_invalid_map.0 = GC_invalid_map;
  if (GC_invalid_map.0 == 0B) goto <D.4521>; else goto <D.4522>;
  <D.4521>:
  GC_err_puts ("Cant initialize GC_invalid_map: insufficient memory\n");
  exit (1);
  <D.4522>:
  displ = 0;
  goto <D.4482>;
  <D.4481>:
  GC_invalid_map.0 = GC_invalid_map;
  displ.2 = (sizetype) displ;
  D.4524 = GC_invalid_map.0 + displ.2;
  *D.4524 = 255;
  displ = displ + 1;
  <D.4482>:
  displ.3 = (long unsigned int) displ;
  if (displ.3 <= 4095) goto <D.4481>; else goto <D.4483>;
  <D.4483>:
  <D.4519>:
  GC_invalid_map.0 = GC_invalid_map;
  hhdr->hb_map = GC_invalid_map.0;
}


GC_register_displacement (GC_word offset)
{
  int D.4526;

  D.4526 = pthread_mutex_trylock (&GC_allocate_ml);
  if (D.4526 != 0) goto <D.4527>; else goto <D.4528>;
  <D.4527>:
  GC_lock ();
  <D.4528>:
  GC_register_displacement_inner (offset);
  pthread_mutex_unlock (&GC_allocate_ml);
}


GC_register_displacement_inner (word offset)
{
  char D.4533;
  long unsigned int D.4536;
  long unsigned int max_valid_offset.4;
  int GC_all_interior_pointers.5;
  map_entry_type * D.4543;
  map_entry_type * D.4548;
  unsigned char D.4549;
  map_entry_type * D.4553;
  register unsigned int i;
  word map_entry;

  map_entry = offset >> 2;
  if (offset > 2048) goto <D.4529>; else goto <D.4530>;
  <D.4529>:
  GC_abort ("Bad argument to GC_register_displacement");
  <D.4530>:
  if (map_entry > 253) goto <D.4531>; else goto <D.4532>;
  <D.4531>:
  map_entry = 254;
  <D.4532>:
  D.4533 = GC_arrays._valid_offsets[offset];
  if (D.4533 == 0) goto <D.4534>; else goto <D.4535>;
  <D.4534>:
  GC_arrays._valid_offsets[offset] = 1;
  D.4536 = offset & 3;
  GC_arrays._modws_valid_offsets[D.4536] = 1;
  max_valid_offset.4 = max_valid_offset;
  if (offset > max_valid_offset.4) goto <D.4538>; else goto <D.4539>;
  <D.4538>:
  max_valid_offset = offset;
  <D.4539>:
  GC_all_interior_pointers.5 = GC_all_interior_pointers;
  if (GC_all_interior_pointers.5 == 0) goto <D.4541>; else goto <D.4542>;
  <D.4541>:
  i = 0;
  goto <D.4498>;
  <D.4497>:
  D.4543 = GC_arrays._obj_map[i];
  if (D.4543 != 0B) goto <D.4544>; else goto <D.4545>;
  <D.4544>:
  if (i == 0) goto <D.4546>; else goto <D.4547>;
  <D.4546>:
  D.4543 = GC_arrays._obj_map[i];
  D.4548 = D.4543 + offset;
  D.4549 = (unsigned char) map_entry;
  *D.4548 = D.4549;
  goto <D.4550>;
  <D.4547>:
  {
    register unsigned int j;
    register unsigned int lb;

    lb = i << 2;
    if (offset < lb) goto <D.4551>; else goto <D.4552>;
    <D.4551>:
    j = offset;
    goto <D.4495>;
    <D.4494>:
    D.4543 = GC_arrays._obj_map[i];
    D.4553 = D.4543 + j;
    D.4549 = (unsigned char) map_entry;
    *D.4553 = D.4549;
    j = j + lb;
    <D.4495>:
    if (j <= 4095) goto <D.4494>; else goto <D.4496>;
    <D.4496>:
    <D.4552>:
  }
  <D.4550>:
  <D.4545>:
  i = i + 1;
  <D.4498>:
  if (i <= 512) goto <D.4497>; else goto <D.4499>;
  <D.4499>:
  <D.4542>:
  <D.4535>:
}


GC_add_map_entry (word sz)
{
  map_entry_type * D.4556;
  GC_bool D.4559;
  int GC_all_interior_pointers.6;
  char D.4568;
  map_entry_type * D.4571;
  unsigned char D.4572;
  long unsigned int max_valid_offset.7;
  unsigned int D.4580;
  map_entry_type * D.4581;
  long unsigned int D.4582;
  long unsigned int D.4583;
  register unsigned int obj_start;
  register unsigned int displ;
  register map_entry_type * new_map;
  word map_entry;

  if (sz > 512) goto <D.4554>; else goto <D.4555>;
  <D.4554>:
  sz = 0;
  <D.4555>:
  D.4556 = GC_arrays._obj_map[sz];
  if (D.4556 != 0B) goto <D.4557>; else goto <D.4558>;
  <D.4557>:
  D.4559 = 1;
  return D.4559;
  <D.4558>:
  new_map = GC_scratch_alloc (4096);
  if (new_map == 0B) goto <D.4560>; else goto <D.4561>;
  <D.4560>:
  D.4559 = 0;
  return D.4559;
  <D.4561>:
  memset (new_map, 255, 4096);
  if (sz == 0) goto <D.4562>; else goto <D.4563>;
  <D.4562>:
  displ = 0;
  goto <D.4508>;
  <D.4507>:
  GC_all_interior_pointers.6 = GC_all_interior_pointers;
  if (GC_all_interior_pointers.6 != 0) goto <D.4564>; else goto <D.4567>;
  <D.4567>:
  D.4568 = GC_arrays._valid_offsets[displ];
  if (D.4568 != 0) goto <D.4564>; else goto <D.4565>;
  <D.4564>:
  map_entry = displ >> 2;
  if (map_entry > 253) goto <D.4569>; else goto <D.4570>;
  <D.4569>:
  map_entry = 254;
  <D.4570>:
  D.4571 = new_map + displ;
  D.4572 = (unsigned char) map_entry;
  *D.4571 = D.4572;
  <D.4565>:
  displ = displ + 1;
  <D.4508>:
  max_valid_offset.7 = max_valid_offset;
  if (displ <= max_valid_offset.7) goto <D.4507>; else goto <D.4509>;
  <D.4509>:
  goto <D.4574>;
  <D.4563>:
  obj_start = 0;
  goto <D.4514>;
  <D.4513>:
  displ = 0;
  goto <D.4511>;
  <D.4510>:
  GC_all_interior_pointers.6 = GC_all_interior_pointers;
  if (GC_all_interior_pointers.6 != 0) goto <D.4575>; else goto <D.4577>;
  <D.4577>:
  D.4568 = GC_arrays._valid_offsets[displ];
  if (D.4568 != 0) goto <D.4575>; else goto <D.4576>;
  <D.4575>:
  map_entry = displ >> 2;
  if (map_entry > 253) goto <D.4578>; else goto <D.4579>;
  <D.4578>:
  map_entry = 254;
  <D.4579>:
  D.4580 = obj_start + displ;
  D.4581 = new_map + D.4580;
  D.4572 = (unsigned char) map_entry;
  *D.4581 = D.4572;
  <D.4576>:
  displ = displ + 1;
  <D.4511>:
  max_valid_offset.7 = max_valid_offset;
  if (displ <= max_valid_offset.7) goto <D.4510>; else goto <D.4512>;
  <D.4512>:
  D.4582 = sz << 2;
  obj_start = D.4582 + obj_start;
  <D.4514>:
  D.4582 = sz << 2;
  D.4583 = D.4582 + obj_start;
  if (D.4583 <= 4096) goto <D.4513>; else goto <D.4515>;
  <D.4515>:
  <D.4574>:
  GC_arrays._obj_map[sz] = new_map;
  D.4559 = 1;
  return D.4559;
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.4587;
  int D.4592;
  void * D.4594;
  unsigned int D.4595;

  D.4587 = __builtin_constant_p (__len);
  if (D.4587 != 0) goto <D.4588>; else goto <D.4589>;
  <D.4588>:
  if (__len == 0) goto <D.4590>; else goto <D.4591>;
  <D.4590>:
  D.4592 = __builtin_constant_p (__ch);
  if (D.4592 == 0) goto <D.4585>; else goto <D.4593>;
  <D.4593>:
  if (__ch != 0) goto <D.4585>; else goto <D.4586>;
  <D.4585>:
  __warn_memset_zero_len ();
  D.4594 = __dest;
  return D.4594;
  <D.4586>:
  <D.4591>:
  <D.4589>:
  D.4595 = __builtin_object_size (__dest, 0);
  D.4594 = __builtin___memset_chk (__dest, __ch, __len, D.4595);
  return D.4594;
}


