sgen_los_free_object (struct LOSObject * obj)
{
  unsigned int D.17499;
  char[0:] * D.17500;
  struct FILE * gc_debug_file.0;
  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.17513;
  int D.17514;
  unsigned int D.17515;
  unsigned int D.17517;
  size_t size;

  size = obj->size;
  if (0 != 0) goto <D.17497>; else goto <D.17498>;
  <D.17497>:
  D.17499 = obj->size;
  D.17500 = &obj->data;
  gc_debug_file.0 = gc_debug_file;
  fprintf (gc_debug_file.0, "Freed large object %p, size %lu\n", D.17500, D.17499);
  gc_debug_file.0 = gc_debug_file;
  fflush (gc_debug_file.0);
  <D.17498>:
  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.17506>; else goto <D.17507>;
  <D.17506>:
  pagesize.5 = pagesize;
  if (pagesize.5 == 0) goto <D.17509>; else goto <D.17510>;
  <D.17509>:
  pagesize.6 = mono_pagesize ();
  pagesize = pagesize.6;
  <D.17510>:
  size = size + 16;
  pagesize.5 = pagesize;
  pagesize.7 = (unsigned int) pagesize.5;
  D.17513 = pagesize.7 + size;
  size = D.17513 + 4294967295;
  pagesize.5 = pagesize;
  D.17514 = -pagesize.5;
  D.17515 = (unsigned int) D.17514;
  size = D.17515 & size;
  sgen_free_os_memory (obj, size, 1);
  sgen_memgov_release_space (size, 2);
  goto <D.17516>;
  <D.17507>:
  D.17517 = size + 16;
  free_los_section_memory (obj, D.17517);
  <D.17516>:
}


free_los_section_memory (struct LOSObject * obj, size_t size)
{
  unsigned int obj.8;
  unsigned int D.17519;
  unsigned int D.17520;
  unsigned int D.17521;
  _Bool D.17522;
  long int D.17523;
  long int D.17524;
  _Bool D.17527;
  long int D.17528;
  long int D.17529;
  int D.17532;
  int D.17533;
  _Bool D.17534;
  long int D.17535;
  long int D.17536;
  int obj.9;
  int section.10;
  int D.17541;
  unsigned char * D.17542;
  sizetype i.11;
  unsigned char * D.17544;
  unsigned char D.17545;
  _Bool D.17546;
  long int D.17547;
  long int D.17548;
  int D.17551;
  struct LOSSection * section;
  int num_chunks;
  int i;
  int start_index;

  obj.8 = (unsigned int) obj;
  D.17519 = obj.8 & 4293918720;
  section = (struct LOSSection *) D.17519;
  size = size + 4095;
  size = size & 4294963200;
  D.17520 = size >> 12;
  num_chunks = (int) D.17520;
  D.17521 = size + 4294967280;
  D.17522 = D.17521 > 1044464;
  D.17523 = (long int) D.17522;
  D.17524 = __builtin_expect (D.17523, 0);
  if (D.17524 != 0) goto <D.17525>; else goto <D.17526>;
  <D.17525>:
  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.17526>:
  D.17527 = num_chunks <= 0;
  D.17528 = (long int) D.17527;
  D.17529 = __builtin_expect (D.17528, 0);
  if (D.17529 != 0) goto <D.17530>; else goto <D.17531>;
  <D.17530>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 268, "num_chunks > 0");
  <D.17531>:
  D.17532 = section->num_free_chunks;
  D.17533 = D.17532 + num_chunks;
  section->num_free_chunks = D.17533;
  D.17532 = section->num_free_chunks;
  D.17534 = D.17532 > 255;
  D.17535 = (long int) D.17534;
  D.17536 = __builtin_expect (D.17535, 0);
  if (D.17536 != 0) goto <D.17537>; else goto <D.17538>;
  <D.17537>:
  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.17538>:
  obj.9 = (int) obj;
  section.10 = (int) section;
  D.17541 = obj.9 - section.10;
  start_index = D.17541 >> 12;
  i = start_index;
  goto <D.17383>;
  <D.17382>:
  D.17542 = section->free_chunk_map;
  i.11 = (sizetype) i;
  D.17544 = D.17542 + i.11;
  D.17545 = *D.17544;
  D.17546 = D.17545 != 0;
  D.17547 = (long int) D.17546;
  D.17548 = __builtin_expect (D.17547, 0);
  if (D.17548 != 0) goto <D.17549>; else goto <D.17550>;
  <D.17549>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 281, "!section->free_chunk_map [i]");
  <D.17550>:
  D.17542 = section->free_chunk_map;
  i.11 = (sizetype) i;
  D.17544 = D.17542 + i.11;
  *D.17544 = 1;
  i = i + 1;
  <D.17383>:
  D.17551 = start_index + num_chunks;
  if (D.17551 > i) goto <D.17382>; else goto <D.17384>;
  <D.17384>:
  add_free_chunk (obj, size);
}


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

  D.17552 = size >> 12;
  num_chunks = (int) D.17552;
  free_chunks->size = size;
  if (num_chunks > 31) goto <D.17553>; else goto <D.17554>;
  <D.17553>:
  num_chunks = 0;
  <D.17554>:
  D.17555 = los_fast_free_lists[num_chunks];
  free_chunks->next_size = D.17555;
  los_fast_free_lists[num_chunks] = free_chunks;
}


sgen_los_alloc_large_inner (struct MonoVTable * vtable, size_t size)
{
  _Bool D.17556;
  long int D.17557;
  long int D.17558;
  unsigned int D.17561;
  _Bool D.17562;
  long int D.17563;
  long int D.17564;
  int pagesize.12;
  int pagesize.13;
  unsigned int pagesize.14;
  unsigned int D.17574;
  int D.17575;
  unsigned int D.17576;
  int D.17577;
  unsigned int D.17581;
  void * D.17586;
  char[0:] * D.17587;
  unsigned int D.17588;
  unsigned int D.17589;
  _Bool D.17590;
  long int D.17591;
  long int D.17592;
  unsigned int D.17595;
  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 MonoClass * D.17603;
  const char * D.17604;
  struct FILE * gc_debug_file.20;
  struct LOSObject * obj;
  void * * vtslot;

  obj = 0B;
  D.17556 = size <= 8000;
  D.17557 = (long int) D.17556;
  D.17558 = __builtin_expect (D.17557, 0);
  if (D.17558 != 0) goto <D.17559>; else goto <D.17560>;
  <D.17559>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 334, "size > SGEN_MAX_SMALL_OBJ_SIZE");
  <D.17560>:
  D.17561 = size & 1;
  D.17562 = D.17561 != 0;
  D.17563 = (long int) D.17562;
  D.17564 = __builtin_expect (D.17563, 0);
  if (D.17564 != 0) goto <D.17565>; else goto <D.17566>;
  <D.17565>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 335, "(size & 1) == 0");
  <D.17566>:
  sgen_ensure_free_space (size);
  if (size > 1044464) goto <D.17567>; else goto <D.17568>;
  <D.17567>:
  {
    size_t alloc_size;

    alloc_size = size;
    pagesize.12 = pagesize;
    if (pagesize.12 == 0) goto <D.17570>; else goto <D.17571>;
    <D.17570>:
    pagesize.13 = mono_pagesize ();
    pagesize = pagesize.13;
    <D.17571>:
    alloc_size = alloc_size + 16;
    pagesize.12 = pagesize;
    pagesize.14 = (unsigned int) pagesize.12;
    D.17574 = pagesize.14 + alloc_size;
    alloc_size = D.17574 + 4294967295;
    pagesize.12 = pagesize;
    D.17575 = -pagesize.12;
    D.17576 = (unsigned int) D.17575;
    alloc_size = D.17576 & alloc_size;
    D.17577 = sgen_memgov_try_alloc_space (alloc_size, 2);
    if (D.17577 != 0) goto <D.17578>; else goto <D.17579>;
    <D.17578>:
    obj = sgen_alloc_os_memory (alloc_size, 3, 0B);
    <D.17579>:
  }
  goto <D.17580>;
  <D.17568>:
  D.17581 = size + 16;
  obj = get_los_section_memory (D.17581);
  if (obj != 0B) goto <D.17582>; else goto <D.17583>;
  <D.17582>:
  D.17581 = size + 16;
  memset (obj, 0, D.17581);
  <D.17583>:
  <D.17580>:
  if (obj == 0B) goto <D.17584>; else goto <D.17585>;
  <D.17584>:
  D.17586 = 0B;
  return D.17586;
  <D.17585>:
  D.17587 = &obj->data;
  D.17588 = (unsigned int) D.17587;
  D.17589 = D.17588 & 7;
  D.17590 = D.17589 != 0;
  D.17591 = (long int) D.17590;
  D.17592 = __builtin_expect (D.17591, 0);
  if (D.17592 != 0) goto <D.17593>; else goto <D.17594>;
  <D.17593>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 371, "!((mword)obj->data & (SGEN_ALLOC_ALIGN - 1))");
  <D.17594>:
  obj->size = size;
  vtslot = &obj->data;
  *vtslot = vtable;
  D.17587 = &obj->data;
  D.17588 = (unsigned int) D.17587;
  D.17595 = D.17588 + size;
  D.17587 = &obj->data;
  D.17588 = (unsigned int) D.17587;
  sgen_update_heap_boundaries (D.17588, D.17595);
  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.17601>; else goto <D.17602>;
  <D.17601>:
  D.17603 = vtable->klass;
  D.17604 = D.17603->name;
  D.17587 = &obj->data;
  gc_debug_file.20 = gc_debug_file;
  fprintf (gc_debug_file.20, "Allocated large object %p, vtable: %p (%s), size: %zd\n", D.17587, vtable, D.17604, size);
  gc_debug_file.20 = gc_debug_file;
  fflush (gc_debug_file.20);
  <D.17602>:
  D.17586 = &obj->data;
  return D.17586;
}


get_los_section_memory (size_t size)
{
  unsigned int D.17607;
  unsigned int D.17608;
  _Bool D.17609;
  long int D.17610;
  long int D.17611;
  _Bool D.17614;
  long int D.17615;
  long int D.17616;
  struct LOSFreeChunks * * D.17622;
  struct LOSObject * D.17628;
  int D.17629;
  struct LOSFreeChunks * D.17634;
  unsigned char * D.17635;
  unsigned char * D.17638;
  void * D.17639;
  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.17607 = size >> 12;
  num_chunks = (int) D.17607;
  D.17608 = size + 4294967280;
  D.17609 = D.17608 > 1044464;
  D.17610 = (long int) D.17609;
  D.17611 = __builtin_expect (D.17610, 0);
  if (D.17611 != 0) goto <D.17612>; else goto <D.17613>;
  <D.17612>:
  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.17613>:
  D.17614 = num_chunks <= 0;
  D.17615 = (long int) D.17614;
  D.17616 = __builtin_expect (D.17615, 0);
  if (D.17616 != 0) goto <D.17617>; else goto <D.17618>;
  <D.17617>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 209, "num_chunks > 0");
  <D.17618>:
  retry:
  if (num_chunks > 31) goto <D.17619>; else goto <D.17620>;
  <D.17619>:
  free_chunks = get_from_size_list (&los_fast_free_lists[0], size);
  goto <D.17621>;
  <D.17620>:
  {
    int i;

    i = num_chunks;
    goto <D.17373>;
    <D.17372>:
    D.17622 = &los_fast_free_lists[i];
    free_chunks = get_from_size_list (D.17622, size);
    if (free_chunks != 0B) goto <D.17371>; else goto <D.17623>;
    <D.17623>:
    i = i + 1;
    <D.17373>:
    if (i <= 31) goto <D.17372>; else goto <D.17371>;
    <D.17371>:
    if (free_chunks == 0B) goto <D.17624>; else goto <D.17625>;
    <D.17624>:
    free_chunks = get_from_size_list (&los_fast_free_lists[0], size);
    <D.17625>:
  }
  <D.17621>:
  if (free_chunks != 0B) goto <D.17626>; else goto <D.17627>;
  <D.17626>:
  D.17628 = free_chunks;
  return D.17628;
  <D.17627>:
  D.17629 = sgen_memgov_try_alloc_space (1048576, 2);
  if (D.17629 == 0) goto <D.17630>; else goto <D.17631>;
  <D.17630>:
  D.17628 = 0B;
  return D.17628;
  <D.17631>:
  section = sgen_alloc_os_memory_aligned (1048576, 1048576, 3, 0B);
  if (section == 0B) goto <D.17632>; else goto <D.17633>;
  <D.17632>:
  D.17628 = 0B;
  return D.17628;
  <D.17633>:
  free_chunks = section + 4096;
  free_chunks->size = 1044480;
  D.17634 = los_fast_free_lists[0];
  free_chunks->next_size = D.17634;
  los_fast_free_lists[0] = free_chunks;
  section->num_free_chunks = 255;
  D.17635 = section + 12;
  section->free_chunk_map = D.17635;
  if (0 != 0) goto <D.17636>; else goto <D.17637>;
  <D.17636>:
  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.17637>:
  D.17638 = section->free_chunk_map;
  *D.17638 = 0;
  D.17638 = section->free_chunk_map;
  D.17639 = D.17638 + 1;
  memset (D.17639, 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.17644;
  _Bool D.17645;
  long int D.17646;
  long int D.17647;
  unsigned int D.17650;
  struct LOSFreeChunks * D.17652;
  struct LOSFreeChunks * D.17655;
  struct LOSFreeChunks * D.17656;
  unsigned int D.17659;
  struct LOSFreeChunks * D.17660;
  unsigned int D.17661;
  unsigned int free_chunks.24;
  unsigned int D.17663;
  int free_chunks.25;
  int section.26;
  int D.17666;
  unsigned char * D.17667;
  sizetype i.27;
  unsigned char * D.17669;
  unsigned char D.17670;
  _Bool D.17671;
  long int D.17672;
  long int D.17673;
  int D.17676;
  int D.17677;
  unsigned int D.17678;
  unsigned int D.17679;
  int D.17680;
  _Bool D.17681;
  long int D.17682;
  long int D.17683;
  struct LOSFreeChunks * free_chunks;
  struct LOSSection * section;
  int num_chunks;
  int i;
  int start_index;

  free_chunks = 0B;
  D.17644 = size & 4095;
  D.17645 = D.17644 != 0;
  D.17646 = (long int) D.17645;
  D.17647 = __builtin_expect (D.17646, 0);
  if (D.17647 != 0) goto <D.17648>; else goto <D.17649>;
  <D.17648>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 163, "(size & (LOS_CHUNK_SIZE - 1)) == 0");
  <D.17649>:
  goto <D.17359>;
  <D.17358>:
  free_chunks = *list;
  D.17650 = free_chunks->size;
  if (D.17650 >= size) goto <D.17357>; else goto <D.17651>;
  <D.17651>:
  D.17652 = *list;
  list = &D.17652->next_size;
  <D.17359>:
  D.17652 = *list;
  if (D.17652 != 0B) goto <D.17358>; else goto <D.17357>;
  <D.17357>:
  D.17652 = *list;
  if (D.17652 == 0B) goto <D.17653>; else goto <D.17654>;
  <D.17653>:
  D.17655 = 0B;
  return D.17655;
  <D.17654>:
  D.17656 = free_chunks->next_size;
  *list = D.17656;
  D.17650 = free_chunks->size;
  if (D.17650 > size) goto <D.17657>; else goto <D.17658>;
  <D.17657>:
  D.17650 = free_chunks->size;
  D.17659 = D.17650 - size;
  D.17660 = free_chunks + size;
  add_free_chunk (D.17660, D.17659);
  <D.17658>:
  D.17661 = size >> 12;
  num_chunks = (int) D.17661;
  free_chunks.24 = (unsigned int) free_chunks;
  D.17663 = free_chunks.24 & 4293918720;
  section = (struct LOSSection *) D.17663;
  free_chunks.25 = (int) free_chunks;
  section.26 = (int) section;
  D.17666 = free_chunks.25 - section.26;
  start_index = D.17666 >> 12;
  i = start_index;
  goto <D.17361>;
  <D.17360>:
  D.17667 = section->free_chunk_map;
  i.27 = (sizetype) i;
  D.17669 = D.17667 + i.27;
  D.17670 = *D.17669;
  D.17671 = D.17670 == 0;
  D.17672 = (long int) D.17671;
  D.17673 = __builtin_expect (D.17672, 0);
  if (D.17673 != 0) goto <D.17674>; else goto <D.17675>;
  <D.17674>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 186, "section->free_chunk_map [i]");
  <D.17675>:
  D.17667 = section->free_chunk_map;
  i.27 = (sizetype) i;
  D.17669 = D.17667 + i.27;
  *D.17669 = 0;
  i = i + 1;
  <D.17361>:
  D.17676 = start_index + num_chunks;
  if (D.17676 > i) goto <D.17360>; else goto <D.17362>;
  <D.17362>:
  D.17677 = section->num_free_chunks;
  D.17678 = (unsigned int) D.17677;
  D.17661 = size >> 12;
  D.17679 = D.17678 - D.17661;
  D.17680 = (int) D.17679;
  section->num_free_chunks = D.17680;
  D.17677 = section->num_free_chunks;
  D.17681 = D.17677 < 0;
  D.17682 = (long int) D.17681;
  D.17683 = __builtin_expect (D.17682, 0);
  if (D.17683 != 0) goto <D.17684>; else goto <D.17685>;
  <D.17684>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 191, "section->num_free_chunks >= 0");
  <D.17685>:
  D.17655 = free_chunks;
  return D.17655;
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.17689;
  int D.17694;
  void * D.17696;
  unsigned int D.17697;

  D.17689 = __builtin_constant_p (__len);
  if (D.17689 != 0) goto <D.17690>; else goto <D.17691>;
  <D.17690>:
  if (__len == 0) goto <D.17692>; else goto <D.17693>;
  <D.17692>:
  D.17694 = __builtin_constant_p (__ch);
  if (D.17694 == 0) goto <D.17687>; else goto <D.17695>;
  <D.17695>:
  if (__ch != 0) goto <D.17687>; else goto <D.17688>;
  <D.17687>:
  __warn_memset_zero_len ();
  D.17696 = __dest;
  return D.17696;
  <D.17688>:
  <D.17693>:
  <D.17691>:
  D.17697 = __builtin_object_size (__dest, 0);
  D.17696 = __builtin___memset_chk (__dest, __ch, __len, D.17697);
  return D.17696;
}


sgen_los_sweep ()
{
  int D.17699;
  int los_num_sections.28;
  int los_num_sections.29;
  unsigned char * D.17707;
  sizetype i.30;
  unsigned char * D.17709;
  unsigned char D.17710;
  sizetype j.31;
  unsigned char * D.17715;
  unsigned char D.17716;
  int D.17717;
  int D.17718;
  unsigned int D.17719;
  int D.17720;
  sizetype D.17721;
  struct LOSFreeChunks * D.17722;
  _Bool D.17723;
  long int D.17724;
  long int D.17725;
  struct LOSSection * section;
  struct LOSSection * prev;
  int i;
  int num_sections;

  num_sections = 0;
  i = 0;
  goto <D.17405>;
  <D.17404>:
  los_fast_free_lists[i] = 0B;
  i = i + 1;
  <D.17405>:
  if (i <= 31) goto <D.17404>; else goto <D.17406>;
  <D.17406>:
  prev = 0B;
  section = los_sections;
  goto <D.17408>;
  <D.17416>:
  D.17699 = section->num_free_chunks;
  if (D.17699 == 255) goto <D.17700>; else goto <D.17701>;
  <D.17700>:
  {
    struct LOSSection * next;

    next = section->next;
    if (prev != 0B) goto <D.17702>; else goto <D.17703>;
    <D.17702>:
    prev->next = next;
    goto <D.17704>;
    <D.17703>:
    los_sections = next;
    <D.17704>:
    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.17408>;
  }
  <D.17701>:
  i = 0;
  goto <D.17414>;
  <D.17413>:
  D.17707 = section->free_chunk_map;
  i.30 = (sizetype) i;
  D.17709 = D.17707 + i.30;
  D.17710 = *D.17709;
  if (D.17710 != 0) goto <D.17711>; else goto <D.17712>;
  <D.17711>:
  {
    int j;

    j = i + 1;
    goto <D.17411>;
    <D.17410>:
    j = j + 1;
    <D.17411>:
    if (j <= 255) goto <D.17713>; else goto <D.17412>;
    <D.17713>:
    D.17707 = section->free_chunk_map;
    j.31 = (sizetype) j;
    D.17715 = D.17707 + j.31;
    D.17716 = *D.17715;
    if (D.17716 != 0) goto <D.17410>; else goto <D.17412>;
    <D.17412>:
    D.17717 = j - i;
    D.17718 = D.17717 << 12;
    D.17719 = (unsigned int) D.17718;
    D.17720 = i << 12;
    D.17721 = (sizetype) D.17720;
    D.17722 = section + D.17721;
    add_free_chunk (D.17722, D.17719);
    i = j + -1;
  }
  <D.17712>:
  i = i + 1;
  <D.17414>:
  if (i <= 255) goto <D.17413>; else goto <D.17415>;
  <D.17415>:
  prev = section;
  section = section->next;
  num_sections = num_sections + 1;
  <D.17408>:
  if (section != 0B) goto <D.17416>; else goto <D.17417>;
  <D.17417>:
  los_num_sections.28 = los_num_sections;
  D.17723 = los_num_sections.28 != num_sections;
  D.17724 = (long int) D.17723;
  D.17725 = __builtin_expect (D.17724, 0);
  if (D.17725 != 0) goto <D.17726>; else goto <D.17727>;
  <D.17726>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 447, "los_num_sections == num_sections");
  <D.17727>:
}


sgen_ptr_is_in_los (char * ptr, char * * start)
{
  unsigned int D.17728;
  char[0:] * D.17729;
  gboolean D.17734;
  struct LOSObject * obj;

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

    D.17728 = obj->size;
    end = &obj->data[D.17728];
    D.17729 = &obj->data;
    if (D.17729 <= ptr) goto <D.17730>; else goto <D.17731>;
    <D.17730>:
    if (ptr < end) goto <D.17732>; else goto <D.17733>;
    <D.17732>:
    D.17729 = &obj->data;
    *start = D.17729;
    D.17734 = 1;
    return D.17734;
    <D.17733>:
    <D.17731>:
  }
  obj = obj->next;
  <D.17425>:
  if (obj != 0B) goto <D.17424>; else goto <D.17426>;
  <D.17426>:
  D.17734 = 0;
  return D.17734;
}


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

  obj = los_object_list;
  goto <D.17433>;
  <D.17432>:
  D.17736 = obj->size;
  D.17737 = &obj->data;
  cb (D.17737, D.17736, user_data);
  obj = obj->next;
  <D.17433>:
  if (obj != 0B) goto <D.17432>; else goto <D.17434>;
  <D.17434>:
}


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

  obj = los_object_list;
  goto <D.17440>;
  <D.17439>:
  D.17738 = &obj->data;
  if (D.17738 == object) goto <D.17739>; else goto <D.17740>;
  <D.17739>:
  D.17741 = 1;
  return D.17741;
  <D.17740>:
  obj = obj->next;
  <D.17440>:
  if (obj != 0B) goto <D.17439>; else goto <D.17441>;
  <D.17441>:
  D.17741 = 0;
  return D.17741;
}


mono_sgen_los_describe_pointer (char * ptr)
{
  char[0:] * D.17745;
  unsigned int D.17747;
  char * D.17748;
  unsigned int D.17752;
  unsigned int D.17753;
  int gc_debug_level.32;
  _Bool D.17757;
  long int D.17758;
  long int D.17759;
  _Bool D.17762;
  int D.17763;
  int size.33;
  struct FILE * gc_debug_file.34;
  int ptr.35;
  int D.17770;
  int D.17771;
  gboolean D.17772;
  struct LOSObject * obj;

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

    D.17745 = &obj->data;
    if (D.17745 > ptr) goto <D.17743>; else goto <D.17746>;
    <D.17746>:
    D.17747 = obj->size;
    D.17748 = &obj->data[D.17747];
    if (D.17748 <= ptr) goto <D.17743>; else goto <D.17744>;
    <D.17743>:
    // predicted unlikely by continue predictor.
    goto <D.17450>;
    <D.17744>:
    size = sgen_los_object_size (obj);
    D.17745 = &obj->data;
    pinned = sgen_los_object_is_pinned (D.17745);
    if (size > 1044464) goto <D.17749>; else goto <D.17750>;
    <D.17749>:
    los_kind = "huge-los-ptr";
    goto <D.17751>;
    <D.17750>:
    los_kind = "los-ptr";
    <D.17751>:
    D.17745 = &obj->data;
    D.17752 = MEM[(mword *)D.17745];
    D.17753 = D.17752 & 4294967292;
    vtable = (struct MonoVTable *) D.17753;
    D.17745 = &obj->data;
    if (D.17745 == ptr) goto <D.17754>; else goto <D.17755>;
    <D.17754>:
    gc_debug_level.32 = gc_debug_level;
    D.17757 = gc_debug_level.32 >= 0;
    D.17758 = (long int) D.17757;
    D.17759 = __builtin_expect (D.17758, 0);
    if (D.17759 != 0) goto <D.17760>; else goto <D.17761>;
    <D.17760>:
    D.17762 = pinned != 0;
    D.17763 = (int) D.17762;
    size.33 = (int) size;
    gc_debug_file.34 = gc_debug_file;
    fprintf (gc_debug_file.34, "%s (size %d pin %d)\n\n", los_kind, size.33, D.17763);
    gc_debug_file.34 = gc_debug_file;
    fflush (gc_debug_file.34);
    <D.17761>:
    goto <D.17766>;
    <D.17755>:
    gc_debug_level.32 = gc_debug_level;
    D.17757 = gc_debug_level.32 >= 0;
    D.17758 = (long int) D.17757;
    D.17759 = __builtin_expect (D.17758, 0);
    if (D.17759 != 0) goto <D.17767>; else goto <D.17768>;
    <D.17767>:
    D.17762 = pinned != 0;
    D.17763 = (int) D.17762;
    size.33 = (int) size;
    ptr.35 = (int) ptr;
    D.17745 = &obj->data;
    D.17770 = (int) D.17745;
    D.17771 = ptr.35 - D.17770;
    gc_debug_file.34 = gc_debug_file;
    fprintf (gc_debug_file.34, "%s (interior-ptr offset %td size %d pin %d)\n", los_kind, D.17771, size.33, D.17763);
    gc_debug_file.34 = gc_debug_file;
    fflush (gc_debug_file.34);
    <D.17768>:
    <D.17766>:
    D.17772 = 1;
    return D.17772;
  }
  <D.17450>:
  obj = obj->next;
  <D.17452>:
  if (obj != 0B) goto <D.17451>; else goto <D.17453>;
  <D.17453>:
  D.17772 = 0;
  return D.17772;
}


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

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


sgen_los_iterate_live_block_ranges (void (*sgen_cardtable_block_callback) (mword, mword) callback)
{
  char[0:] * D.17776;
  unsigned int D.17777;
  unsigned int D.17778;
  void * D.17779;
  unsigned int D.17780;
  int D.17781;
  unsigned int D.17784;
  unsigned int D.17785;
  struct LOSObject * obj;

  obj = los_object_list;
  goto <D.17460>;
  <D.17459>:
  {
    struct MonoVTable * vt;

    D.17776 = &obj->data;
    D.17777 = MEM[(mword *)D.17776];
    D.17778 = D.17777 & 4294967292;
    vt = (struct MonoVTable *) D.17778;
    D.17779 = vt->gc_descr;
    D.17780 = (unsigned int) D.17779;
    D.17781 = sgen_gc_descr_has_references (D.17780);
    if (D.17781 != 0) goto <D.17782>; else goto <D.17783>;
    <D.17782>:
    D.17784 = obj->size;
    D.17776 = &obj->data;
    D.17785 = (unsigned int) D.17776;
    callback (D.17785, D.17784);
    <D.17783>:
  }
  obj = obj->next;
  <D.17460>:
  if (obj != 0B) goto <D.17459>; else goto <D.17461>;
  <D.17461>:
}


sgen_gc_descr_has_references (mword desc)
{
  unsigned int D.17786;
  gboolean D.17789;
  unsigned int D.17790;
  unsigned int D.17793;

  D.17786 = desc & 4294901767;
  if (D.17786 == 1) goto <D.17787>; else goto <D.17788>;
  <D.17787>:
  D.17789 = 0;
  return D.17789;
  <D.17788>:
  D.17790 = desc & 49159;
  if (D.17790 == 4) goto <D.17791>; else goto <D.17792>;
  <D.17791>:
  D.17789 = 0;
  return D.17789;
  <D.17792>:
  D.17793 = desc & 7;
  if (D.17793 == 7) goto <D.17794>; else goto <D.17795>;
  <D.17794>:
  D.17789 = 0;
  return D.17789;
  <D.17795>:
  D.17789 = 1;
  return D.17789;
}


sgen_los_scan_card_table (gboolean mod_union, struct SgenGrayQueue * queue)
{
  _Bool D.17799;
  long int D.17800;
  long int D.17801;
  unsigned int D.17804;
  char[0:] * D.17805;
  struct LOSObject * obj;

  obj = los_object_list;
  goto <D.17469>;
  <D.17468>:
  {
    guint8 * cards;

    cards = 0B;
    if (mod_union != 0) goto <D.17797>; else goto <D.17798>;
    <D.17797>:
    cards = obj->cardtable_mod_union;
    D.17799 = cards == 0B;
    D.17800 = (long int) D.17799;
    D.17801 = __builtin_expect (D.17800, 0);
    if (D.17801 != 0) goto <D.17802>; else goto <D.17803>;
    <D.17802>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 544, "cards");
    <D.17803>:
    <D.17798>:
    D.17804 = obj->size;
    D.17805 = &obj->data;
    sgen_cardtable_scan_object (D.17805, D.17804, cards, mod_union, queue);
  }
  obj = obj->next;
  <D.17469>:
  if (obj != 0B) goto <D.17468>; else goto <D.17470>;
  <D.17470>:
}


sgen_los_update_cardtable_mod_union ()
{
  unsigned int D.17806;
  char[0:] * D.17807;
  guint8 * D.17808;
  guint8 * D.17809;
  struct LOSObject * obj;

  obj = los_object_list;
  goto <D.17476>;
  <D.17475>:
  D.17806 = obj->size;
  D.17807 = &obj->data;
  D.17808 = obj->cardtable_mod_union;
  D.17809 = sgen_card_table_update_mod_union (D.17808, D.17807, D.17806, 0B);
  obj->cardtable_mod_union = D.17809;
  obj = obj->next;
  <D.17476>:
  if (obj != 0B) goto <D.17475>; else goto <D.17477>;
  <D.17477>:
}


sgen_los_object_size (struct LOSObject * obj)
{
  mword D.17810;
  unsigned int D.17811;

  D.17811 = obj->size;
  D.17810 = D.17811 & 4294967294;
  return D.17810;
}


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

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


sgen_los_pin_object (char * data)
{
  unsigned int D.17815;
  unsigned int D.17816;
  struct LOSObject * obj;

  obj = sgen_los_header_for_object (data);
  D.17815 = obj->size;
  D.17816 = D.17815 | 1;
  obj->size = D.17816;
}


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

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


sgen_los_object_is_pinned (char * data)
{
  gboolean D.17818;
  unsigned int D.17819;
  int D.17820;
  struct LOSObject * obj;

  obj = sgen_los_header_for_object (data);
  D.17819 = obj->size;
  D.17820 = (int) D.17819;
  D.17818 = D.17820 & 1;
  return D.17818;
}


