sgen_los_free_object (struct LOSObject * obj)
{
  struct FILE * gc_debug_file.0;
  char[0:] * D.18395;
  long unsigned int D.18396;
  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.18407;
  long unsigned int D.18408;
  int D.18409;
  long unsigned int D.18410;
  long unsigned int D.18412;
  size_t size;

  size = obj->size;
  if (0 != 0) goto <D.18392>; else goto <D.18393>;
  <D.18392>:
  gc_debug_file.0 = gc_debug_file;
  D.18395 = &obj->data;
  D.18396 = obj->size;
  fprintf (gc_debug_file.0, "Freed large object %p, size %lu\n", D.18395, D.18396);
  gc_debug_file.0 = gc_debug_file;
  fflush (gc_debug_file.0);
  <D.18393>:
  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.18401>; else goto <D.18402>;
  <D.18401>:
  pagesize.5 = pagesize;
  if (pagesize.5 == 0) goto <D.18404>; else goto <D.18405>;
  <D.18404>:
  pagesize.6 = mono_pagesize ();
  pagesize = pagesize.6;
  <D.18405>:
  size = size + 24;
  pagesize.5 = pagesize;
  D.18407 = pagesize.5 + -1;
  D.18408 = (long unsigned int) D.18407;
  size = D.18408 + size;
  pagesize.5 = pagesize;
  D.18409 = -pagesize.5;
  D.18410 = (long unsigned int) D.18409;
  size = D.18410 & size;
  sgen_free_os_memory (obj, size, 1);
  sgen_memgov_release_space (size, 2);
  goto <D.18411>;
  <D.18402>:
  D.18412 = size + 24;
  free_los_section_memory (obj, D.18412);
  <D.18411>:
}


free_los_section_memory (struct LOSObject * obj, size_t size)
{
  long unsigned int obj.7;
  long unsigned int D.18414;
  long unsigned int D.18415;
  long unsigned int D.18416;
  _Bool D.18417;
  long int D.18418;
  long int D.18419;
  _Bool D.18422;
  long int D.18423;
  long int D.18424;
  int D.18427;
  int D.18428;
  _Bool D.18429;
  long int D.18430;
  long int D.18431;
  long int obj.8;
  long int section.9;
  long int D.18436;
  long int D.18437;
  unsigned char * D.18438;
  sizetype D.18439;
  unsigned char * D.18440;
  unsigned char D.18441;
  _Bool D.18442;
  long int D.18443;
  long int D.18444;
  int D.18447;
  struct LOSSection * section;
  int num_chunks;
  int i;
  int start_index;

  obj.7 = (long unsigned int) obj;
  D.18414 = obj.7 & 18446744073708503040;
  section = (struct LOSSection *) D.18414;
  size = size + 4095;
  size = size & 18446744073709547520;
  D.18415 = size >> 12;
  num_chunks = (int) D.18415;
  D.18416 = size + 18446744073709551592;
  D.18417 = D.18416 > 1044456;
  D.18418 = (long int) D.18417;
  D.18419 = __builtin_expect (D.18418, 0);
  if (D.18419 != 0) goto <D.18420>; else goto <D.18421>;
  <D.18420>:
  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.18421>:
  D.18422 = num_chunks <= 0;
  D.18423 = (long int) D.18422;
  D.18424 = __builtin_expect (D.18423, 0);
  if (D.18424 != 0) goto <D.18425>; else goto <D.18426>;
  <D.18425>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 268, "num_chunks > 0");
  <D.18426>:
  D.18427 = section->num_free_chunks;
  D.18428 = D.18427 + num_chunks;
  section->num_free_chunks = D.18428;
  D.18427 = section->num_free_chunks;
  D.18429 = D.18427 > 255;
  D.18430 = (long int) D.18429;
  D.18431 = __builtin_expect (D.18430, 0);
  if (D.18431 != 0) goto <D.18432>; else goto <D.18433>;
  <D.18432>:
  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.18433>:
  obj.8 = (long int) obj;
  section.9 = (long int) section;
  D.18436 = obj.8 - section.9;
  D.18437 = D.18436 >> 12;
  start_index = (int) D.18437;
  i = start_index;
  goto <D.18278>;
  <D.18277>:
  D.18438 = section->free_chunk_map;
  D.18439 = (sizetype) i;
  D.18440 = D.18438 + D.18439;
  D.18441 = *D.18440;
  D.18442 = D.18441 != 0;
  D.18443 = (long int) D.18442;
  D.18444 = __builtin_expect (D.18443, 0);
  if (D.18444 != 0) goto <D.18445>; else goto <D.18446>;
  <D.18445>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 281, "!section->free_chunk_map [i]");
  <D.18446>:
  D.18438 = section->free_chunk_map;
  D.18439 = (sizetype) i;
  D.18440 = D.18438 + D.18439;
  *D.18440 = 1;
  i = i + 1;
  <D.18278>:
  D.18447 = start_index + num_chunks;
  if (D.18447 > i) goto <D.18277>; else goto <D.18279>;
  <D.18279>:
  add_free_chunk (obj, size);
}


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

  D.18448 = size >> 12;
  num_chunks = (int) D.18448;
  free_chunks->size = size;
  if (num_chunks > 31) goto <D.18449>; else goto <D.18450>;
  <D.18449>:
  num_chunks = 0;
  <D.18450>:
  D.18451 = los_fast_free_lists[num_chunks];
  free_chunks->next_size = D.18451;
  los_fast_free_lists[num_chunks] = free_chunks;
}


sgen_los_alloc_large_inner (struct MonoVTable * vtable, size_t size)
{
  _Bool D.18452;
  long int D.18453;
  long int D.18454;
  long unsigned int D.18457;
  _Bool D.18458;
  long int D.18459;
  long int D.18460;
  int pagesize.10;
  int pagesize.11;
  int D.18469;
  long unsigned int D.18470;
  int D.18471;
  long unsigned int D.18472;
  int D.18473;
  long unsigned int D.18477;
  void * D.18482;
  char[0:] * D.18485;
  long unsigned int D.18486;
  long unsigned int D.18487;
  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 FILE * gc_debug_file.17;
  struct MonoClass * D.18496;
  const char * D.18497;
  struct LOSObject * obj;
  void * * vtslot;

  obj = 0B;
  D.18452 = size <= 8000;
  D.18453 = (long int) D.18452;
  D.18454 = __builtin_expect (D.18453, 0);
  if (D.18454 != 0) goto <D.18455>; else goto <D.18456>;
  <D.18455>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 334, "size > SGEN_MAX_SMALL_OBJ_SIZE");
  <D.18456>:
  D.18457 = size & 1;
  D.18458 = D.18457 != 0;
  D.18459 = (long int) D.18458;
  D.18460 = __builtin_expect (D.18459, 0);
  if (D.18460 != 0) goto <D.18461>; else goto <D.18462>;
  <D.18461>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 335, "(size & 1) == 0");
  <D.18462>:
  sgen_ensure_free_space (size);
  if (size > 1044456) goto <D.18463>; else goto <D.18464>;
  <D.18463>:
  {
    size_t alloc_size;

    alloc_size = size;
    pagesize.10 = pagesize;
    if (pagesize.10 == 0) goto <D.18466>; else goto <D.18467>;
    <D.18466>:
    pagesize.11 = mono_pagesize ();
    pagesize = pagesize.11;
    <D.18467>:
    alloc_size = alloc_size + 24;
    pagesize.10 = pagesize;
    D.18469 = pagesize.10 + -1;
    D.18470 = (long unsigned int) D.18469;
    alloc_size = D.18470 + alloc_size;
    pagesize.10 = pagesize;
    D.18471 = -pagesize.10;
    D.18472 = (long unsigned int) D.18471;
    alloc_size = D.18472 & alloc_size;
    D.18473 = sgen_memgov_try_alloc_space (alloc_size, 2);
    if (D.18473 != 0) goto <D.18474>; else goto <D.18475>;
    <D.18474>:
    obj = sgen_alloc_os_memory (alloc_size, 3, 0B);
    <D.18475>:
  }
  goto <D.18476>;
  <D.18464>:
  D.18477 = size + 24;
  obj = get_los_section_memory (D.18477);
  if (obj != 0B) goto <D.18478>; else goto <D.18479>;
  <D.18478>:
  D.18477 = size + 24;
  memset (obj, 0, D.18477);
  <D.18479>:
  <D.18476>:
  if (obj == 0B) goto <D.18480>; else goto <D.18481>;
  <D.18480>:
  D.18482 = 0B;
  return D.18482;
  <D.18481>:
  if (0 != 0) goto <D.18483>; else goto <D.18484>;
  <D.18483>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 371, "!((mword)obj->data & (SGEN_ALLOC_ALIGN - 1))");
  <D.18484>:
  obj->size = size;
  vtslot = &obj->data;
  *vtslot = vtable;
  D.18485 = &obj->data;
  D.18486 = (long unsigned int) D.18485;
  D.18485 = &obj->data;
  D.18486 = (long unsigned int) D.18485;
  D.18487 = D.18486 + size;
  sgen_update_heap_boundaries (D.18486, D.18487);
  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.18493>; else goto <D.18494>;
  <D.18493>:
  gc_debug_file.17 = gc_debug_file;
  D.18485 = &obj->data;
  D.18496 = vtable->klass;
  D.18497 = D.18496->name;
  fprintf (gc_debug_file.17, "Allocated large object %p, vtable: %p (%s), size: %zd\n", D.18485, vtable, D.18497, size);
  gc_debug_file.17 = gc_debug_file;
  fflush (gc_debug_file.17);
  <D.18494>:
  D.18482 = &obj->data;
  return D.18482;
}


get_los_section_memory (size_t size)
{
  long unsigned int D.18499;
  long unsigned int D.18500;
  _Bool D.18501;
  long int D.18502;
  long int D.18503;
  _Bool D.18506;
  long int D.18507;
  long int D.18508;
  struct LOSFreeChunks * * D.18514;
  struct LOSObject * D.18520;
  int D.18521;
  struct LOSFreeChunks * D.18526;
  unsigned char * D.18527;
  unsigned char * D.18530;
  void * D.18531;
  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.18499 = size >> 12;
  num_chunks = (int) D.18499;
  D.18500 = size + 18446744073709551592;
  D.18501 = D.18500 > 1044456;
  D.18502 = (long int) D.18501;
  D.18503 = __builtin_expect (D.18502, 0);
  if (D.18503 != 0) goto <D.18504>; else goto <D.18505>;
  <D.18504>:
  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.18505>:
  D.18506 = num_chunks <= 0;
  D.18507 = (long int) D.18506;
  D.18508 = __builtin_expect (D.18507, 0);
  if (D.18508 != 0) goto <D.18509>; else goto <D.18510>;
  <D.18509>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 209, "num_chunks > 0");
  <D.18510>:
  retry:
  if (num_chunks > 31) goto <D.18511>; else goto <D.18512>;
  <D.18511>:
  free_chunks = get_from_size_list (&los_fast_free_lists[0], size);
  goto <D.18513>;
  <D.18512>:
  {
    int i;

    i = num_chunks;
    goto <D.18268>;
    <D.18267>:
    D.18514 = &los_fast_free_lists[i];
    free_chunks = get_from_size_list (D.18514, size);
    if (free_chunks != 0B) goto <D.18266>; else goto <D.18515>;
    <D.18515>:
    i = i + 1;
    <D.18268>:
    if (i <= 31) goto <D.18267>; else goto <D.18266>;
    <D.18266>:
    if (free_chunks == 0B) goto <D.18516>; else goto <D.18517>;
    <D.18516>:
    free_chunks = get_from_size_list (&los_fast_free_lists[0], size);
    <D.18517>:
  }
  <D.18513>:
  if (free_chunks != 0B) goto <D.18518>; else goto <D.18519>;
  <D.18518>:
  D.18520 = free_chunks;
  return D.18520;
  <D.18519>:
  D.18521 = sgen_memgov_try_alloc_space (1048576, 2);
  if (D.18521 == 0) goto <D.18522>; else goto <D.18523>;
  <D.18522>:
  D.18520 = 0B;
  return D.18520;
  <D.18523>:
  section = sgen_alloc_os_memory_aligned (1048576, 1048576, 3, 0B);
  if (section == 0B) goto <D.18524>; else goto <D.18525>;
  <D.18524>:
  D.18520 = 0B;
  return D.18520;
  <D.18525>:
  free_chunks = section + 4096;
  free_chunks->size = 1044480;
  D.18526 = los_fast_free_lists[0];
  free_chunks->next_size = D.18526;
  los_fast_free_lists[0] = free_chunks;
  section->num_free_chunks = 255;
  D.18527 = section + 24;
  section->free_chunk_map = D.18527;
  if (0 != 0) goto <D.18528>; else goto <D.18529>;
  <D.18528>:
  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.18529>:
  D.18530 = section->free_chunk_map;
  *D.18530 = 0;
  D.18530 = section->free_chunk_map;
  D.18531 = D.18530 + 1;
  memset (D.18531, 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.18536;
  _Bool D.18537;
  long int D.18538;
  long int D.18539;
  long unsigned int D.18542;
  struct LOSFreeChunks * D.18544;
  struct LOSFreeChunks * D.18547;
  struct LOSFreeChunks * D.18548;
  struct LOSFreeChunks * D.18551;
  long unsigned int D.18552;
  long unsigned int D.18553;
  long unsigned int free_chunks.21;
  long unsigned int D.18555;
  long int free_chunks.22;
  long int section.23;
  long int D.18558;
  long int D.18559;
  unsigned char * D.18560;
  sizetype D.18561;
  unsigned char * D.18562;
  unsigned char D.18563;
  _Bool D.18564;
  long int D.18565;
  long int D.18566;
  int D.18569;
  int D.18570;
  unsigned int D.18571;
  unsigned int D.18572;
  unsigned int D.18573;
  int D.18574;
  _Bool D.18575;
  long int D.18576;
  long int D.18577;
  struct LOSFreeChunks * free_chunks;
  struct LOSSection * section;
  int num_chunks;
  int i;
  int start_index;

  free_chunks = 0B;
  D.18536 = size & 4095;
  D.18537 = D.18536 != 0;
  D.18538 = (long int) D.18537;
  D.18539 = __builtin_expect (D.18538, 0);
  if (D.18539 != 0) goto <D.18540>; else goto <D.18541>;
  <D.18540>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 163, "(size & (LOS_CHUNK_SIZE - 1)) == 0");
  <D.18541>:
  goto <D.18254>;
  <D.18253>:
  free_chunks = *list;
  D.18542 = free_chunks->size;
  if (D.18542 >= size) goto <D.18252>; else goto <D.18543>;
  <D.18543>:
  D.18544 = *list;
  list = &D.18544->next_size;
  <D.18254>:
  D.18544 = *list;
  if (D.18544 != 0B) goto <D.18253>; else goto <D.18252>;
  <D.18252>:
  D.18544 = *list;
  if (D.18544 == 0B) goto <D.18545>; else goto <D.18546>;
  <D.18545>:
  D.18547 = 0B;
  return D.18547;
  <D.18546>:
  D.18548 = free_chunks->next_size;
  *list = D.18548;
  D.18542 = free_chunks->size;
  if (D.18542 > size) goto <D.18549>; else goto <D.18550>;
  <D.18549>:
  D.18551 = free_chunks + size;
  D.18542 = free_chunks->size;
  D.18552 = D.18542 - size;
  add_free_chunk (D.18551, D.18552);
  <D.18550>:
  D.18553 = size >> 12;
  num_chunks = (int) D.18553;
  free_chunks.21 = (long unsigned int) free_chunks;
  D.18555 = free_chunks.21 & 18446744073708503040;
  section = (struct LOSSection *) D.18555;
  free_chunks.22 = (long int) free_chunks;
  section.23 = (long int) section;
  D.18558 = free_chunks.22 - section.23;
  D.18559 = D.18558 >> 12;
  start_index = (int) D.18559;
  i = start_index;
  goto <D.18256>;
  <D.18255>:
  D.18560 = section->free_chunk_map;
  D.18561 = (sizetype) i;
  D.18562 = D.18560 + D.18561;
  D.18563 = *D.18562;
  D.18564 = D.18563 == 0;
  D.18565 = (long int) D.18564;
  D.18566 = __builtin_expect (D.18565, 0);
  if (D.18566 != 0) goto <D.18567>; else goto <D.18568>;
  <D.18567>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 186, "section->free_chunk_map [i]");
  <D.18568>:
  D.18560 = section->free_chunk_map;
  D.18561 = (sizetype) i;
  D.18562 = D.18560 + D.18561;
  *D.18562 = 0;
  i = i + 1;
  <D.18256>:
  D.18569 = start_index + num_chunks;
  if (D.18569 > i) goto <D.18255>; else goto <D.18257>;
  <D.18257>:
  D.18570 = section->num_free_chunks;
  D.18571 = (unsigned int) D.18570;
  D.18553 = size >> 12;
  D.18572 = (unsigned int) D.18553;
  D.18573 = D.18571 - D.18572;
  D.18574 = (int) D.18573;
  section->num_free_chunks = D.18574;
  D.18570 = section->num_free_chunks;
  D.18575 = D.18570 < 0;
  D.18576 = (long int) D.18575;
  D.18577 = __builtin_expect (D.18576, 0);
  if (D.18577 != 0) goto <D.18578>; else goto <D.18579>;
  <D.18578>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 191, "section->num_free_chunks >= 0");
  <D.18579>:
  D.18547 = free_chunks;
  return D.18547;
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.18583;
  int D.18588;
  void * D.18590;
  long unsigned int D.18591;

  D.18583 = __builtin_constant_p (__len);
  if (D.18583 != 0) goto <D.18584>; else goto <D.18585>;
  <D.18584>:
  if (__len == 0) goto <D.18586>; else goto <D.18587>;
  <D.18586>:
  D.18588 = __builtin_constant_p (__ch);
  if (D.18588 == 0) goto <D.18581>; else goto <D.18589>;
  <D.18589>:
  if (__ch != 0) goto <D.18581>; else goto <D.18582>;
  <D.18581>:
  __warn_memset_zero_len ();
  D.18590 = __dest;
  return D.18590;
  <D.18582>:
  <D.18587>:
  <D.18585>:
  D.18591 = __builtin_object_size (__dest, 0);
  D.18590 = __builtin___memset_chk (__dest, __ch, __len, D.18591);
  return D.18590;
}


sgen_los_sweep ()
{
  int D.18593;
  int los_num_sections.24;
  int los_num_sections.25;
  unsigned char * D.18601;
  sizetype D.18602;
  unsigned char * D.18603;
  unsigned char D.18604;
  sizetype D.18608;
  unsigned char * D.18609;
  unsigned char D.18610;
  int D.18611;
  sizetype D.18612;
  struct LOSFreeChunks * D.18613;
  int D.18614;
  int D.18615;
  long unsigned int D.18616;
  _Bool D.18617;
  long int D.18618;
  long int D.18619;
  struct LOSSection * section;
  struct LOSSection * prev;
  int i;
  int num_sections;

  num_sections = 0;
  i = 0;
  goto <D.18300>;
  <D.18299>:
  los_fast_free_lists[i] = 0B;
  i = i + 1;
  <D.18300>:
  if (i <= 31) goto <D.18299>; else goto <D.18301>;
  <D.18301>:
  prev = 0B;
  section = los_sections;
  goto <D.18303>;
  <D.18311>:
  D.18593 = section->num_free_chunks;
  if (D.18593 == 255) goto <D.18594>; else goto <D.18595>;
  <D.18594>:
  {
    struct LOSSection * next;

    next = section->next;
    if (prev != 0B) goto <D.18596>; else goto <D.18597>;
    <D.18596>:
    prev->next = next;
    goto <D.18598>;
    <D.18597>:
    los_sections = next;
    <D.18598>:
    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.18303>;
  }
  <D.18595>:
  i = 0;
  goto <D.18309>;
  <D.18308>:
  D.18601 = section->free_chunk_map;
  D.18602 = (sizetype) i;
  D.18603 = D.18601 + D.18602;
  D.18604 = *D.18603;
  if (D.18604 != 0) goto <D.18605>; else goto <D.18606>;
  <D.18605>:
  {
    int j;

    j = i + 1;
    goto <D.18306>;
    <D.18305>:
    j = j + 1;
    <D.18306>:
    if (j <= 255) goto <D.18607>; else goto <D.18307>;
    <D.18607>:
    D.18601 = section->free_chunk_map;
    D.18608 = (sizetype) j;
    D.18609 = D.18601 + D.18608;
    D.18610 = *D.18609;
    if (D.18610 != 0) goto <D.18305>; else goto <D.18307>;
    <D.18307>:
    D.18611 = i << 12;
    D.18612 = (sizetype) D.18611;
    D.18613 = section + D.18612;
    D.18614 = j - i;
    D.18615 = D.18614 << 12;
    D.18616 = (long unsigned int) D.18615;
    add_free_chunk (D.18613, D.18616);
    i = j + -1;
  }
  <D.18606>:
  i = i + 1;
  <D.18309>:
  if (i <= 255) goto <D.18308>; else goto <D.18310>;
  <D.18310>:
  prev = section;
  section = section->next;
  num_sections = num_sections + 1;
  <D.18303>:
  if (section != 0B) goto <D.18311>; else goto <D.18312>;
  <D.18312>:
  los_num_sections.24 = los_num_sections;
  D.18617 = los_num_sections.24 != num_sections;
  D.18618 = (long int) D.18617;
  D.18619 = __builtin_expect (D.18618, 0);
  if (D.18619 != 0) goto <D.18620>; else goto <D.18621>;
  <D.18620>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 447, "los_num_sections == num_sections");
  <D.18621>:
}


sgen_ptr_is_in_los (char * ptr, char * * start)
{
  long unsigned int D.18622;
  char[0:] * D.18623;
  gboolean D.18628;
  struct LOSObject * obj;

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

    D.18622 = obj->size;
    end = &obj->data[D.18622];
    D.18623 = &obj->data;
    if (D.18623 <= ptr) goto <D.18624>; else goto <D.18625>;
    <D.18624>:
    if (ptr < end) goto <D.18626>; else goto <D.18627>;
    <D.18626>:
    D.18623 = &obj->data;
    *start = D.18623;
    D.18628 = 1;
    return D.18628;
    <D.18627>:
    <D.18625>:
  }
  obj = obj->next;
  <D.18320>:
  if (obj != 0B) goto <D.18319>; else goto <D.18321>;
  <D.18321>:
  D.18628 = 0;
  return D.18628;
}


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

  obj = los_object_list;
  goto <D.18328>;
  <D.18327>:
  D.18630 = &obj->data;
  D.18631 = obj->size;
  cb (D.18630, D.18631, user_data);
  obj = obj->next;
  <D.18328>:
  if (obj != 0B) goto <D.18327>; else goto <D.18329>;
  <D.18329>:
}


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

  obj = los_object_list;
  goto <D.18335>;
  <D.18334>:
  D.18632 = &obj->data;
  if (D.18632 == object) goto <D.18633>; else goto <D.18634>;
  <D.18633>:
  D.18635 = 1;
  return D.18635;
  <D.18634>:
  obj = obj->next;
  <D.18335>:
  if (obj != 0B) goto <D.18334>; else goto <D.18336>;
  <D.18336>:
  D.18635 = 0;
  return D.18635;
}


mono_sgen_los_describe_pointer (char * ptr)
{
  char[0:] * D.18639;
  long unsigned int D.18641;
  char * D.18642;
  long unsigned int D.18646;
  long unsigned int D.18647;
  int gc_debug_level.26;
  _Bool D.18651;
  long int D.18652;
  long int D.18653;
  struct FILE * gc_debug_file.27;
  int D.18657;
  _Bool D.18658;
  int D.18659;
  long int ptr.28;
  long int D.18664;
  long int D.18665;
  gboolean D.18666;
  struct LOSObject * obj;

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

    D.18639 = &obj->data;
    if (D.18639 > ptr) goto <D.18637>; else goto <D.18640>;
    <D.18640>:
    D.18641 = obj->size;
    D.18642 = &obj->data[D.18641];
    if (D.18642 <= ptr) goto <D.18637>; else goto <D.18638>;
    <D.18637>:
    // predicted unlikely by continue predictor.
    goto <D.18345>;
    <D.18638>:
    size = sgen_los_object_size (obj);
    D.18639 = &obj->data;
    pinned = sgen_los_object_is_pinned (D.18639);
    if (size > 1044456) goto <D.18643>; else goto <D.18644>;
    <D.18643>:
    los_kind = "huge-los-ptr";
    goto <D.18645>;
    <D.18644>:
    los_kind = "los-ptr";
    <D.18645>:
    D.18639 = &obj->data;
    D.18646 = MEM[(mword *)D.18639];
    D.18647 = D.18646 & 18446744073709551612;
    vtable = (struct MonoVTable *) D.18647;
    D.18639 = &obj->data;
    if (D.18639 == ptr) goto <D.18648>; else goto <D.18649>;
    <D.18648>:
    gc_debug_level.26 = gc_debug_level;
    D.18651 = gc_debug_level.26 >= 0;
    D.18652 = (long int) D.18651;
    D.18653 = __builtin_expect (D.18652, 0);
    if (D.18653 != 0) goto <D.18654>; else goto <D.18655>;
    <D.18654>:
    gc_debug_file.27 = gc_debug_file;
    D.18657 = (int) size;
    D.18658 = pinned != 0;
    D.18659 = (int) D.18658;
    fprintf (gc_debug_file.27, "%s (size %d pin %d)\n\n", los_kind, D.18657, D.18659);
    gc_debug_file.27 = gc_debug_file;
    fflush (gc_debug_file.27);
    <D.18655>:
    goto <D.18660>;
    <D.18649>:
    gc_debug_level.26 = gc_debug_level;
    D.18651 = gc_debug_level.26 >= 0;
    D.18652 = (long int) D.18651;
    D.18653 = __builtin_expect (D.18652, 0);
    if (D.18653 != 0) goto <D.18661>; else goto <D.18662>;
    <D.18661>:
    gc_debug_file.27 = gc_debug_file;
    ptr.28 = (long int) ptr;
    D.18639 = &obj->data;
    D.18664 = (long int) D.18639;
    D.18665 = ptr.28 - D.18664;
    D.18657 = (int) size;
    D.18658 = pinned != 0;
    D.18659 = (int) D.18658;
    fprintf (gc_debug_file.27, "%s (interior-ptr offset %td size %d pin %d)\n", los_kind, D.18665, D.18657, D.18659);
    gc_debug_file.27 = gc_debug_file;
    fflush (gc_debug_file.27);
    <D.18662>:
    <D.18660>:
    D.18666 = 1;
    return D.18666;
  }
  <D.18345>:
  obj = obj->next;
  <D.18347>:
  if (obj != 0B) goto <D.18346>; else goto <D.18348>;
  <D.18348>:
  D.18666 = 0;
  return D.18666;
}


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

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


sgen_los_iterate_live_block_ranges (void (*sgen_cardtable_block_callback) (mword, mword) callback)
{
  char[0:] * D.18670;
  long unsigned int D.18671;
  long unsigned int D.18672;
  void * D.18673;
  long unsigned int D.18674;
  int D.18675;
  long unsigned int D.18678;
  long unsigned int D.18679;
  struct LOSObject * obj;

  obj = los_object_list;
  goto <D.18355>;
  <D.18354>:
  {
    struct MonoVTable * vt;

    D.18670 = &obj->data;
    D.18671 = MEM[(mword *)D.18670];
    D.18672 = D.18671 & 18446744073709551612;
    vt = (struct MonoVTable *) D.18672;
    D.18673 = vt->gc_descr;
    D.18674 = (long unsigned int) D.18673;
    D.18675 = sgen_gc_descr_has_references (D.18674);
    if (D.18675 != 0) goto <D.18676>; else goto <D.18677>;
    <D.18676>:
    D.18670 = &obj->data;
    D.18678 = (long unsigned int) D.18670;
    D.18679 = obj->size;
    callback (D.18678, D.18679);
    <D.18677>:
  }
  obj = obj->next;
  <D.18355>:
  if (obj != 0B) goto <D.18354>; else goto <D.18356>;
  <D.18356>:
}


sgen_gc_descr_has_references (mword desc)
{
  long unsigned int D.18680;
  gboolean D.18683;
  long unsigned int D.18684;
  long unsigned int D.18687;

  D.18680 = desc & 4294901767;
  if (D.18680 == 1) goto <D.18681>; else goto <D.18682>;
  <D.18681>:
  D.18683 = 0;
  return D.18683;
  <D.18682>:
  D.18684 = desc & 49159;
  if (D.18684 == 4) goto <D.18685>; else goto <D.18686>;
  <D.18685>:
  D.18683 = 0;
  return D.18683;
  <D.18686>:
  D.18687 = desc & 7;
  if (D.18687 == 7) goto <D.18688>; else goto <D.18689>;
  <D.18688>:
  D.18683 = 0;
  return D.18683;
  <D.18689>:
  D.18683 = 1;
  return D.18683;
}


sgen_los_scan_card_table (gboolean mod_union, struct SgenGrayQueue * queue)
{
  _Bool D.18693;
  long int D.18694;
  long int D.18695;
  char[0:] * D.18698;
  long unsigned int D.18699;
  struct LOSObject * obj;

  obj = los_object_list;
  goto <D.18364>;
  <D.18363>:
  {
    guint8 * cards;

    cards = 0B;
    if (mod_union != 0) goto <D.18691>; else goto <D.18692>;
    <D.18691>:
    cards = obj->cardtable_mod_union;
    D.18693 = cards == 0B;
    D.18694 = (long int) D.18693;
    D.18695 = __builtin_expect (D.18694, 0);
    if (D.18695 != 0) goto <D.18696>; else goto <D.18697>;
    <D.18696>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-los.c", 544, "cards");
    <D.18697>:
    <D.18692>:
    D.18698 = &obj->data;
    D.18699 = obj->size;
    sgen_cardtable_scan_object (D.18698, D.18699, cards, mod_union, queue);
  }
  obj = obj->next;
  <D.18364>:
  if (obj != 0B) goto <D.18363>; else goto <D.18365>;
  <D.18365>:
}


sgen_los_update_cardtable_mod_union ()
{
  guint8 * D.18700;
  char[0:] * D.18701;
  long unsigned int D.18702;
  guint8 * D.18703;
  struct LOSObject * obj;

  obj = los_object_list;
  goto <D.18371>;
  <D.18370>:
  D.18700 = obj->cardtable_mod_union;
  D.18701 = &obj->data;
  D.18702 = obj->size;
  D.18703 = sgen_card_table_update_mod_union (D.18700, D.18701, D.18702, 0B);
  obj->cardtable_mod_union = D.18703;
  obj = obj->next;
  <D.18371>:
  if (obj != 0B) goto <D.18370>; else goto <D.18372>;
  <D.18372>:
}


sgen_los_object_size (struct LOSObject * obj)
{
  mword D.18704;
  long unsigned int D.18705;

  D.18705 = obj->size;
  D.18704 = D.18705 & 18446744073709551614;
  return D.18704;
}


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

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


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

  obj = sgen_los_header_for_object (data);
  D.18709 = obj->size;
  D.18710 = D.18709 | 1;
  obj->size = D.18710;
}


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

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


sgen_los_object_is_pinned (char * data)
{
  gboolean D.18712;
  long unsigned int D.18713;
  int D.18714;
  struct LOSObject * obj;

  obj = sgen_los_header_for_object (data);
  D.18713 = obj->size;
  D.18714 = (int) D.18713;
  D.18712 = D.18714 & 1;
  return D.18712;
}


