sgen_los_free_object (struct LOSObject * obj)
{
  struct FILE * gc_debug_file.0;
  char[0:] * D.17480;
  unsigned int D.17481;
  unsigned int los_memory_usage.1;
  unsigned int los_memory_usage.2;
  unsigned int los_num_objects.3;
  unsigned int los_num_objects.4;
  int pagesize.5;
  int pagesize.6;
  unsigned int pagesize.7;
  unsigned int D.17493;
  int D.17494;
  unsigned int D.17495;
  unsigned int D.17497;
  size_t size;

  size = obj->size;
  if (0 != 0) goto <D.17477>; else goto <D.17478>;
  <D.17477>:
  gc_debug_file.0 = gc_debug_file;
  D.17480 = &obj->data;
  D.17481 = obj->size;
  fprintf (gc_debug_file.0, "Freed large object %p, size %lu\n", D.17480, D.17481);
  gc_debug_file.0 = gc_debug_file;
  fflush (gc_debug_file.0);
  <D.17478>:
  los_memory_usage.1 = los_memory_usage;
  los_memory_usage.2 = los_memory_usage.1 - size;
  los_memory_usage = los_memory_usage.2;
  los_num_objects.3 = los_num_objects;
  los_num_objects.4 = los_num_objects.3 + 4294967295;
  los_num_objects = los_num_objects.4;
  if (size > 1044464) goto <D.17486>; else goto <D.17487>;
  <D.17486>:
  pagesize.5 = pagesize;
  if (pagesize.5 == 0) goto <D.17489>; else goto <D.17490>;
  <D.17489>:
  pagesize.6 = mono_pagesize ();
  pagesize = pagesize.6;
  <D.17490>:
  size = size + 16;
  pagesize.5 = pagesize;
  pagesize.7 = (unsigned int) pagesize.5;
  D.17493 = pagesize.7 + size;
  size = D.17493 + 4294967295;
  pagesize.5 = pagesize;
  D.17494 = -pagesize.5;
  D.17495 = (unsigned int) D.17494;
  size = D.17495 & size;
  sgen_free_os_memory (obj, size, 1);
  sgen_memgov_release_space (size, 2);
  goto <D.17496>;
  <D.17487>:
  D.17497 = size + 16;
  free_los_section_memory (obj, D.17497);
  <D.17496>:
}


free_los_section_memory (struct LOSObject * obj, size_t size)
{
  unsigned int obj.8;
  unsigned int D.17499;
  unsigned int D.17500;
  unsigned int D.17501;
  _Bool D.17502;
  long int D.17503;
  long int D.17504;
  _Bool D.17507;
  long int D.17508;
  long int D.17509;
  int D.17512;
  int D.17513;
  _Bool D.17514;
  long int D.17515;
  long int D.17516;
  int obj.9;
  int section.10;
  int D.17521;
  unsigned char * D.17522;
  sizetype i.11;
  unsigned char * D.17524;
  unsigned char D.17525;
  _Bool D.17526;
  long int D.17527;
  long int D.17528;
  int D.17531;
  struct LOSSection * section;
  int num_chunks;
  int i;
  int start_index;

  obj.8 = (unsigned int) obj;
  D.17499 = obj.8 & 4293918720;
  section = (struct LOSSection *) D.17499;
  size = size + 4095;
  size = size & 4294963200;
  D.17500 = size >> 12;
  num_chunks = (int) D.17500;
  D.17501 = size + 4294967280;
  D.17502 = D.17501 > 1044464;
  D.17503 = (long int) D.17502;
  D.17504 = __builtin_expect (D.17503, 0);
  if (D.17504 != 0) goto <D.17505>; else goto <D.17506>;
  <D.17505>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 267, "size > 0 && size - sizeof (LOSObject) <= LOS_SECTION_OBJECT_LIMIT");
  <D.17506>:
  D.17507 = num_chunks <= 0;
  D.17508 = (long int) D.17507;
  D.17509 = __builtin_expect (D.17508, 0);
  if (D.17509 != 0) goto <D.17510>; else goto <D.17511>;
  <D.17510>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 268, "num_chunks > 0");
  <D.17511>:
  D.17512 = section->num_free_chunks;
  D.17513 = D.17512 + num_chunks;
  section->num_free_chunks = D.17513;
  D.17512 = section->num_free_chunks;
  D.17514 = D.17512 > 255;
  D.17515 = (long int) D.17514;
  D.17516 = __builtin_expect (D.17515, 0);
  if (D.17516 != 0) goto <D.17517>; else goto <D.17518>;
  <D.17517>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 271, "section->num_free_chunks <= LOS_SECTION_NUM_CHUNKS");
  <D.17518>:
  obj.9 = (int) obj;
  section.10 = (int) section;
  D.17521 = obj.9 - section.10;
  start_index = D.17521 >> 12;
  i = start_index;
  goto <D.17363>;
  <D.17362>:
  D.17522 = section->free_chunk_map;
  i.11 = (sizetype) i;
  D.17524 = D.17522 + i.11;
  D.17525 = *D.17524;
  D.17526 = D.17525 != 0;
  D.17527 = (long int) D.17526;
  D.17528 = __builtin_expect (D.17527, 0);
  if (D.17528 != 0) goto <D.17529>; else goto <D.17530>;
  <D.17529>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 281, "!section->free_chunk_map [i]");
  <D.17530>:
  D.17522 = section->free_chunk_map;
  i.11 = (sizetype) i;
  D.17524 = D.17522 + i.11;
  *D.17524 = 1;
  i = i + 1;
  <D.17363>:
  D.17531 = start_index + num_chunks;
  if (D.17531 > i) goto <D.17362>; else goto <D.17364>;
  <D.17364>:
  add_free_chunk (obj, size);
}


add_free_chunk (struct LOSFreeChunks * free_chunks, size_t size)
{
  unsigned int D.17532;
  struct LOSFreeChunks * D.17535;
  int num_chunks;

  D.17532 = size >> 12;
  num_chunks = (int) D.17532;
  free_chunks->size = size;
  if (num_chunks > 31) goto <D.17533>; else goto <D.17534>;
  <D.17533>:
  num_chunks = 0;
  <D.17534>:
  D.17535 = los_fast_free_lists[num_chunks];
  free_chunks->next_size = D.17535;
  los_fast_free_lists[num_chunks] = free_chunks;
}


sgen_los_alloc_large_inner (struct MonoVTable * vtable, size_t size)
{
  _Bool D.17536;
  long int D.17537;
  long int D.17538;
  unsigned int D.17541;
  _Bool D.17542;
  long int D.17543;
  long int D.17544;
  int pagesize.12;
  int pagesize.13;
  unsigned int pagesize.14;
  unsigned int D.17554;
  int D.17555;
  unsigned int D.17556;
  int D.17557;
  unsigned int D.17561;
  void * D.17566;
  char[0:] * D.17567;
  unsigned int D.17568;
  unsigned int D.17569;
  _Bool D.17570;
  long int D.17571;
  long int D.17572;
  unsigned int D.17575;
  struct LOSObject * los_object_list.15;
  unsigned int los_memory_usage.16;
  unsigned int los_memory_usage.17;
  unsigned int los_num_objects.18;
  unsigned int los_num_objects.19;
  struct FILE * gc_debug_file.20;
  struct MonoClass * D.17584;
  const char * D.17585;
  struct LOSObject * obj;
  void * * vtslot;

  obj = 0B;
  D.17536 = size <= 8000;
  D.17537 = (long int) D.17536;
  D.17538 = __builtin_expect (D.17537, 0);
  if (D.17538 != 0) goto <D.17539>; else goto <D.17540>;
  <D.17539>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 334, "size > SGEN_MAX_SMALL_OBJ_SIZE");
  <D.17540>:
  D.17541 = size & 1;
  D.17542 = D.17541 != 0;
  D.17543 = (long int) D.17542;
  D.17544 = __builtin_expect (D.17543, 0);
  if (D.17544 != 0) goto <D.17545>; else goto <D.17546>;
  <D.17545>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 335, "(size & 1) == 0");
  <D.17546>:
  sgen_ensure_free_space (size);
  if (size > 1044464) goto <D.17547>; else goto <D.17548>;
  <D.17547>:
  {
    size_t alloc_size;

    alloc_size = size;
    pagesize.12 = pagesize;
    if (pagesize.12 == 0) goto <D.17550>; else goto <D.17551>;
    <D.17550>:
    pagesize.13 = mono_pagesize ();
    pagesize = pagesize.13;
    <D.17551>:
    alloc_size = alloc_size + 16;
    pagesize.12 = pagesize;
    pagesize.14 = (unsigned int) pagesize.12;
    D.17554 = pagesize.14 + alloc_size;
    alloc_size = D.17554 + 4294967295;
    pagesize.12 = pagesize;
    D.17555 = -pagesize.12;
    D.17556 = (unsigned int) D.17555;
    alloc_size = D.17556 & alloc_size;
    D.17557 = sgen_memgov_try_alloc_space (alloc_size, 2);
    if (D.17557 != 0) goto <D.17558>; else goto <D.17559>;
    <D.17558>:
    obj = sgen_alloc_os_memory (alloc_size, 3, 0B);
    <D.17559>:
  }
  goto <D.17560>;
  <D.17548>:
  D.17561 = size + 16;
  obj = get_los_section_memory (D.17561);
  if (obj != 0B) goto <D.17562>; else goto <D.17563>;
  <D.17562>:
  D.17561 = size + 16;
  memset (obj, 0, D.17561);
  <D.17563>:
  <D.17560>:
  if (obj == 0B) goto <D.17564>; else goto <D.17565>;
  <D.17564>:
  D.17566 = 0B;
  return D.17566;
  <D.17565>:
  D.17567 = &obj->data;
  D.17568 = (unsigned int) D.17567;
  D.17569 = D.17568 & 7;
  D.17570 = D.17569 != 0;
  D.17571 = (long int) D.17570;
  D.17572 = __builtin_expect (D.17571, 0);
  if (D.17572 != 0) goto <D.17573>; else goto <D.17574>;
  <D.17573>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 371, "!((mword)obj->data & (SGEN_ALLOC_ALIGN - 1))");
  <D.17574>:
  obj->size = size;
  vtslot = &obj->data;
  *vtslot = vtable;
  D.17567 = &obj->data;
  D.17568 = (unsigned int) D.17567;
  D.17567 = &obj->data;
  D.17568 = (unsigned int) D.17567;
  D.17575 = D.17568 + size;
  sgen_update_heap_boundaries (D.17568, D.17575);
  los_object_list.15 = los_object_list;
  obj->next = los_object_list.15;
  los_object_list = obj;
  los_memory_usage.16 = los_memory_usage;
  los_memory_usage.17 = los_memory_usage.16 + size;
  los_memory_usage = los_memory_usage.17;
  los_num_objects.18 = los_num_objects;
  los_num_objects.19 = los_num_objects.18 + 1;
  los_num_objects = los_num_objects.19;
  if (0 != 0) goto <D.17581>; else goto <D.17582>;
  <D.17581>:
  gc_debug_file.20 = gc_debug_file;
  D.17567 = &obj->data;
  D.17584 = vtable->klass;
  D.17585 = D.17584->name;
  fprintf (gc_debug_file.20, "Allocated large object %p, vtable: %p (%s), size: %zd\n", D.17567, vtable, D.17585, size);
  gc_debug_file.20 = gc_debug_file;
  fflush (gc_debug_file.20);
  <D.17582>:
  D.17566 = &obj->data;
  return D.17566;
}


get_los_section_memory (size_t size)
{
  unsigned int D.17587;
  unsigned int D.17588;
  _Bool D.17589;
  long int D.17590;
  long int D.17591;
  _Bool D.17594;
  long int D.17595;
  long int D.17596;
  struct LOSFreeChunks * * D.17602;
  struct LOSObject * D.17608;
  int D.17609;
  struct LOSFreeChunks * D.17614;
  unsigned char * D.17615;
  unsigned char * D.17618;
  void * D.17619;
  struct LOSSection * los_sections.21;
  int los_num_sections.22;
  int los_num_sections.23;
  struct LOSSection * section;
  struct LOSFreeChunks * free_chunks;
  int num_chunks;
  void retry = <<< error >>>;

  size = size + 4095;
  size = size & 4294963200;
  D.17587 = size >> 12;
  num_chunks = (int) D.17587;
  D.17588 = size + 4294967280;
  D.17589 = D.17588 > 1044464;
  D.17590 = (long int) D.17589;
  D.17591 = __builtin_expect (D.17590, 0);
  if (D.17591 != 0) goto <D.17592>; else goto <D.17593>;
  <D.17592>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 208, "size > 0 && size - sizeof (LOSObject) <= LOS_SECTION_OBJECT_LIMIT");
  <D.17593>:
  D.17594 = num_chunks <= 0;
  D.17595 = (long int) D.17594;
  D.17596 = __builtin_expect (D.17595, 0);
  if (D.17596 != 0) goto <D.17597>; else goto <D.17598>;
  <D.17597>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 209, "num_chunks > 0");
  <D.17598>:
  retry:
  if (num_chunks > 31) goto <D.17599>; else goto <D.17600>;
  <D.17599>:
  free_chunks = get_from_size_list (&los_fast_free_lists[0], size);
  goto <D.17601>;
  <D.17600>:
  {
    int i;

    i = num_chunks;
    goto <D.17353>;
    <D.17352>:
    D.17602 = &los_fast_free_lists[i];
    free_chunks = get_from_size_list (D.17602, size);
    if (free_chunks != 0B) goto <D.17351>; else goto <D.17603>;
    <D.17603>:
    i = i + 1;
    <D.17353>:
    if (i <= 31) goto <D.17352>; else goto <D.17351>;
    <D.17351>:
    if (free_chunks == 0B) goto <D.17604>; else goto <D.17605>;
    <D.17604>:
    free_chunks = get_from_size_list (&los_fast_free_lists[0], size);
    <D.17605>:
  }
  <D.17601>:
  if (free_chunks != 0B) goto <D.17606>; else goto <D.17607>;
  <D.17606>:
  D.17608 = free_chunks;
  return D.17608;
  <D.17607>:
  D.17609 = sgen_memgov_try_alloc_space (1048576, 2);
  if (D.17609 == 0) goto <D.17610>; else goto <D.17611>;
  <D.17610>:
  D.17608 = 0B;
  return D.17608;
  <D.17611>:
  section = sgen_alloc_os_memory_aligned (1048576, 1048576, 3, 0B);
  if (section == 0B) goto <D.17612>; else goto <D.17613>;
  <D.17612>:
  D.17608 = 0B;
  return D.17608;
  <D.17613>:
  free_chunks = section + 4096;
  free_chunks->size = 1044480;
  D.17614 = los_fast_free_lists[0];
  free_chunks->next_size = D.17614;
  los_fast_free_lists[0] = free_chunks;
  section->num_free_chunks = 255;
  D.17615 = section + 12;
  section->free_chunk_map = D.17615;
  if (0 != 0) goto <D.17616>; else goto <D.17617>;
  <D.17616>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 244, "sizeof (LOSSection) + LOS_SECTION_NUM_CHUNKS + 1 <= LOS_CHUNK_SIZE");
  <D.17617>:
  D.17618 = section->free_chunk_map;
  *D.17618 = 0;
  D.17618 = section->free_chunk_map;
  D.17619 = D.17618 + 1;
  memset (D.17619, 1, 255);
  los_sections.21 = los_sections;
  section->next = los_sections.21;
  los_sections = section;
  los_num_sections.22 = los_num_sections;
  los_num_sections.23 = los_num_sections.22 + 1;
  los_num_sections = los_num_sections.23;
  goto retry;
}


get_from_size_list (struct LOSFreeChunks * * list, size_t size)
{
  unsigned int D.17624;
  _Bool D.17625;
  long int D.17626;
  long int D.17627;
  unsigned int D.17630;
  struct LOSFreeChunks * D.17632;
  struct LOSFreeChunks * D.17635;
  struct LOSFreeChunks * D.17636;
  struct LOSFreeChunks * D.17639;
  unsigned int D.17640;
  unsigned int D.17641;
  unsigned int free_chunks.24;
  unsigned int D.17643;
  int free_chunks.25;
  int section.26;
  int D.17646;
  unsigned char * D.17647;
  sizetype i.27;
  unsigned char * D.17649;
  unsigned char D.17650;
  _Bool D.17651;
  long int D.17652;
  long int D.17653;
  int D.17656;
  int D.17657;
  unsigned int D.17658;
  unsigned int D.17659;
  int D.17660;
  _Bool D.17661;
  long int D.17662;
  long int D.17663;
  struct LOSFreeChunks * free_chunks;
  struct LOSSection * section;
  int num_chunks;
  int i;
  int start_index;

  free_chunks = 0B;
  D.17624 = size & 4095;
  D.17625 = D.17624 != 0;
  D.17626 = (long int) D.17625;
  D.17627 = __builtin_expect (D.17626, 0);
  if (D.17627 != 0) goto <D.17628>; else goto <D.17629>;
  <D.17628>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 163, "(size & (LOS_CHUNK_SIZE - 1)) == 0");
  <D.17629>:
  goto <D.17339>;
  <D.17338>:
  free_chunks = *list;
  D.17630 = free_chunks->size;
  if (D.17630 >= size) goto <D.17337>; else goto <D.17631>;
  <D.17631>:
  D.17632 = *list;
  list = &D.17632->next_size;
  <D.17339>:
  D.17632 = *list;
  if (D.17632 != 0B) goto <D.17338>; else goto <D.17337>;
  <D.17337>:
  D.17632 = *list;
  if (D.17632 == 0B) goto <D.17633>; else goto <D.17634>;
  <D.17633>:
  D.17635 = 0B;
  return D.17635;
  <D.17634>:
  D.17636 = free_chunks->next_size;
  *list = D.17636;
  D.17630 = free_chunks->size;
  if (D.17630 > size) goto <D.17637>; else goto <D.17638>;
  <D.17637>:
  D.17639 = free_chunks + size;
  D.17630 = free_chunks->size;
  D.17640 = D.17630 - size;
  add_free_chunk (D.17639, D.17640);
  <D.17638>:
  D.17641 = size >> 12;
  num_chunks = (int) D.17641;
  free_chunks.24 = (unsigned int) free_chunks;
  D.17643 = free_chunks.24 & 4293918720;
  section = (struct LOSSection *) D.17643;
  free_chunks.25 = (int) free_chunks;
  section.26 = (int) section;
  D.17646 = free_chunks.25 - section.26;
  start_index = D.17646 >> 12;
  i = start_index;
  goto <D.17341>;
  <D.17340>:
  D.17647 = section->free_chunk_map;
  i.27 = (sizetype) i;
  D.17649 = D.17647 + i.27;
  D.17650 = *D.17649;
  D.17651 = D.17650 == 0;
  D.17652 = (long int) D.17651;
  D.17653 = __builtin_expect (D.17652, 0);
  if (D.17653 != 0) goto <D.17654>; else goto <D.17655>;
  <D.17654>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 186, "section->free_chunk_map [i]");
  <D.17655>:
  D.17647 = section->free_chunk_map;
  i.27 = (sizetype) i;
  D.17649 = D.17647 + i.27;
  *D.17649 = 0;
  i = i + 1;
  <D.17341>:
  D.17656 = start_index + num_chunks;
  if (D.17656 > i) goto <D.17340>; else goto <D.17342>;
  <D.17342>:
  D.17657 = section->num_free_chunks;
  D.17658 = (unsigned int) D.17657;
  D.17641 = size >> 12;
  D.17659 = D.17658 - D.17641;
  D.17660 = (int) D.17659;
  section->num_free_chunks = D.17660;
  D.17657 = section->num_free_chunks;
  D.17661 = D.17657 < 0;
  D.17662 = (long int) D.17661;
  D.17663 = __builtin_expect (D.17662, 0);
  if (D.17663 != 0) goto <D.17664>; else goto <D.17665>;
  <D.17664>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 191, "section->num_free_chunks >= 0");
  <D.17665>:
  D.17635 = free_chunks;
  return D.17635;
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.17669;
  int D.17674;
  void * D.17676;
  unsigned int D.17677;

  D.17669 = __builtin_constant_p (__len);
  if (D.17669 != 0) goto <D.17670>; else goto <D.17671>;
  <D.17670>:
  if (__len == 0) goto <D.17672>; else goto <D.17673>;
  <D.17672>:
  D.17674 = __builtin_constant_p (__ch);
  if (D.17674 == 0) goto <D.17667>; else goto <D.17675>;
  <D.17675>:
  if (__ch != 0) goto <D.17667>; else goto <D.17668>;
  <D.17667>:
  __warn_memset_zero_len ();
  D.17676 = __dest;
  return D.17676;
  <D.17668>:
  <D.17673>:
  <D.17671>:
  D.17677 = __builtin_object_size (__dest, 0);
  D.17676 = __builtin___memset_chk (__dest, __ch, __len, D.17677);
  return D.17676;
}


sgen_los_sweep ()
{
  int D.17679;
  int los_num_sections.28;
  int los_num_sections.29;
  unsigned char * D.17687;
  sizetype i.30;
  unsigned char * D.17689;
  unsigned char D.17690;
  sizetype j.31;
  unsigned char * D.17695;
  unsigned char D.17696;
  int D.17697;
  sizetype D.17698;
  struct LOSFreeChunks * D.17699;
  int D.17700;
  int D.17701;
  unsigned int D.17702;
  _Bool D.17703;
  long int D.17704;
  long int D.17705;
  struct LOSSection * section;
  struct LOSSection * prev;
  int i;
  int num_sections;

  num_sections = 0;
  i = 0;
  goto <D.17385>;
  <D.17384>:
  los_fast_free_lists[i] = 0B;
  i = i + 1;
  <D.17385>:
  if (i <= 31) goto <D.17384>; else goto <D.17386>;
  <D.17386>:
  prev = 0B;
  section = los_sections;
  goto <D.17388>;
  <D.17396>:
  D.17679 = section->num_free_chunks;
  if (D.17679 == 255) goto <D.17680>; else goto <D.17681>;
  <D.17680>:
  {
    struct LOSSection * next;

    next = section->next;
    if (prev != 0B) goto <D.17682>; else goto <D.17683>;
    <D.17682>:
    prev->next = next;
    goto <D.17684>;
    <D.17683>:
    los_sections = next;
    <D.17684>:
    sgen_free_os_memory (section, 1048576, 1);
    sgen_memgov_release_space (1048576, 2);
    section = next;
    los_num_sections.28 = los_num_sections;
    los_num_sections.29 = los_num_sections.28 + -1;
    los_num_sections = los_num_sections.29;
    // predicted unlikely by continue predictor.
    goto <D.17388>;
  }
  <D.17681>:
  i = 0;
  goto <D.17394>;
  <D.17393>:
  D.17687 = section->free_chunk_map;
  i.30 = (sizetype) i;
  D.17689 = D.17687 + i.30;
  D.17690 = *D.17689;
  if (D.17690 != 0) goto <D.17691>; else goto <D.17692>;
  <D.17691>:
  {
    int j;

    j = i + 1;
    goto <D.17391>;
    <D.17390>:
    j = j + 1;
    <D.17391>:
    if (j <= 255) goto <D.17693>; else goto <D.17392>;
    <D.17693>:
    D.17687 = section->free_chunk_map;
    j.31 = (sizetype) j;
    D.17695 = D.17687 + j.31;
    D.17696 = *D.17695;
    if (D.17696 != 0) goto <D.17390>; else goto <D.17392>;
    <D.17392>:
    D.17697 = i << 12;
    D.17698 = (sizetype) D.17697;
    D.17699 = section + D.17698;
    D.17700 = j - i;
    D.17701 = D.17700 << 12;
    D.17702 = (unsigned int) D.17701;
    add_free_chunk (D.17699, D.17702);
    i = j + -1;
  }
  <D.17692>:
  i = i + 1;
  <D.17394>:
  if (i <= 255) goto <D.17393>; else goto <D.17395>;
  <D.17395>:
  prev = section;
  section = section->next;
  num_sections = num_sections + 1;
  <D.17388>:
  if (section != 0B) goto <D.17396>; else goto <D.17397>;
  <D.17397>:
  los_num_sections.28 = los_num_sections;
  D.17703 = los_num_sections.28 != num_sections;
  D.17704 = (long int) D.17703;
  D.17705 = __builtin_expect (D.17704, 0);
  if (D.17705 != 0) goto <D.17706>; else goto <D.17707>;
  <D.17706>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 447, "los_num_sections == num_sections");
  <D.17707>:
}


sgen_ptr_is_in_los (char * ptr, char * * start)
{
  unsigned int D.17708;
  char[0:] * D.17709;
  gboolean D.17714;
  struct LOSObject * obj;

  *start = 0B;
  obj = los_object_list;
  goto <D.17405>;
  <D.17404>:
  {
    char * end;

    D.17708 = obj->size;
    end = &obj->data[D.17708];
    D.17709 = &obj->data;
    if (D.17709 <= ptr) goto <D.17710>; else goto <D.17711>;
    <D.17710>:
    if (ptr < end) goto <D.17712>; else goto <D.17713>;
    <D.17712>:
    D.17709 = &obj->data;
    *start = D.17709;
    D.17714 = 1;
    return D.17714;
    <D.17713>:
    <D.17711>:
  }
  obj = obj->next;
  <D.17405>:
  if (obj != 0B) goto <D.17404>; else goto <D.17406>;
  <D.17406>:
  D.17714 = 0;
  return D.17714;
}


sgen_los_iterate_objects (void (*IterateObjectCallbackFunc) (char *, size_t, void *) cb, void * user_data)
{
  char[0:] * D.17716;
  unsigned int D.17717;
  struct LOSObject * obj;

  obj = los_object_list;
  goto <D.17413>;
  <D.17412>:
  D.17716 = &obj->data;
  D.17717 = obj->size;
  cb (D.17716, D.17717, user_data);
  obj = obj->next;
  <D.17413>:
  if (obj != 0B) goto <D.17412>; else goto <D.17414>;
  <D.17414>:
}


sgen_los_is_valid_object (char * object)
{
  char[0:] * D.17718;
  gboolean D.17721;
  struct LOSObject * obj;

  obj = los_object_list;
  goto <D.17420>;
  <D.17419>:
  D.17718 = &obj->data;
  if (D.17718 == object) goto <D.17719>; else goto <D.17720>;
  <D.17719>:
  D.17721 = 1;
  return D.17721;
  <D.17720>:
  obj = obj->next;
  <D.17420>:
  if (obj != 0B) goto <D.17419>; else goto <D.17421>;
  <D.17421>:
  D.17721 = 0;
  return D.17721;
}


mono_sgen_los_describe_pointer (char * ptr)
{
  char[0:] * D.17725;
  unsigned int D.17727;
  char * D.17728;
  unsigned int D.17732;
  unsigned int D.17733;
  int gc_debug_level.32;
  _Bool D.17737;
  long int D.17738;
  long int D.17739;
  struct FILE * gc_debug_file.33;
  int size.34;
  _Bool D.17744;
  int D.17745;
  int ptr.35;
  int D.17750;
  int D.17751;
  gboolean D.17752;
  struct LOSObject * obj;

  obj = los_object_list;
  goto <D.17432>;
  <D.17431>:
  {
    struct MonoVTable * vtable;
    const char * los_kind;
    mword size;
    gboolean pinned;

    D.17725 = &obj->data;
    if (D.17725 > ptr) goto <D.17723>; else goto <D.17726>;
    <D.17726>:
    D.17727 = obj->size;
    D.17728 = &obj->data[D.17727];
    if (D.17728 <= ptr) goto <D.17723>; else goto <D.17724>;
    <D.17723>:
    // predicted unlikely by continue predictor.
    goto <D.17430>;
    <D.17724>:
    size = sgen_los_object_size (obj);
    D.17725 = &obj->data;
    pinned = sgen_los_object_is_pinned (D.17725);
    if (size > 1044464) goto <D.17729>; else goto <D.17730>;
    <D.17729>:
    los_kind = "huge-los-ptr";
    goto <D.17731>;
    <D.17730>:
    los_kind = "los-ptr";
    <D.17731>:
    D.17725 = &obj->data;
    D.17732 = MEM[(mword *)D.17725];
    D.17733 = D.17732 & 4294967292;
    vtable = (struct MonoVTable *) D.17733;
    D.17725 = &obj->data;
    if (D.17725 == ptr) goto <D.17734>; else goto <D.17735>;
    <D.17734>:
    gc_debug_level.32 = gc_debug_level;
    D.17737 = gc_debug_level.32 >= 0;
    D.17738 = (long int) D.17737;
    D.17739 = __builtin_expect (D.17738, 0);
    if (D.17739 != 0) goto <D.17740>; else goto <D.17741>;
    <D.17740>:
    gc_debug_file.33 = gc_debug_file;
    size.34 = (int) size;
    D.17744 = pinned != 0;
    D.17745 = (int) D.17744;
    fprintf (gc_debug_file.33, "%s (size %d pin %d)\n\n", los_kind, size.34, D.17745);
    gc_debug_file.33 = gc_debug_file;
    fflush (gc_debug_file.33);
    <D.17741>:
    goto <D.17746>;
    <D.17735>:
    gc_debug_level.32 = gc_debug_level;
    D.17737 = gc_debug_level.32 >= 0;
    D.17738 = (long int) D.17737;
    D.17739 = __builtin_expect (D.17738, 0);
    if (D.17739 != 0) goto <D.17747>; else goto <D.17748>;
    <D.17747>:
    gc_debug_file.33 = gc_debug_file;
    ptr.35 = (int) ptr;
    D.17725 = &obj->data;
    D.17750 = (int) D.17725;
    D.17751 = ptr.35 - D.17750;
    size.34 = (int) size;
    D.17744 = pinned != 0;
    D.17745 = (int) D.17744;
    fprintf (gc_debug_file.33, "%s (interior-ptr offset %td size %d pin %d)\n", los_kind, D.17751, size.34, D.17745);
    gc_debug_file.33 = gc_debug_file;
    fflush (gc_debug_file.33);
    <D.17748>:
    <D.17746>:
    D.17752 = 1;
    return D.17752;
  }
  <D.17430>:
  obj = obj->next;
  <D.17432>:
  if (obj != 0B) goto <D.17431>; else goto <D.17433>;
  <D.17433>:
  D.17752 = 0;
  return D.17752;
}


fprintf (struct FILE * restrict __stream, const char * restrict __fmt)
{
  int D.17754;

  D.17754 = __fprintf_chk (__stream, 1, __fmt, __builtin_va_arg_pack ());
  return D.17754;
}


sgen_los_iterate_live_block_ranges (void (*sgen_cardtable_block_callback) (mword, mword) callback)
{
  char[0:] * D.17756;
  unsigned int D.17757;
  unsigned int D.17758;
  void * D.17759;
  unsigned int D.17760;
  int D.17761;
  unsigned int D.17764;
  unsigned int D.17765;
  struct LOSObject * obj;

  obj = los_object_list;
  goto <D.17440>;
  <D.17439>:
  {
    struct MonoVTable * vt;

    D.17756 = &obj->data;
    D.17757 = MEM[(mword *)D.17756];
    D.17758 = D.17757 & 4294967292;
    vt = (struct MonoVTable *) D.17758;
    D.17759 = vt->gc_descr;
    D.17760 = (unsigned int) D.17759;
    D.17761 = sgen_gc_descr_has_references (D.17760);
    if (D.17761 != 0) goto <D.17762>; else goto <D.17763>;
    <D.17762>:
    D.17756 = &obj->data;
    D.17764 = (unsigned int) D.17756;
    D.17765 = obj->size;
    callback (D.17764, D.17765);
    <D.17763>:
  }
  obj = obj->next;
  <D.17440>:
  if (obj != 0B) goto <D.17439>; else goto <D.17441>;
  <D.17441>:
}


sgen_gc_descr_has_references (mword desc)
{
  unsigned int D.17766;
  gboolean D.17769;
  unsigned int D.17770;
  unsigned int D.17773;

  D.17766 = desc & 4294901767;
  if (D.17766 == 1) goto <D.17767>; else goto <D.17768>;
  <D.17767>:
  D.17769 = 0;
  return D.17769;
  <D.17768>:
  D.17770 = desc & 49159;
  if (D.17770 == 4) goto <D.17771>; else goto <D.17772>;
  <D.17771>:
  D.17769 = 0;
  return D.17769;
  <D.17772>:
  D.17773 = desc & 7;
  if (D.17773 == 7) goto <D.17774>; else goto <D.17775>;
  <D.17774>:
  D.17769 = 0;
  return D.17769;
  <D.17775>:
  D.17769 = 1;
  return D.17769;
}


sgen_los_scan_card_table (gboolean mod_union, struct SgenGrayQueue * queue)
{
  _Bool D.17779;
  long int D.17780;
  long int D.17781;
  char[0:] * D.17784;
  unsigned int D.17785;
  struct LOSObject * obj;

  obj = los_object_list;
  goto <D.17449>;
  <D.17448>:
  {
    guint8 * cards;

    cards = 0B;
    if (mod_union != 0) goto <D.17777>; else goto <D.17778>;
    <D.17777>:
    cards = obj->cardtable_mod_union;
    D.17779 = cards == 0B;
    D.17780 = (long int) D.17779;
    D.17781 = __builtin_expect (D.17780, 0);
    if (D.17781 != 0) goto <D.17782>; else goto <D.17783>;
    <D.17782>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 544, "cards");
    <D.17783>:
    <D.17778>:
    D.17784 = &obj->data;
    D.17785 = obj->size;
    sgen_cardtable_scan_object (D.17784, D.17785, cards, mod_union, queue);
  }
  obj = obj->next;
  <D.17449>:
  if (obj != 0B) goto <D.17448>; else goto <D.17450>;
  <D.17450>:
}


sgen_los_update_cardtable_mod_union ()
{
  guint8 * D.17786;
  char[0:] * D.17787;
  unsigned int D.17788;
  guint8 * D.17789;
  struct LOSObject * obj;

  obj = los_object_list;
  goto <D.17456>;
  <D.17455>:
  D.17786 = obj->cardtable_mod_union;
  D.17787 = &obj->data;
  D.17788 = obj->size;
  D.17789 = sgen_card_table_update_mod_union (D.17786, D.17787, D.17788, 0B);
  obj->cardtable_mod_union = D.17789;
  obj = obj->next;
  <D.17456>:
  if (obj != 0B) goto <D.17455>; else goto <D.17457>;
  <D.17457>:
}


sgen_los_object_size (struct LOSObject * obj)
{
  mword D.17790;
  unsigned int D.17791;

  D.17791 = obj->size;
  D.17790 = D.17791 & 4294967294;
  return D.17790;
}


sgen_los_header_for_object (char * data)
{
  struct LOSObject * D.17793;

  D.17793 = data + 4294967280;
  return D.17793;
}


sgen_los_pin_object (char * data)
{
  unsigned int D.17795;
  unsigned int D.17796;
  struct LOSObject * obj;

  obj = sgen_los_header_for_object (data);
  D.17795 = obj->size;
  D.17796 = D.17795 | 1;
  obj->size = D.17796;
}


sgen_los_unpin_object (char * data)
{
  unsigned int D.17797;
  struct LOSObject * obj;

  obj = sgen_los_header_for_object (data);
  D.17797 = sgen_los_object_size (obj);
  obj->size = D.17797;
}


sgen_los_object_is_pinned (char * data)
{
  gboolean D.17798;
  unsigned int D.17799;
  int D.17800;
  struct LOSObject * obj;

  obj = sgen_los_header_for_object (data);
  D.17799 = obj->size;
  D.17800 = (int) D.17799;
  D.17798 = D.17800 & 1;
  return D.17798;
}


