__attribute__((visibility ("hidden")))
sgen_los_free_object (struct LOSObject * obj)
{
  struct FILE * gc_debug_file.0;
  char[0:] * D.18009;
  long unsigned int D.18010;
  long unsigned int los_memory_usage.1;
  long unsigned int D.18012;
  long unsigned int los_num_objects.2;
  long unsigned int D.18014;
  int pagesize.3;
  int D.18020;
  int D.18021;
  long unsigned int D.18022;
  int D.18023;
  long unsigned int D.18024;
  long unsigned int D.18026;
  size_t size;

  size = obj->size;
  if (0 != 0) goto <D.18006>; else goto <D.18007>;
  <D.18006>:
  gc_debug_file.0 = gc_debug_file;
  D.18009 = &obj->data;
  D.18010 = obj->size;
  fprintf (gc_debug_file.0, "Freed large object %p, size %lu\n", D.18009, D.18010);
  gc_debug_file.0 = gc_debug_file;
  fflush (gc_debug_file.0);
  <D.18007>:
  los_memory_usage.1 = los_memory_usage;
  D.18012 = los_memory_usage.1 - size;
  los_memory_usage = D.18012;
  los_num_objects.2 = los_num_objects;
  D.18014 = los_num_objects.2 + 18446744073709551615;
  los_num_objects = D.18014;
  if (size > 1044456) goto <D.18015>; else goto <D.18016>;
  <D.18015>:
  pagesize.3 = pagesize;
  if (pagesize.3 == 0) goto <D.18018>; else goto <D.18019>;
  <D.18018>:
  D.18020 = mono_pagesize ();
  pagesize = D.18020;
  <D.18019>:
  size = size + 24;
  pagesize.3 = pagesize;
  D.18021 = pagesize.3 + -1;
  D.18022 = (long unsigned int) D.18021;
  size = D.18022 + size;
  pagesize.3 = pagesize;
  D.18023 = -pagesize.3;
  D.18024 = (long unsigned int) D.18023;
  size = D.18024 & size;
  sgen_free_os_memory (obj, size, 1);
  sgen_memgov_release_space (size, 2);
  goto <D.18025>;
  <D.18016>:
  D.18026 = size + 24;
  free_los_section_memory (obj, D.18026);
  <D.18025>:
}


free_los_section_memory (struct LOSObject * obj, size_t size)
{
  long unsigned int obj.4;
  long unsigned int D.18028;
  long unsigned int D.18029;
  long unsigned int D.18030;
  _Bool D.18031;
  long int D.18032;
  long int D.18033;
  _Bool D.18036;
  long int D.18037;
  long int D.18038;
  int D.18041;
  int D.18042;
  _Bool D.18043;
  long int D.18044;
  long int D.18045;
  long int obj.5;
  long int section.6;
  long int D.18050;
  long int D.18051;
  unsigned char * D.18052;
  sizetype D.18053;
  unsigned char * D.18054;
  unsigned char D.18055;
  _Bool D.18056;
  long int D.18057;
  long int D.18058;
  int D.18061;
  struct LOSSection * section;
  int num_chunks;
  int i;
  int start_index;

  obj.4 = (long unsigned int) obj;
  D.18028 = obj.4 & 18446744073708503040;
  section = (struct LOSSection *) D.18028;
  size = size + 4095;
  size = size & 18446744073709547520;
  D.18029 = size >> 12;
  num_chunks = (int) D.18029;
  D.18030 = size + 18446744073709551592;
  D.18031 = D.18030 > 1044456;
  D.18032 = (long int) D.18031;
  D.18033 = __builtin_expect (D.18032, 0);
  if (D.18033 != 0) goto <D.18034>; else goto <D.18035>;
  <D.18034>:
  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.18035>:
  D.18036 = num_chunks <= 0;
  D.18037 = (long int) D.18036;
  D.18038 = __builtin_expect (D.18037, 0);
  if (D.18038 != 0) goto <D.18039>; else goto <D.18040>;
  <D.18039>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 268, "num_chunks > 0");
  <D.18040>:
  D.18041 = section->num_free_chunks;
  D.18042 = D.18041 + num_chunks;
  section->num_free_chunks = D.18042;
  D.18041 = section->num_free_chunks;
  D.18043 = D.18041 > 255;
  D.18044 = (long int) D.18043;
  D.18045 = __builtin_expect (D.18044, 0);
  if (D.18045 != 0) goto <D.18046>; else goto <D.18047>;
  <D.18046>:
  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.18047>:
  obj.5 = (long int) obj;
  section.6 = (long int) section;
  D.18050 = obj.5 - section.6;
  D.18051 = D.18050 >> 12;
  start_index = (int) D.18051;
  i = start_index;
  goto <D.17892>;
  <D.17891>:
  D.18052 = section->free_chunk_map;
  D.18053 = (sizetype) i;
  D.18054 = D.18052 + D.18053;
  D.18055 = *D.18054;
  D.18056 = D.18055 != 0;
  D.18057 = (long int) D.18056;
  D.18058 = __builtin_expect (D.18057, 0);
  if (D.18058 != 0) goto <D.18059>; else goto <D.18060>;
  <D.18059>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 281, "!section->free_chunk_map [i]");
  <D.18060>:
  D.18052 = section->free_chunk_map;
  D.18053 = (sizetype) i;
  D.18054 = D.18052 + D.18053;
  *D.18054 = 1;
  i = i + 1;
  <D.17892>:
  D.18061 = start_index + num_chunks;
  if (D.18061 > i) goto <D.17891>; else goto <D.17893>;
  <D.17893>:
  add_free_chunk (obj, size);
}


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

  D.18062 = size >> 12;
  num_chunks = (int) D.18062;
  free_chunks->size = size;
  if (num_chunks > 31) goto <D.18063>; else goto <D.18064>;
  <D.18063>:
  num_chunks = 0;
  <D.18064>:
  D.18065 = los_fast_free_lists[num_chunks];
  free_chunks->next_size = D.18065;
  los_fast_free_lists[num_chunks] = free_chunks;
}


__attribute__((visibility ("hidden")))
sgen_los_alloc_large_inner (struct MonoVTable * vtable, size_t size)
{
  _Bool D.18066;
  long int D.18067;
  long int D.18068;
  long unsigned int D.18071;
  _Bool D.18072;
  long int D.18073;
  long int D.18074;
  int pagesize.7;
  int D.18082;
  int D.18083;
  long unsigned int D.18084;
  int D.18085;
  long unsigned int D.18086;
  int D.18087;
  long unsigned int D.18091;
  void * D.18096;
  char[0:] * D.18097;
  long unsigned int D.18098;
  long unsigned int D.18099;
  _Bool D.18100;
  long int D.18101;
  long int D.18102;
  long unsigned int D.18105;
  struct LOSObject * los_object_list.8;
  long unsigned int los_memory_usage.9;
  long unsigned int D.18108;
  long unsigned int los_num_objects.10;
  long unsigned int D.18110;
  struct FILE * gc_debug_file.11;
  struct MonoClass * D.18114;
  const char * D.18115;
  struct LOSObject * obj;
  void * * vtslot;

  obj = 0B;
  D.18066 = size <= 8000;
  D.18067 = (long int) D.18066;
  D.18068 = __builtin_expect (D.18067, 0);
  if (D.18068 != 0) goto <D.18069>; else goto <D.18070>;
  <D.18069>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 334, "size > SGEN_MAX_SMALL_OBJ_SIZE");
  <D.18070>:
  D.18071 = size & 1;
  D.18072 = D.18071 != 0;
  D.18073 = (long int) D.18072;
  D.18074 = __builtin_expect (D.18073, 0);
  if (D.18074 != 0) goto <D.18075>; else goto <D.18076>;
  <D.18075>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 335, "(size & 1) == 0");
  <D.18076>:
  sgen_ensure_free_space (size);
  if (size > 1044456) goto <D.18077>; else goto <D.18078>;
  <D.18077>:
  {
    size_t alloc_size;

    alloc_size = size;
    pagesize.7 = pagesize;
    if (pagesize.7 == 0) goto <D.18080>; else goto <D.18081>;
    <D.18080>:
    D.18082 = mono_pagesize ();
    pagesize = D.18082;
    <D.18081>:
    alloc_size = alloc_size + 24;
    pagesize.7 = pagesize;
    D.18083 = pagesize.7 + -1;
    D.18084 = (long unsigned int) D.18083;
    alloc_size = D.18084 + alloc_size;
    pagesize.7 = pagesize;
    D.18085 = -pagesize.7;
    D.18086 = (long unsigned int) D.18085;
    alloc_size = D.18086 & alloc_size;
    D.18087 = sgen_memgov_try_alloc_space (alloc_size, 2);
    if (D.18087 != 0) goto <D.18088>; else goto <D.18089>;
    <D.18088>:
    obj = sgen_alloc_os_memory (alloc_size, 3, 0B);
    <D.18089>:
  }
  goto <D.18090>;
  <D.18078>:
  D.18091 = size + 24;
  obj = get_los_section_memory (D.18091);
  if (obj != 0B) goto <D.18092>; else goto <D.18093>;
  <D.18092>:
  D.18091 = size + 24;
  memset (obj, 0, D.18091);
  <D.18093>:
  <D.18090>:
  if (obj == 0B) goto <D.18094>; else goto <D.18095>;
  <D.18094>:
  D.18096 = 0B;
  return D.18096;
  <D.18095>:
  D.18097 = &obj->data;
  D.18098 = (long unsigned int) D.18097;
  D.18099 = D.18098 & 7;
  D.18100 = D.18099 != 0;
  D.18101 = (long int) D.18100;
  D.18102 = __builtin_expect (D.18101, 0);
  if (D.18102 != 0) goto <D.18103>; else goto <D.18104>;
  <D.18103>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 371, "!((mword)obj->data & (SGEN_ALLOC_ALIGN - 1))");
  <D.18104>:
  obj->size = size;
  vtslot = &obj->data;
  *vtslot = vtable;
  D.18097 = &obj->data;
  D.18098 = (long unsigned int) D.18097;
  D.18097 = &obj->data;
  D.18098 = (long unsigned int) D.18097;
  D.18105 = D.18098 + size;
  sgen_update_heap_boundaries (D.18098, D.18105);
  los_object_list.8 = los_object_list;
  obj->next = los_object_list.8;
  los_object_list = obj;
  los_memory_usage.9 = los_memory_usage;
  D.18108 = los_memory_usage.9 + size;
  los_memory_usage = D.18108;
  los_num_objects.10 = los_num_objects;
  D.18110 = los_num_objects.10 + 1;
  los_num_objects = D.18110;
  if (0 != 0) goto <D.18111>; else goto <D.18112>;
  <D.18111>:
  gc_debug_file.11 = gc_debug_file;
  D.18097 = &obj->data;
  D.18114 = vtable->klass;
  D.18115 = D.18114->name;
  fprintf (gc_debug_file.11, "Allocated large object %p, vtable: %p (%s), size: %zd\n", D.18097, vtable, D.18115, size);
  gc_debug_file.11 = gc_debug_file;
  fflush (gc_debug_file.11);
  <D.18112>:
  D.18096 = &obj->data;
  return D.18096;
}


get_los_section_memory (size_t size)
{
  long unsigned int D.18117;
  long unsigned int D.18118;
  _Bool D.18119;
  long int D.18120;
  long int D.18121;
  _Bool D.18124;
  long int D.18125;
  long int D.18126;
  struct LOSFreeChunks * * D.18132;
  struct LOSObject * D.18138;
  int D.18139;
  struct LOSFreeChunks * D.18144;
  unsigned char * D.18145;
  unsigned char * D.18148;
  unsigned char * D.18149;
  struct LOSSection * los_sections.12;
  int los_num_sections.13;
  int D.18152;
  struct LOSSection * section;
  struct LOSFreeChunks * free_chunks;
  int num_chunks;
  void retry = <<< error >>>;

  size = size + 4095;
  size = size & 18446744073709547520;
  D.18117 = size >> 12;
  num_chunks = (int) D.18117;
  D.18118 = size + 18446744073709551592;
  D.18119 = D.18118 > 1044456;
  D.18120 = (long int) D.18119;
  D.18121 = __builtin_expect (D.18120, 0);
  if (D.18121 != 0) goto <D.18122>; else goto <D.18123>;
  <D.18122>:
  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.18123>:
  D.18124 = num_chunks <= 0;
  D.18125 = (long int) D.18124;
  D.18126 = __builtin_expect (D.18125, 0);
  if (D.18126 != 0) goto <D.18127>; else goto <D.18128>;
  <D.18127>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 209, "num_chunks > 0");
  <D.18128>:
  retry:
  if (num_chunks > 31) goto <D.18129>; else goto <D.18130>;
  <D.18129>:
  free_chunks = get_from_size_list (&los_fast_free_lists[0], size);
  goto <D.18131>;
  <D.18130>:
  {
    int i;

    i = num_chunks;
    goto <D.17882>;
    <D.17881>:
    D.18132 = &los_fast_free_lists[i];
    free_chunks = get_from_size_list (D.18132, size);
    if (free_chunks != 0B) goto <D.17880>; else goto <D.18133>;
    <D.18133>:
    i = i + 1;
    <D.17882>:
    if (i <= 31) goto <D.17881>; else goto <D.17880>;
    <D.17880>:
    if (free_chunks == 0B) goto <D.18134>; else goto <D.18135>;
    <D.18134>:
    free_chunks = get_from_size_list (&los_fast_free_lists[0], size);
    <D.18135>:
  }
  <D.18131>:
  if (free_chunks != 0B) goto <D.18136>; else goto <D.18137>;
  <D.18136>:
  D.18138 = free_chunks;
  return D.18138;
  <D.18137>:
  D.18139 = sgen_memgov_try_alloc_space (1048576, 2);
  if (D.18139 == 0) goto <D.18140>; else goto <D.18141>;
  <D.18140>:
  D.18138 = 0B;
  return D.18138;
  <D.18141>:
  section = sgen_alloc_os_memory_aligned (1048576, 1048576, 3, 0B);
  if (section == 0B) goto <D.18142>; else goto <D.18143>;
  <D.18142>:
  D.18138 = 0B;
  return D.18138;
  <D.18143>:
  free_chunks = section + 4096;
  free_chunks->size = 1044480;
  D.18144 = los_fast_free_lists[0];
  free_chunks->next_size = D.18144;
  los_fast_free_lists[0] = free_chunks;
  section->num_free_chunks = 255;
  D.18145 = section + 24;
  section->free_chunk_map = D.18145;
  if (0 != 0) goto <D.18146>; else goto <D.18147>;
  <D.18146>:
  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.18147>:
  D.18148 = section->free_chunk_map;
  *D.18148 = 0;
  D.18148 = section->free_chunk_map;
  D.18149 = D.18148 + 1;
  memset (D.18149, 1, 255);
  los_sections.12 = los_sections;
  section->next = los_sections.12;
  los_sections = section;
  los_num_sections.13 = los_num_sections;
  D.18152 = los_num_sections.13 + 1;
  los_num_sections = D.18152;
  goto retry;
}


get_from_size_list (struct LOSFreeChunks * * list, size_t size)
{
  long unsigned int D.18154;
  _Bool D.18155;
  long int D.18156;
  long int D.18157;
  long unsigned int D.18160;
  struct LOSFreeChunks * D.18162;
  struct LOSFreeChunks * D.18165;
  struct LOSFreeChunks * D.18166;
  struct LOSFreeChunks * D.18169;
  long unsigned int D.18170;
  long unsigned int D.18171;
  long unsigned int free_chunks.14;
  long unsigned int D.18173;
  long int free_chunks.15;
  long int section.16;
  long int D.18176;
  long int D.18177;
  unsigned char * D.18178;
  sizetype D.18179;
  unsigned char * D.18180;
  unsigned char D.18181;
  _Bool D.18182;
  long int D.18183;
  long int D.18184;
  int D.18187;
  int D.18188;
  unsigned int D.18189;
  unsigned int D.18190;
  unsigned int D.18191;
  int D.18192;
  _Bool D.18193;
  long int D.18194;
  long int D.18195;
  struct LOSFreeChunks * free_chunks;
  struct LOSSection * section;
  int num_chunks;
  int i;
  int start_index;

  free_chunks = 0B;
  D.18154 = size & 4095;
  D.18155 = D.18154 != 0;
  D.18156 = (long int) D.18155;
  D.18157 = __builtin_expect (D.18156, 0);
  if (D.18157 != 0) goto <D.18158>; else goto <D.18159>;
  <D.18158>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 163, "(size & (LOS_CHUNK_SIZE - 1)) == 0");
  <D.18159>:
  goto <D.17868>;
  <D.17867>:
  free_chunks = *list;
  D.18160 = free_chunks->size;
  if (D.18160 >= size) goto <D.17866>; else goto <D.18161>;
  <D.18161>:
  D.18162 = *list;
  list = &D.18162->next_size;
  <D.17868>:
  D.18162 = *list;
  if (D.18162 != 0B) goto <D.17867>; else goto <D.17866>;
  <D.17866>:
  D.18162 = *list;
  if (D.18162 == 0B) goto <D.18163>; else goto <D.18164>;
  <D.18163>:
  D.18165 = 0B;
  return D.18165;
  <D.18164>:
  D.18166 = free_chunks->next_size;
  *list = D.18166;
  D.18160 = free_chunks->size;
  if (D.18160 > size) goto <D.18167>; else goto <D.18168>;
  <D.18167>:
  D.18169 = free_chunks + size;
  D.18160 = free_chunks->size;
  D.18170 = D.18160 - size;
  add_free_chunk (D.18169, D.18170);
  <D.18168>:
  D.18171 = size >> 12;
  num_chunks = (int) D.18171;
  free_chunks.14 = (long unsigned int) free_chunks;
  D.18173 = free_chunks.14 & 18446744073708503040;
  section = (struct LOSSection *) D.18173;
  free_chunks.15 = (long int) free_chunks;
  section.16 = (long int) section;
  D.18176 = free_chunks.15 - section.16;
  D.18177 = D.18176 >> 12;
  start_index = (int) D.18177;
  i = start_index;
  goto <D.17870>;
  <D.17869>:
  D.18178 = section->free_chunk_map;
  D.18179 = (sizetype) i;
  D.18180 = D.18178 + D.18179;
  D.18181 = *D.18180;
  D.18182 = D.18181 == 0;
  D.18183 = (long int) D.18182;
  D.18184 = __builtin_expect (D.18183, 0);
  if (D.18184 != 0) goto <D.18185>; else goto <D.18186>;
  <D.18185>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 186, "section->free_chunk_map [i]");
  <D.18186>:
  D.18178 = section->free_chunk_map;
  D.18179 = (sizetype) i;
  D.18180 = D.18178 + D.18179;
  *D.18180 = 0;
  i = i + 1;
  <D.17870>:
  D.18187 = start_index + num_chunks;
  if (D.18187 > i) goto <D.17869>; else goto <D.17871>;
  <D.17871>:
  D.18188 = section->num_free_chunks;
  D.18189 = (unsigned int) D.18188;
  D.18171 = size >> 12;
  D.18190 = (unsigned int) D.18171;
  D.18191 = D.18189 - D.18190;
  D.18192 = (int) D.18191;
  section->num_free_chunks = D.18192;
  D.18188 = section->num_free_chunks;
  D.18193 = D.18188 < 0;
  D.18194 = (long int) D.18193;
  D.18195 = __builtin_expect (D.18194, 0);
  if (D.18195 != 0) goto <D.18196>; else goto <D.18197>;
  <D.18196>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 191, "section->num_free_chunks >= 0");
  <D.18197>:
  D.18165 = free_chunks;
  return D.18165;
}


__attribute__((__artificial__, __gnu_inline__, __always_inline__, __nothrow__, __leaf__))
memset (void * __dest, int __ch, size_t __len)
{
  void * D.18199;
  long unsigned int D.18200;

  D.18200 = __builtin_object_size (__dest, 0);
  D.18199 = __builtin___memset_chk (__dest, __ch, __len, D.18200);
  return D.18199;
}


__attribute__((visibility ("hidden")))
sgen_los_sweep ()
{
  int D.18202;
  int los_num_sections.17;
  int D.18209;
  unsigned char * D.18210;
  sizetype D.18211;
  unsigned char * D.18212;
  unsigned char D.18213;
  sizetype D.18217;
  unsigned char * D.18218;
  unsigned char D.18219;
  int D.18220;
  sizetype D.18221;
  struct LOSFreeChunks * D.18222;
  int D.18223;
  int D.18224;
  long unsigned int D.18225;
  _Bool D.18226;
  long int D.18227;
  long int D.18228;
  struct LOSSection * section;
  struct LOSSection * prev;
  int i;
  int num_sections;

  num_sections = 0;
  i = 0;
  goto <D.17914>;
  <D.17913>:
  los_fast_free_lists[i] = 0B;
  i = i + 1;
  <D.17914>:
  if (i <= 31) goto <D.17913>; else goto <D.17915>;
  <D.17915>:
  prev = 0B;
  section = los_sections;
  goto <D.17917>;
  <D.17925>:
  D.18202 = section->num_free_chunks;
  if (D.18202 == 255) goto <D.18203>; else goto <D.18204>;
  <D.18203>:
  {
    struct LOSSection * next;

    next = section->next;
    if (prev != 0B) goto <D.18205>; else goto <D.18206>;
    <D.18205>:
    prev->next = next;
    goto <D.18207>;
    <D.18206>:
    los_sections = next;
    <D.18207>:
    sgen_free_os_memory (section, 1048576, 1);
    sgen_memgov_release_space (1048576, 2);
    section = next;
    los_num_sections.17 = los_num_sections;
    D.18209 = los_num_sections.17 + -1;
    los_num_sections = D.18209;
    // predicted unlikely by continue predictor.
    goto <D.17917>;
  }
  <D.18204>:
  i = 0;
  goto <D.17923>;
  <D.17922>:
  D.18210 = section->free_chunk_map;
  D.18211 = (sizetype) i;
  D.18212 = D.18210 + D.18211;
  D.18213 = *D.18212;
  if (D.18213 != 0) goto <D.18214>; else goto <D.18215>;
  <D.18214>:
  {
    int j;

    j = i + 1;
    goto <D.17920>;
    <D.17919>:
    j = j + 1;
    <D.17920>:
    if (j <= 255) goto <D.18216>; else goto <D.17921>;
    <D.18216>:
    D.18210 = section->free_chunk_map;
    D.18217 = (sizetype) j;
    D.18218 = D.18210 + D.18217;
    D.18219 = *D.18218;
    if (D.18219 != 0) goto <D.17919>; else goto <D.17921>;
    <D.17921>:
    D.18220 = i << 12;
    D.18221 = (sizetype) D.18220;
    D.18222 = section + D.18221;
    D.18223 = j - i;
    D.18224 = D.18223 << 12;
    D.18225 = (long unsigned int) D.18224;
    add_free_chunk (D.18222, D.18225);
    i = j + -1;
  }
  <D.18215>:
  i = i + 1;
  <D.17923>:
  if (i <= 255) goto <D.17922>; else goto <D.17924>;
  <D.17924>:
  prev = section;
  section = section->next;
  num_sections = num_sections + 1;
  <D.17917>:
  if (section != 0B) goto <D.17925>; else goto <D.17926>;
  <D.17926>:
  los_num_sections.17 = los_num_sections;
  D.18226 = los_num_sections.17 != num_sections;
  D.18227 = (long int) D.18226;
  D.18228 = __builtin_expect (D.18227, 0);
  if (D.18228 != 0) goto <D.18229>; else goto <D.18230>;
  <D.18229>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 447, "los_num_sections == num_sections");
  <D.18230>:
}


__attribute__((visibility ("hidden")))
sgen_ptr_is_in_los (char * ptr, char * * start)
{
  char[0:] * D.18231;
  long unsigned int D.18232;
  gboolean D.18237;
  struct LOSObject * obj;

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

    D.18231 = &obj->data;
    D.18232 = obj->size;
    end = D.18231 + D.18232;
    D.18231 = &obj->data;
    if (D.18231 <= ptr) goto <D.18233>; else goto <D.18234>;
    <D.18233>:
    if (ptr < end) goto <D.18235>; else goto <D.18236>;
    <D.18235>:
    D.18231 = &obj->data;
    *start = D.18231;
    D.18237 = 1;
    return D.18237;
    <D.18236>:
    <D.18234>:
  }
  obj = obj->next;
  <D.17934>:
  if (obj != 0B) goto <D.17933>; else goto <D.17935>;
  <D.17935>:
  D.18237 = 0;
  return D.18237;
}


__attribute__((visibility ("hidden")))
sgen_los_iterate_objects (void (*IterateObjectCallbackFunc) (char *, size_t, void *) cb, void * user_data)
{
  char[0:] * D.18239;
  long unsigned int D.18240;
  struct LOSObject * obj;

  obj = los_object_list;
  goto <D.17942>;
  <D.17941>:
  D.18239 = &obj->data;
  D.18240 = obj->size;
  cb (D.18239, D.18240, user_data);
  obj = obj->next;
  <D.17942>:
  if (obj != 0B) goto <D.17941>; else goto <D.17943>;
  <D.17943>:
}


__attribute__((visibility ("hidden")))
sgen_los_is_valid_object (char * object)
{
  char[0:] * D.18241;
  gboolean D.18244;
  struct LOSObject * obj;

  obj = los_object_list;
  goto <D.17949>;
  <D.17948>:
  D.18241 = &obj->data;
  if (D.18241 == object) goto <D.18242>; else goto <D.18243>;
  <D.18242>:
  D.18244 = 1;
  return D.18244;
  <D.18243>:
  obj = obj->next;
  <D.17949>:
  if (obj != 0B) goto <D.17948>; else goto <D.17950>;
  <D.17950>:
  D.18244 = 0;
  return D.18244;
}


__attribute__((visibility ("hidden")))
mono_sgen_los_describe_pointer (char * ptr)
{
  char[0:] * D.18248;
  long unsigned int D.18250;
  char * D.18251;
  long unsigned int D.18255;
  long unsigned int D.18256;
  int gc_debug_level.18;
  _Bool D.18260;
  long int D.18261;
  long int D.18262;
  struct FILE * gc_debug_file.19;
  int D.18266;
  _Bool D.18267;
  int D.18268;
  long int ptr.20;
  long int D.18273;
  long int D.18274;
  gboolean D.18275;
  struct LOSObject * obj;

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

    D.18248 = &obj->data;
    if (D.18248 > ptr) goto <D.18246>; else goto <D.18249>;
    <D.18249>:
    D.18248 = &obj->data;
    D.18250 = obj->size;
    D.18251 = D.18248 + D.18250;
    if (D.18251 <= ptr) goto <D.18246>; else goto <D.18247>;
    <D.18246>:
    // predicted unlikely by continue predictor.
    goto <D.17959>;
    <D.18247>:
    size = sgen_los_object_size (obj);
    D.18248 = &obj->data;
    pinned = sgen_los_object_is_pinned (D.18248);
    if (size > 1044456) goto <D.18252>; else goto <D.18253>;
    <D.18252>:
    los_kind = "huge-los-ptr";
    goto <D.18254>;
    <D.18253>:
    los_kind = "los-ptr";
    <D.18254>:
    D.18248 = &obj->data;
    D.18255 = MEM[(mword *)D.18248];
    D.18256 = D.18255 & 18446744073709551612;
    vtable = (struct MonoVTable *) D.18256;
    D.18248 = &obj->data;
    if (D.18248 == ptr) goto <D.18257>; else goto <D.18258>;
    <D.18257>:
    gc_debug_level.18 = gc_debug_level;
    D.18260 = gc_debug_level.18 >= 0;
    D.18261 = (long int) D.18260;
    D.18262 = __builtin_expect (D.18261, 0);
    if (D.18262 != 0) goto <D.18263>; else goto <D.18264>;
    <D.18263>:
    gc_debug_file.19 = gc_debug_file;
    D.18266 = (int) size;
    D.18267 = pinned != 0;
    D.18268 = (int) D.18267;
    fprintf (gc_debug_file.19, "%s (size %d pin %d)\n\n", los_kind, D.18266, D.18268);
    gc_debug_file.19 = gc_debug_file;
    fflush (gc_debug_file.19);
    <D.18264>:
    goto <D.18269>;
    <D.18258>:
    gc_debug_level.18 = gc_debug_level;
    D.18260 = gc_debug_level.18 >= 0;
    D.18261 = (long int) D.18260;
    D.18262 = __builtin_expect (D.18261, 0);
    if (D.18262 != 0) goto <D.18270>; else goto <D.18271>;
    <D.18270>:
    gc_debug_file.19 = gc_debug_file;
    ptr.20 = (long int) ptr;
    D.18248 = &obj->data;
    D.18273 = (long int) D.18248;
    D.18274 = ptr.20 - D.18273;
    D.18266 = (int) size;
    D.18267 = pinned != 0;
    D.18268 = (int) D.18267;
    fprintf (gc_debug_file.19, "%s (interior-ptr offset %td size %d pin %d)\n", los_kind, D.18274, D.18266, D.18268);
    gc_debug_file.19 = gc_debug_file;
    fflush (gc_debug_file.19);
    <D.18271>:
    <D.18269>:
    D.18275 = 1;
    return D.18275;
  }
  <D.17959>:
  obj = obj->next;
  <D.17961>:
  if (obj != 0B) goto <D.17960>; else goto <D.17962>;
  <D.17962>:
  D.18275 = 0;
  return D.18275;
}


__attribute__((__artificial__, __gnu_inline__, __always_inline__))
fprintf (struct FILE * restrict __stream, const char * restrict __fmt)
{
  int D.18277;

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


__attribute__((visibility ("hidden")))
sgen_los_iterate_live_block_ranges (void (*sgen_cardtable_block_callback) (mword, mword) callback)
{
  char[0:] * D.18279;
  long unsigned int D.18280;
  long unsigned int D.18281;
  void * D.18282;
  long unsigned int D.18283;
  int D.18284;
  long unsigned int D.18287;
  long unsigned int D.18288;
  struct LOSObject * obj;

  obj = los_object_list;
  goto <D.17969>;
  <D.17968>:
  {
    struct MonoVTable * vt;

    D.18279 = &obj->data;
    D.18280 = MEM[(mword *)D.18279];
    D.18281 = D.18280 & 18446744073709551612;
    vt = (struct MonoVTable *) D.18281;
    D.18282 = vt->gc_descr;
    D.18283 = (long unsigned int) D.18282;
    D.18284 = sgen_gc_descr_has_references (D.18283);
    if (D.18284 != 0) goto <D.18285>; else goto <D.18286>;
    <D.18285>:
    D.18279 = &obj->data;
    D.18287 = (long unsigned int) D.18279;
    D.18288 = obj->size;
    callback (D.18287, D.18288);
    <D.18286>:
  }
  obj = obj->next;
  <D.17969>:
  if (obj != 0B) goto <D.17968>; else goto <D.17970>;
  <D.17970>:
}


sgen_gc_descr_has_references (mword desc)
{
  long unsigned int D.18289;
  gboolean D.18292;
  long unsigned int D.18293;
  long unsigned int D.18296;

  D.18289 = desc & 4294901767;
  if (D.18289 == 1) goto <D.18290>; else goto <D.18291>;
  <D.18290>:
  D.18292 = 0;
  return D.18292;
  <D.18291>:
  D.18293 = desc & 49159;
  if (D.18293 == 4) goto <D.18294>; else goto <D.18295>;
  <D.18294>:
  D.18292 = 0;
  return D.18292;
  <D.18295>:
  D.18296 = desc & 7;
  if (D.18296 == 7) goto <D.18297>; else goto <D.18298>;
  <D.18297>:
  D.18292 = 0;
  return D.18292;
  <D.18298>:
  D.18292 = 1;
  return D.18292;
}


__attribute__((visibility ("hidden")))
sgen_los_scan_card_table (gboolean mod_union, struct SgenGrayQueue * queue)
{
  _Bool D.18302;
  long int D.18303;
  long int D.18304;
  char[0:] * D.18307;
  long unsigned int D.18308;
  struct LOSObject * obj;

  obj = los_object_list;
  goto <D.17978>;
  <D.17977>:
  {
    guint8 * cards;

    cards = 0B;
    if (mod_union != 0) goto <D.18300>; else goto <D.18301>;
    <D.18300>:
    cards = obj->cardtable_mod_union;
    D.18302 = cards == 0B;
    D.18303 = (long int) D.18302;
    D.18304 = __builtin_expect (D.18303, 0);
    if (D.18304 != 0) goto <D.18305>; else goto <D.18306>;
    <D.18305>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 544, "cards");
    <D.18306>:
    <D.18301>:
    D.18307 = &obj->data;
    D.18308 = obj->size;
    sgen_cardtable_scan_object (D.18307, D.18308, cards, mod_union, queue);
  }
  obj = obj->next;
  <D.17978>:
  if (obj != 0B) goto <D.17977>; else goto <D.17979>;
  <D.17979>:
}


__attribute__((visibility ("hidden")))
sgen_los_update_cardtable_mod_union ()
{
  guint8 * D.18309;
  char[0:] * D.18310;
  long unsigned int D.18311;
  guint8 * D.18312;
  struct LOSObject * obj;

  obj = los_object_list;
  goto <D.17985>;
  <D.17984>:
  D.18309 = obj->cardtable_mod_union;
  D.18310 = &obj->data;
  D.18311 = obj->size;
  D.18312 = sgen_card_table_update_mod_union (D.18309, D.18310, D.18311, 0B);
  obj->cardtable_mod_union = D.18312;
  obj = obj->next;
  <D.17985>:
  if (obj != 0B) goto <D.17984>; else goto <D.17986>;
  <D.17986>:
}


__attribute__((visibility ("hidden")))
sgen_los_object_size (struct LOSObject * obj)
{
  mword D.18313;
  long unsigned int D.18314;

  D.18314 = obj->size;
  D.18313 = D.18314 & 18446744073709551614;
  return D.18313;
}


__attribute__((visibility ("hidden")))
sgen_los_header_for_object (char * data)
{
  struct LOSObject * D.18316;

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


__attribute__((visibility ("hidden")))
sgen_los_pin_object (char * data)
{
  long unsigned int D.18318;
  long unsigned int D.18319;
  struct LOSObject * obj;

  obj = sgen_los_header_for_object (data);
  D.18318 = obj->size;
  D.18319 = D.18318 | 1;
  obj->size = D.18319;
}


__attribute__((visibility ("hidden")))
sgen_los_unpin_object (char * data)
{
  long unsigned int D.18320;
  struct LOSObject * obj;

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


__attribute__((visibility ("hidden")))
sgen_los_object_is_pinned (char * data)
{
  gboolean D.18321;
  long unsigned int D.18322;
  int D.18323;
  struct LOSObject * obj;

  obj = sgen_los_header_for_object (data);
  D.18322 = obj->size;
  D.18323 = (int) D.18322;
  D.18321 = D.18323 & 1;
  return D.18321;
}


