sgen_los_free_object (struct LOSObject * obj)
{
  long unsigned int D.17864;
  char[0:] * D.17865;
  struct FILE * gc_debug_file.0;
  long unsigned int los_memory_usage.1;
  long unsigned int los_memory_usage.2;
  long unsigned int los_num_objects.3;
  long unsigned int los_num_objects.4;
  int pagesize.5;
  int pagesize.6;
  int D.17877;
  long unsigned int D.17878;
  int D.17879;
  long unsigned int D.17880;
  long unsigned int D.17882;
  size_t size;

  size = obj->size;
  if (0 != 0) goto <D.17862>; else goto <D.17863>;
  <D.17862>:
  D.17864 = obj->size;
  D.17865 = &obj->data;
  gc_debug_file.0 = gc_debug_file;
  fprintf (gc_debug_file.0, "Freed large object %p, size %lu\n", D.17865, D.17864);
  gc_debug_file.0 = gc_debug_file;
  fflush (gc_debug_file.0);
  <D.17863>:
  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 + 18446744073709551615;
  los_num_objects = los_num_objects.4;
  if (size > 1044456) goto <D.17871>; else goto <D.17872>;
  <D.17871>:
  pagesize.5 = pagesize;
  if (pagesize.5 == 0) goto <D.17874>; else goto <D.17875>;
  <D.17874>:
  pagesize.6 = mono_pagesize ();
  pagesize = pagesize.6;
  <D.17875>:
  size = size + 24;
  pagesize.5 = pagesize;
  D.17877 = pagesize.5 + -1;
  D.17878 = (long unsigned int) D.17877;
  size = D.17878 + size;
  pagesize.5 = pagesize;
  D.17879 = -pagesize.5;
  D.17880 = (long unsigned int) D.17879;
  size = D.17880 & size;
  sgen_free_os_memory (obj, size, 1);
  sgen_memgov_release_space (size, 2);
  goto <D.17881>;
  <D.17872>:
  D.17882 = size + 24;
  free_los_section_memory (obj, D.17882);
  <D.17881>:
}


free_los_section_memory (struct LOSObject * obj, size_t size)
{
  long unsigned int obj.7;
  long unsigned int D.17884;
  long unsigned int D.17885;
  long unsigned int D.17886;
  _Bool D.17887;
  long int D.17888;
  long int D.17889;
  _Bool D.17892;
  long int D.17893;
  long int D.17894;
  int D.17897;
  int D.17898;
  _Bool D.17899;
  long int D.17900;
  long int D.17901;
  long int obj.8;
  long int section.9;
  long int D.17906;
  long int D.17907;
  unsigned char * D.17908;
  sizetype D.17909;
  unsigned char * D.17910;
  unsigned char D.17911;
  _Bool D.17912;
  long int D.17913;
  long int D.17914;
  int D.17917;
  struct LOSSection * section;
  int num_chunks;
  int i;
  int start_index;

  obj.7 = (long unsigned int) obj;
  D.17884 = obj.7 & 18446744073708503040;
  section = (struct LOSSection *) D.17884;
  size = size + 4095;
  size = size & 18446744073709547520;
  D.17885 = size >> 12;
  num_chunks = (int) D.17885;
  D.17886 = size + 18446744073709551592;
  D.17887 = D.17886 > 1044456;
  D.17888 = (long int) D.17887;
  D.17889 = __builtin_expect (D.17888, 0);
  if (D.17889 != 0) goto <D.17890>; else goto <D.17891>;
  <D.17890>:
  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.17891>:
  D.17892 = num_chunks <= 0;
  D.17893 = (long int) D.17892;
  D.17894 = __builtin_expect (D.17893, 0);
  if (D.17894 != 0) goto <D.17895>; else goto <D.17896>;
  <D.17895>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 268, "num_chunks > 0");
  <D.17896>:
  D.17897 = section->num_free_chunks;
  D.17898 = D.17897 + num_chunks;
  section->num_free_chunks = D.17898;
  D.17897 = section->num_free_chunks;
  D.17899 = D.17897 > 255;
  D.17900 = (long int) D.17899;
  D.17901 = __builtin_expect (D.17900, 0);
  if (D.17901 != 0) goto <D.17902>; else goto <D.17903>;
  <D.17902>:
  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.17903>:
  obj.8 = (long int) obj;
  section.9 = (long int) section;
  D.17906 = obj.8 - section.9;
  D.17907 = D.17906 >> 12;
  start_index = (int) D.17907;
  i = start_index;
  goto <D.17748>;
  <D.17747>:
  D.17908 = section->free_chunk_map;
  D.17909 = (sizetype) i;
  D.17910 = D.17908 + D.17909;
  D.17911 = *D.17910;
  D.17912 = D.17911 != 0;
  D.17913 = (long int) D.17912;
  D.17914 = __builtin_expect (D.17913, 0);
  if (D.17914 != 0) goto <D.17915>; else goto <D.17916>;
  <D.17915>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 281, "!section->free_chunk_map [i]");
  <D.17916>:
  D.17908 = section->free_chunk_map;
  D.17909 = (sizetype) i;
  D.17910 = D.17908 + D.17909;
  *D.17910 = 1;
  i = i + 1;
  <D.17748>:
  D.17917 = start_index + num_chunks;
  if (D.17917 > i) goto <D.17747>; else goto <D.17749>;
  <D.17749>:
  add_free_chunk (obj, size);
}


add_free_chunk (struct LOSFreeChunks * free_chunks, size_t size)
{
  long unsigned int D.17918;
  struct LOSFreeChunks * D.17921;
  int num_chunks;

  D.17918 = size >> 12;
  num_chunks = (int) D.17918;
  free_chunks->size = size;
  if (num_chunks > 31) goto <D.17919>; else goto <D.17920>;
  <D.17919>:
  num_chunks = 0;
  <D.17920>:
  D.17921 = los_fast_free_lists[num_chunks];
  free_chunks->next_size = D.17921;
  los_fast_free_lists[num_chunks] = free_chunks;
}


sgen_los_alloc_large_inner (struct MonoVTable * vtable, size_t size)
{
  _Bool D.17922;
  long int D.17923;
  long int D.17924;
  long unsigned int D.17927;
  _Bool D.17928;
  long int D.17929;
  long int D.17930;
  int pagesize.10;
  int pagesize.11;
  int D.17939;
  long unsigned int D.17940;
  int D.17941;
  long unsigned int D.17942;
  int D.17943;
  long unsigned int D.17947;
  void * D.17952;
  char[0:] * D.17955;
  long unsigned int D.17956;
  long unsigned int D.17957;
  struct LOSObject * los_object_list.12;
  long unsigned int los_memory_usage.13;
  long unsigned int los_memory_usage.14;
  long unsigned int los_num_objects.15;
  long unsigned int los_num_objects.16;
  struct MonoClass * D.17965;
  const char * D.17966;
  struct FILE * gc_debug_file.17;
  struct LOSObject * obj;
  void * * vtslot;

  obj = 0B;
  D.17922 = size <= 8000;
  D.17923 = (long int) D.17922;
  D.17924 = __builtin_expect (D.17923, 0);
  if (D.17924 != 0) goto <D.17925>; else goto <D.17926>;
  <D.17925>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 334, "size > SGEN_MAX_SMALL_OBJ_SIZE");
  <D.17926>:
  D.17927 = size & 1;
  D.17928 = D.17927 != 0;
  D.17929 = (long int) D.17928;
  D.17930 = __builtin_expect (D.17929, 0);
  if (D.17930 != 0) goto <D.17931>; else goto <D.17932>;
  <D.17931>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 335, "(size & 1) == 0");
  <D.17932>:
  sgen_ensure_free_space (size);
  if (size > 1044456) goto <D.17933>; else goto <D.17934>;
  <D.17933>:
  {
    size_t alloc_size;

    alloc_size = size;
    pagesize.10 = pagesize;
    if (pagesize.10 == 0) goto <D.17936>; else goto <D.17937>;
    <D.17936>:
    pagesize.11 = mono_pagesize ();
    pagesize = pagesize.11;
    <D.17937>:
    alloc_size = alloc_size + 24;
    pagesize.10 = pagesize;
    D.17939 = pagesize.10 + -1;
    D.17940 = (long unsigned int) D.17939;
    alloc_size = D.17940 + alloc_size;
    pagesize.10 = pagesize;
    D.17941 = -pagesize.10;
    D.17942 = (long unsigned int) D.17941;
    alloc_size = D.17942 & alloc_size;
    D.17943 = sgen_memgov_try_alloc_space (alloc_size, 2);
    if (D.17943 != 0) goto <D.17944>; else goto <D.17945>;
    <D.17944>:
    obj = sgen_alloc_os_memory (alloc_size, 3, 0B);
    <D.17945>:
  }
  goto <D.17946>;
  <D.17934>:
  D.17947 = size + 24;
  obj = get_los_section_memory (D.17947);
  if (obj != 0B) goto <D.17948>; else goto <D.17949>;
  <D.17948>:
  D.17947 = size + 24;
  memset (obj, 0, D.17947);
  <D.17949>:
  <D.17946>:
  if (obj == 0B) goto <D.17950>; else goto <D.17951>;
  <D.17950>:
  D.17952 = 0B;
  return D.17952;
  <D.17951>:
  if (0 != 0) goto <D.17953>; else goto <D.17954>;
  <D.17953>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 371, "!((mword)obj->data & (SGEN_ALLOC_ALIGN - 1))");
  <D.17954>:
  obj->size = size;
  vtslot = &obj->data;
  *vtslot = vtable;
  D.17955 = &obj->data;
  D.17956 = (long unsigned int) D.17955;
  D.17957 = D.17956 + size;
  D.17955 = &obj->data;
  D.17956 = (long unsigned int) D.17955;
  sgen_update_heap_boundaries (D.17956, D.17957);
  los_object_list.12 = los_object_list;
  obj->next = los_object_list.12;
  los_object_list = obj;
  los_memory_usage.13 = los_memory_usage;
  los_memory_usage.14 = los_memory_usage.13 + size;
  los_memory_usage = los_memory_usage.14;
  los_num_objects.15 = los_num_objects;
  los_num_objects.16 = los_num_objects.15 + 1;
  los_num_objects = los_num_objects.16;
  if (0 != 0) goto <D.17963>; else goto <D.17964>;
  <D.17963>:
  D.17965 = vtable->klass;
  D.17966 = D.17965->name;
  D.17955 = &obj->data;
  gc_debug_file.17 = gc_debug_file;
  fprintf (gc_debug_file.17, "Allocated large object %p, vtable: %p (%s), size: %zd\n", D.17955, vtable, D.17966, size);
  gc_debug_file.17 = gc_debug_file;
  fflush (gc_debug_file.17);
  <D.17964>:
  D.17952 = &obj->data;
  return D.17952;
}


get_los_section_memory (size_t size)
{
  long unsigned int D.17969;
  long unsigned int D.17970;
  _Bool D.17971;
  long int D.17972;
  long int D.17973;
  _Bool D.17976;
  long int D.17977;
  long int D.17978;
  struct LOSFreeChunks * * D.17984;
  struct LOSObject * D.17990;
  int D.17991;
  struct LOSFreeChunks * D.17996;
  unsigned char * D.17997;
  unsigned char * D.18000;
  void * D.18001;
  struct LOSSection * los_sections.18;
  int los_num_sections.19;
  int los_num_sections.20;
  struct LOSSection * section;
  struct LOSFreeChunks * free_chunks;
  int num_chunks;
  void retry = <<< error >>>;

  size = size + 4095;
  size = size & 18446744073709547520;
  D.17969 = size >> 12;
  num_chunks = (int) D.17969;
  D.17970 = size + 18446744073709551592;
  D.17971 = D.17970 > 1044456;
  D.17972 = (long int) D.17971;
  D.17973 = __builtin_expect (D.17972, 0);
  if (D.17973 != 0) goto <D.17974>; else goto <D.17975>;
  <D.17974>:
  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.17975>:
  D.17976 = num_chunks <= 0;
  D.17977 = (long int) D.17976;
  D.17978 = __builtin_expect (D.17977, 0);
  if (D.17978 != 0) goto <D.17979>; else goto <D.17980>;
  <D.17979>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 209, "num_chunks > 0");
  <D.17980>:
  retry:
  if (num_chunks > 31) goto <D.17981>; else goto <D.17982>;
  <D.17981>:
  free_chunks = get_from_size_list (&los_fast_free_lists[0], size);
  goto <D.17983>;
  <D.17982>:
  {
    int i;

    i = num_chunks;
    goto <D.17738>;
    <D.17737>:
    D.17984 = &los_fast_free_lists[i];
    free_chunks = get_from_size_list (D.17984, size);
    if (free_chunks != 0B) goto <D.17736>; else goto <D.17985>;
    <D.17985>:
    i = i + 1;
    <D.17738>:
    if (i <= 31) goto <D.17737>; else goto <D.17736>;
    <D.17736>:
    if (free_chunks == 0B) goto <D.17986>; else goto <D.17987>;
    <D.17986>:
    free_chunks = get_from_size_list (&los_fast_free_lists[0], size);
    <D.17987>:
  }
  <D.17983>:
  if (free_chunks != 0B) goto <D.17988>; else goto <D.17989>;
  <D.17988>:
  D.17990 = free_chunks;
  return D.17990;
  <D.17989>:
  D.17991 = sgen_memgov_try_alloc_space (1048576, 2);
  if (D.17991 == 0) goto <D.17992>; else goto <D.17993>;
  <D.17992>:
  D.17990 = 0B;
  return D.17990;
  <D.17993>:
  section = sgen_alloc_os_memory_aligned (1048576, 1048576, 3, 0B);
  if (section == 0B) goto <D.17994>; else goto <D.17995>;
  <D.17994>:
  D.17990 = 0B;
  return D.17990;
  <D.17995>:
  free_chunks = section + 4096;
  free_chunks->size = 1044480;
  D.17996 = los_fast_free_lists[0];
  free_chunks->next_size = D.17996;
  los_fast_free_lists[0] = free_chunks;
  section->num_free_chunks = 255;
  D.17997 = section + 24;
  section->free_chunk_map = D.17997;
  if (0 != 0) goto <D.17998>; else goto <D.17999>;
  <D.17998>:
  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.17999>:
  D.18000 = section->free_chunk_map;
  *D.18000 = 0;
  D.18000 = section->free_chunk_map;
  D.18001 = D.18000 + 1;
  memset (D.18001, 1, 255);
  los_sections.18 = los_sections;
  section->next = los_sections.18;
  los_sections = section;
  los_num_sections.19 = los_num_sections;
  los_num_sections.20 = los_num_sections.19 + 1;
  los_num_sections = los_num_sections.20;
  goto retry;
}


get_from_size_list (struct LOSFreeChunks * * list, size_t size)
{
  long unsigned int D.18006;
  _Bool D.18007;
  long int D.18008;
  long int D.18009;
  long unsigned int D.18012;
  struct LOSFreeChunks * D.18014;
  struct LOSFreeChunks * D.18017;
  struct LOSFreeChunks * D.18018;
  long unsigned int D.18021;
  struct LOSFreeChunks * D.18022;
  long unsigned int D.18023;
  long unsigned int free_chunks.21;
  long unsigned int D.18025;
  long int free_chunks.22;
  long int section.23;
  long int D.18028;
  long int D.18029;
  unsigned char * D.18030;
  sizetype D.18031;
  unsigned char * D.18032;
  unsigned char D.18033;
  _Bool D.18034;
  long int D.18035;
  long int D.18036;
  int D.18039;
  int D.18040;
  unsigned int D.18041;
  unsigned int D.18042;
  unsigned int D.18043;
  int D.18044;
  _Bool D.18045;
  long int D.18046;
  long int D.18047;
  struct LOSFreeChunks * free_chunks;
  struct LOSSection * section;
  int num_chunks;
  int i;
  int start_index;

  free_chunks = 0B;
  D.18006 = size & 4095;
  D.18007 = D.18006 != 0;
  D.18008 = (long int) D.18007;
  D.18009 = __builtin_expect (D.18008, 0);
  if (D.18009 != 0) goto <D.18010>; else goto <D.18011>;
  <D.18010>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 163, "(size & (LOS_CHUNK_SIZE - 1)) == 0");
  <D.18011>:
  goto <D.17724>;
  <D.17723>:
  free_chunks = *list;
  D.18012 = free_chunks->size;
  if (D.18012 >= size) goto <D.17722>; else goto <D.18013>;
  <D.18013>:
  D.18014 = *list;
  list = &D.18014->next_size;
  <D.17724>:
  D.18014 = *list;
  if (D.18014 != 0B) goto <D.17723>; else goto <D.17722>;
  <D.17722>:
  D.18014 = *list;
  if (D.18014 == 0B) goto <D.18015>; else goto <D.18016>;
  <D.18015>:
  D.18017 = 0B;
  return D.18017;
  <D.18016>:
  D.18018 = free_chunks->next_size;
  *list = D.18018;
  D.18012 = free_chunks->size;
  if (D.18012 > size) goto <D.18019>; else goto <D.18020>;
  <D.18019>:
  D.18012 = free_chunks->size;
  D.18021 = D.18012 - size;
  D.18022 = free_chunks + size;
  add_free_chunk (D.18022, D.18021);
  <D.18020>:
  D.18023 = size >> 12;
  num_chunks = (int) D.18023;
  free_chunks.21 = (long unsigned int) free_chunks;
  D.18025 = free_chunks.21 & 18446744073708503040;
  section = (struct LOSSection *) D.18025;
  free_chunks.22 = (long int) free_chunks;
  section.23 = (long int) section;
  D.18028 = free_chunks.22 - section.23;
  D.18029 = D.18028 >> 12;
  start_index = (int) D.18029;
  i = start_index;
  goto <D.17726>;
  <D.17725>:
  D.18030 = section->free_chunk_map;
  D.18031 = (sizetype) i;
  D.18032 = D.18030 + D.18031;
  D.18033 = *D.18032;
  D.18034 = D.18033 == 0;
  D.18035 = (long int) D.18034;
  D.18036 = __builtin_expect (D.18035, 0);
  if (D.18036 != 0) goto <D.18037>; else goto <D.18038>;
  <D.18037>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 186, "section->free_chunk_map [i]");
  <D.18038>:
  D.18030 = section->free_chunk_map;
  D.18031 = (sizetype) i;
  D.18032 = D.18030 + D.18031;
  *D.18032 = 0;
  i = i + 1;
  <D.17726>:
  D.18039 = start_index + num_chunks;
  if (D.18039 > i) goto <D.17725>; else goto <D.17727>;
  <D.17727>:
  D.18040 = section->num_free_chunks;
  D.18041 = (unsigned int) D.18040;
  D.18023 = size >> 12;
  D.18042 = (unsigned int) D.18023;
  D.18043 = D.18041 - D.18042;
  D.18044 = (int) D.18043;
  section->num_free_chunks = D.18044;
  D.18040 = section->num_free_chunks;
  D.18045 = D.18040 < 0;
  D.18046 = (long int) D.18045;
  D.18047 = __builtin_expect (D.18046, 0);
  if (D.18047 != 0) goto <D.18048>; else goto <D.18049>;
  <D.18048>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 191, "section->num_free_chunks >= 0");
  <D.18049>:
  D.18017 = free_chunks;
  return D.18017;
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.18053;
  int D.18058;
  void * D.18060;
  long unsigned int D.18061;

  D.18053 = __builtin_constant_p (__len);
  if (D.18053 != 0) goto <D.18054>; else goto <D.18055>;
  <D.18054>:
  if (__len == 0) goto <D.18056>; else goto <D.18057>;
  <D.18056>:
  D.18058 = __builtin_constant_p (__ch);
  if (D.18058 == 0) goto <D.18051>; else goto <D.18059>;
  <D.18059>:
  if (__ch != 0) goto <D.18051>; else goto <D.18052>;
  <D.18051>:
  __warn_memset_zero_len ();
  D.18060 = __dest;
  return D.18060;
  <D.18052>:
  <D.18057>:
  <D.18055>:
  D.18061 = __builtin_object_size (__dest, 0);
  D.18060 = __builtin___memset_chk (__dest, __ch, __len, D.18061);
  return D.18060;
}


sgen_los_sweep ()
{
  int D.18063;
  int los_num_sections.24;
  int los_num_sections.25;
  unsigned char * D.18071;
  sizetype D.18072;
  unsigned char * D.18073;
  unsigned char D.18074;
  sizetype D.18078;
  unsigned char * D.18079;
  unsigned char D.18080;
  int D.18081;
  int D.18082;
  long unsigned int D.18083;
  int D.18084;
  sizetype D.18085;
  struct LOSFreeChunks * D.18086;
  _Bool D.18087;
  long int D.18088;
  long int D.18089;
  struct LOSSection * section;
  struct LOSSection * prev;
  int i;
  int num_sections;

  num_sections = 0;
  i = 0;
  goto <D.17770>;
  <D.17769>:
  los_fast_free_lists[i] = 0B;
  i = i + 1;
  <D.17770>:
  if (i <= 31) goto <D.17769>; else goto <D.17771>;
  <D.17771>:
  prev = 0B;
  section = los_sections;
  goto <D.17773>;
  <D.17781>:
  D.18063 = section->num_free_chunks;
  if (D.18063 == 255) goto <D.18064>; else goto <D.18065>;
  <D.18064>:
  {
    struct LOSSection * next;

    next = section->next;
    if (prev != 0B) goto <D.18066>; else goto <D.18067>;
    <D.18066>:
    prev->next = next;
    goto <D.18068>;
    <D.18067>:
    los_sections = next;
    <D.18068>:
    sgen_free_os_memory (section, 1048576, 1);
    sgen_memgov_release_space (1048576, 2);
    section = next;
    los_num_sections.24 = los_num_sections;
    los_num_sections.25 = los_num_sections.24 + -1;
    los_num_sections = los_num_sections.25;
    // predicted unlikely by continue predictor.
    goto <D.17773>;
  }
  <D.18065>:
  i = 0;
  goto <D.17779>;
  <D.17778>:
  D.18071 = section->free_chunk_map;
  D.18072 = (sizetype) i;
  D.18073 = D.18071 + D.18072;
  D.18074 = *D.18073;
  if (D.18074 != 0) goto <D.18075>; else goto <D.18076>;
  <D.18075>:
  {
    int j;

    j = i + 1;
    goto <D.17776>;
    <D.17775>:
    j = j + 1;
    <D.17776>:
    if (j <= 255) goto <D.18077>; else goto <D.17777>;
    <D.18077>:
    D.18071 = section->free_chunk_map;
    D.18078 = (sizetype) j;
    D.18079 = D.18071 + D.18078;
    D.18080 = *D.18079;
    if (D.18080 != 0) goto <D.17775>; else goto <D.17777>;
    <D.17777>:
    D.18081 = j - i;
    D.18082 = D.18081 << 12;
    D.18083 = (long unsigned int) D.18082;
    D.18084 = i << 12;
    D.18085 = (sizetype) D.18084;
    D.18086 = section + D.18085;
    add_free_chunk (D.18086, D.18083);
    i = j + -1;
  }
  <D.18076>:
  i = i + 1;
  <D.17779>:
  if (i <= 255) goto <D.17778>; else goto <D.17780>;
  <D.17780>:
  prev = section;
  section = section->next;
  num_sections = num_sections + 1;
  <D.17773>:
  if (section != 0B) goto <D.17781>; else goto <D.17782>;
  <D.17782>:
  los_num_sections.24 = los_num_sections;
  D.18087 = los_num_sections.24 != num_sections;
  D.18088 = (long int) D.18087;
  D.18089 = __builtin_expect (D.18088, 0);
  if (D.18089 != 0) goto <D.18090>; else goto <D.18091>;
  <D.18090>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 447, "los_num_sections == num_sections");
  <D.18091>:
}


sgen_ptr_is_in_los (char * ptr, char * * start)
{
  long unsigned int D.18092;
  char[0:] * D.18093;
  gboolean D.18098;
  struct LOSObject * obj;

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

    D.18092 = obj->size;
    end = &obj->data[D.18092];
    D.18093 = &obj->data;
    if (D.18093 <= ptr) goto <D.18094>; else goto <D.18095>;
    <D.18094>:
    if (ptr < end) goto <D.18096>; else goto <D.18097>;
    <D.18096>:
    D.18093 = &obj->data;
    *start = D.18093;
    D.18098 = 1;
    return D.18098;
    <D.18097>:
    <D.18095>:
  }
  obj = obj->next;
  <D.17790>:
  if (obj != 0B) goto <D.17789>; else goto <D.17791>;
  <D.17791>:
  D.18098 = 0;
  return D.18098;
}


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

  obj = los_object_list;
  goto <D.17798>;
  <D.17797>:
  D.18100 = obj->size;
  D.18101 = &obj->data;
  cb (D.18101, D.18100, user_data);
  obj = obj->next;
  <D.17798>:
  if (obj != 0B) goto <D.17797>; else goto <D.17799>;
  <D.17799>:
}


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

  obj = los_object_list;
  goto <D.17805>;
  <D.17804>:
  D.18102 = &obj->data;
  if (D.18102 == object) goto <D.18103>; else goto <D.18104>;
  <D.18103>:
  D.18105 = 1;
  return D.18105;
  <D.18104>:
  obj = obj->next;
  <D.17805>:
  if (obj != 0B) goto <D.17804>; else goto <D.17806>;
  <D.17806>:
  D.18105 = 0;
  return D.18105;
}


mono_sgen_los_describe_pointer (char * ptr)
{
  char[0:] * D.18109;
  long unsigned int D.18111;
  char * D.18112;
  long unsigned int D.18116;
  long unsigned int D.18117;
  int gc_debug_level.26;
  _Bool D.18121;
  long int D.18122;
  long int D.18123;
  _Bool D.18126;
  int D.18127;
  int D.18128;
  struct FILE * gc_debug_file.27;
  long int ptr.28;
  long int D.18134;
  long int D.18135;
  gboolean D.18136;
  struct LOSObject * obj;

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

    D.18109 = &obj->data;
    if (D.18109 > ptr) goto <D.18107>; else goto <D.18110>;
    <D.18110>:
    D.18111 = obj->size;
    D.18112 = &obj->data[D.18111];
    if (D.18112 <= ptr) goto <D.18107>; else goto <D.18108>;
    <D.18107>:
    // predicted unlikely by continue predictor.
    goto <D.17815>;
    <D.18108>:
    size = sgen_los_object_size (obj);
    D.18109 = &obj->data;
    pinned = sgen_los_object_is_pinned (D.18109);
    if (size > 1044456) goto <D.18113>; else goto <D.18114>;
    <D.18113>:
    los_kind = "huge-los-ptr";
    goto <D.18115>;
    <D.18114>:
    los_kind = "los-ptr";
    <D.18115>:
    D.18109 = &obj->data;
    D.18116 = MEM[(mword *)D.18109];
    D.18117 = D.18116 & 18446744073709551612;
    vtable = (struct MonoVTable *) D.18117;
    D.18109 = &obj->data;
    if (D.18109 == ptr) goto <D.18118>; else goto <D.18119>;
    <D.18118>:
    gc_debug_level.26 = gc_debug_level;
    D.18121 = gc_debug_level.26 >= 0;
    D.18122 = (long int) D.18121;
    D.18123 = __builtin_expect (D.18122, 0);
    if (D.18123 != 0) goto <D.18124>; else goto <D.18125>;
    <D.18124>:
    D.18126 = pinned != 0;
    D.18127 = (int) D.18126;
    D.18128 = (int) size;
    gc_debug_file.27 = gc_debug_file;
    fprintf (gc_debug_file.27, "%s (size %d pin %d)\n\n", los_kind, D.18128, D.18127);
    gc_debug_file.27 = gc_debug_file;
    fflush (gc_debug_file.27);
    <D.18125>:
    goto <D.18130>;
    <D.18119>:
    gc_debug_level.26 = gc_debug_level;
    D.18121 = gc_debug_level.26 >= 0;
    D.18122 = (long int) D.18121;
    D.18123 = __builtin_expect (D.18122, 0);
    if (D.18123 != 0) goto <D.18131>; else goto <D.18132>;
    <D.18131>:
    D.18126 = pinned != 0;
    D.18127 = (int) D.18126;
    D.18128 = (int) size;
    ptr.28 = (long int) ptr;
    D.18109 = &obj->data;
    D.18134 = (long int) D.18109;
    D.18135 = ptr.28 - D.18134;
    gc_debug_file.27 = gc_debug_file;
    fprintf (gc_debug_file.27, "%s (interior-ptr offset %td size %d pin %d)\n", los_kind, D.18135, D.18128, D.18127);
    gc_debug_file.27 = gc_debug_file;
    fflush (gc_debug_file.27);
    <D.18132>:
    <D.18130>:
    D.18136 = 1;
    return D.18136;
  }
  <D.17815>:
  obj = obj->next;
  <D.17817>:
  if (obj != 0B) goto <D.17816>; else goto <D.17818>;
  <D.17818>:
  D.18136 = 0;
  return D.18136;
}


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

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


sgen_los_iterate_live_block_ranges (void (*sgen_cardtable_block_callback) (mword, mword) callback)
{
  char[0:] * D.18140;
  long unsigned int D.18141;
  long unsigned int D.18142;
  void * D.18143;
  long unsigned int D.18144;
  int D.18145;
  long unsigned int D.18148;
  long unsigned int D.18149;
  struct LOSObject * obj;

  obj = los_object_list;
  goto <D.17825>;
  <D.17824>:
  {
    struct MonoVTable * vt;

    D.18140 = &obj->data;
    D.18141 = MEM[(mword *)D.18140];
    D.18142 = D.18141 & 18446744073709551612;
    vt = (struct MonoVTable *) D.18142;
    D.18143 = vt->gc_descr;
    D.18144 = (long unsigned int) D.18143;
    D.18145 = sgen_gc_descr_has_references (D.18144);
    if (D.18145 != 0) goto <D.18146>; else goto <D.18147>;
    <D.18146>:
    D.18148 = obj->size;
    D.18140 = &obj->data;
    D.18149 = (long unsigned int) D.18140;
    callback (D.18149, D.18148);
    <D.18147>:
  }
  obj = obj->next;
  <D.17825>:
  if (obj != 0B) goto <D.17824>; else goto <D.17826>;
  <D.17826>:
}


sgen_gc_descr_has_references (mword desc)
{
  long unsigned int D.18150;
  gboolean D.18153;
  long unsigned int D.18154;
  long unsigned int D.18157;

  D.18150 = desc & 4294901767;
  if (D.18150 == 1) goto <D.18151>; else goto <D.18152>;
  <D.18151>:
  D.18153 = 0;
  return D.18153;
  <D.18152>:
  D.18154 = desc & 49159;
  if (D.18154 == 4) goto <D.18155>; else goto <D.18156>;
  <D.18155>:
  D.18153 = 0;
  return D.18153;
  <D.18156>:
  D.18157 = desc & 7;
  if (D.18157 == 7) goto <D.18158>; else goto <D.18159>;
  <D.18158>:
  D.18153 = 0;
  return D.18153;
  <D.18159>:
  D.18153 = 1;
  return D.18153;
}


sgen_los_scan_card_table (gboolean mod_union, struct SgenGrayQueue * queue)
{
  _Bool D.18163;
  long int D.18164;
  long int D.18165;
  long unsigned int D.18168;
  char[0:] * D.18169;
  struct LOSObject * obj;

  obj = los_object_list;
  goto <D.17834>;
  <D.17833>:
  {
    guint8 * cards;

    cards = 0B;
    if (mod_union != 0) goto <D.18161>; else goto <D.18162>;
    <D.18161>:
    cards = obj->cardtable_mod_union;
    D.18163 = cards == 0B;
    D.18164 = (long int) D.18163;
    D.18165 = __builtin_expect (D.18164, 0);
    if (D.18165 != 0) goto <D.18166>; else goto <D.18167>;
    <D.18166>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 544, "cards");
    <D.18167>:
    <D.18162>:
    D.18168 = obj->size;
    D.18169 = &obj->data;
    sgen_cardtable_scan_object (D.18169, D.18168, cards, mod_union, queue);
  }
  obj = obj->next;
  <D.17834>:
  if (obj != 0B) goto <D.17833>; else goto <D.17835>;
  <D.17835>:
}


sgen_los_update_cardtable_mod_union ()
{
  long unsigned int D.18170;
  char[0:] * D.18171;
  guint8 * D.18172;
  guint8 * D.18173;
  struct LOSObject * obj;

  obj = los_object_list;
  goto <D.17841>;
  <D.17840>:
  D.18170 = obj->size;
  D.18171 = &obj->data;
  D.18172 = obj->cardtable_mod_union;
  D.18173 = sgen_card_table_update_mod_union (D.18172, D.18171, D.18170, 0B);
  obj->cardtable_mod_union = D.18173;
  obj = obj->next;
  <D.17841>:
  if (obj != 0B) goto <D.17840>; else goto <D.17842>;
  <D.17842>:
}


sgen_los_object_size (struct LOSObject * obj)
{
  mword D.18174;
  long unsigned int D.18175;

  D.18175 = obj->size;
  D.18174 = D.18175 & 18446744073709551614;
  return D.18174;
}


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

  D.18177 = data + 18446744073709551592;
  return D.18177;
}


sgen_los_pin_object (char * data)
{
  long unsigned int D.18179;
  long unsigned int D.18180;
  struct LOSObject * obj;

  obj = sgen_los_header_for_object (data);
  D.18179 = obj->size;
  D.18180 = D.18179 | 1;
  obj->size = D.18180;
}


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

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


sgen_los_object_is_pinned (char * data)
{
  gboolean D.18182;
  long unsigned int D.18183;
  int D.18184;
  struct LOSObject * obj;

  obj = sgen_los_header_for_object (data);
  D.18183 = obj->size;
  D.18184 = (int) D.18183;
  D.18182 = D.18184 & 1;
  return D.18182;
}


