__attribute__((visibility ("hidden")))
sgen_marksweep_init (struct SgenMajorCollector * collector)
{
  sgen_marksweep_init_internal (collector, 0);
}


sgen_marksweep_init_internal (struct SgenMajorCollector * collector, gboolean is_concurrent)
{
  int D.20618;
  int num_block_obj_sizes.0;
  long unsigned int D.20620;
  long unsigned int D.20621;
  void * D.20622;
  int * block_obj_sizes.1;
  void * D.20624;
  gboolean * evacuate_block_obj_sizes.2;
  long unsigned int D.20626;
  long unsigned int D.20627;
  gboolean * D.20628;
  int D.20629;
  int D.20630;
  int iftmp.3;
  int D.20632;
  int D.20633;
  int D.20637;
  _Bool D.20638;
  long int D.20639;
  long int D.20640;
  int i;

  sgen_register_fixed_internal_mem_type (16, 320);
  D.20618 = ms_calculate_block_obj_sizes (1.4142135623730951454746218587388284504413604736328125e+0, 0B);
  num_block_obj_sizes = D.20618;
  num_block_obj_sizes.0 = num_block_obj_sizes;
  D.20620 = (long unsigned int) num_block_obj_sizes.0;
  D.20621 = D.20620 * 4;
  D.20622 = sgen_alloc_internal_dynamic (D.20621, 15, 1);
  block_obj_sizes = D.20622;
  block_obj_sizes.1 = block_obj_sizes;
  ms_calculate_block_obj_sizes (1.4142135623730951454746218587388284504413604736328125e+0, block_obj_sizes.1);
  num_block_obj_sizes.0 = num_block_obj_sizes;
  D.20620 = (long unsigned int) num_block_obj_sizes.0;
  D.20621 = D.20620 * 4;
  D.20624 = sgen_alloc_internal_dynamic (D.20621, 15, 1);
  evacuate_block_obj_sizes = D.20624;
  i = 0;
  goto <D.20603>;
  <D.20602>:
  evacuate_block_obj_sizes.2 = evacuate_block_obj_sizes;
  D.20626 = (long unsigned int) i;
  D.20627 = D.20626 * 4;
  D.20628 = evacuate_block_obj_sizes.2 + D.20627;
  *D.20628 = 0;
  i = i + 1;
  <D.20603>:
  num_block_obj_sizes.0 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.0) goto <D.20602>; else goto <D.20604>;
  <D.20604>:
  alloc_free_block_lists (&free_block_lists);
  i = 0;
  goto <D.20606>;
  <D.20605>:
  D.20629 = i * 8;
  D.20630 = ms_find_block_obj_size_index (D.20629);
  fast_block_obj_size_indexes[i] = D.20630;
  i = i + 1;
  <D.20606>:
  if (i <= 31) goto <D.20605>; else goto <D.20607>;
  <D.20607>:
  i = 0;
  goto <D.20609>;
  <D.20608>:
  D.20632 = i + 7;
  D.20633 = D.20632 >> 3;
  if (D.20633 <= 31) goto <D.20634>; else goto <D.20635>;
  <D.20634>:
  D.20632 = i + 7;
  D.20633 = D.20632 >> 3;
  iftmp.3 = fast_block_obj_size_indexes[D.20633];
  goto <D.20636>;
  <D.20635>:
  iftmp.3 = ms_find_block_obj_size_index (i);
  <D.20636>:
  D.20637 = ms_find_block_obj_size_index (i);
  D.20638 = iftmp.3 != D.20637;
  D.20639 = (long int) D.20638;
  D.20640 = __builtin_expect (D.20639, 0);
  if (D.20640 != 0) goto <D.20641>; else goto <D.20642>;
  <D.20641>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 2510, "MS_BLOCK_OBJ_SIZE_INDEX (i) == ms_find_block_obj_size_index (i)");
  <D.20642>:
  i = i + 1;
  <D.20609>:
  if (i <= 255) goto <D.20608>; else goto <D.20610>;
  <D.20610>:
  mono_counters_register ("# major blocks allocated", 515, &stat_major_blocks_alloced);
  mono_counters_register ("# major blocks freed", 515, &stat_major_blocks_freed);
  mono_counters_register ("# major blocks lazy swept", 515, &stat_major_blocks_lazy_swept);
  mono_counters_register ("# major objects evacuated", 515, &stat_major_objects_evacuated);
  collector->section_size = 16384;
  collector->is_parallel = 0;
  concurrent_mark = is_concurrent;
  if (is_concurrent != 0) goto <D.20643>; else goto <D.20644>;
  <D.20643>:
  collector->is_concurrent = 1;
  collector->want_synchronous_collection = &want_evacuation;
  collector->get_and_reset_num_major_objects_marked = major_get_and_reset_num_major_objects_marked;
  goto <D.20645>;
  <D.20644>:
  collector->is_concurrent = 0;
  collector->want_synchronous_collection = 0B;
  <D.20645>:
  collector->supports_cardtable = 1;
  collector->have_swept = &have_swept;
  collector->alloc_heap = major_alloc_heap;
  collector->is_object_live = major_is_object_live;
  collector->alloc_small_pinned_obj = major_alloc_small_pinned_obj;
  collector->alloc_degraded = major_alloc_degraded;
  collector->alloc_object = major_alloc_object;
  collector->free_pinned_object = free_pinned_object;
  collector->iterate_objects = major_iterate_objects;
  collector->free_non_pinned_object = major_free_non_pinned_object;
  collector->find_pin_queue_start_ends = major_find_pin_queue_start_ends;
  collector->pin_objects = major_pin_objects;
  collector->pin_major_object = pin_major_object;
  collector->scan_card_table = major_scan_card_table;
  collector->iterate_live_block_ranges = major_iterate_live_block_ranges;
  if (is_concurrent != 0) goto <D.20646>; else goto <D.20647>;
  <D.20646>:
  collector->update_cardtable_mod_union = update_cardtable_mod_union;
  collector->get_cardtable_mod_union_for_object = major_get_cardtable_mod_union_for_object;
  <D.20647>:
  collector->init_to_space = major_init_to_space;
  collector->sweep = major_sweep;
  collector->check_scan_starts = major_check_scan_starts;
  collector->dump_heap = major_dump_heap;
  collector->get_used_size = major_get_used_size;
  collector->start_nursery_collection = major_start_nursery_collection;
  collector->finish_nursery_collection = major_finish_nursery_collection;
  collector->start_major_collection = major_start_major_collection;
  collector->finish_major_collection = major_finish_major_collection;
  collector->have_computed_minor_collection_allowance = major_have_computer_minor_collection_allowance;
  collector->ptr_is_in_non_pinned_space = major_ptr_is_in_non_pinned_space;
  collector->obj_is_from_pinned_alloc = obj_is_from_pinned_alloc;
  collector->report_pinned_memory_usage = major_report_pinned_memory_usage;
  collector->get_num_major_sections = get_num_major_sections;
  collector->handle_gc_param = major_handle_gc_param;
  collector->print_gc_param_usage = major_print_gc_param_usage;
  collector->post_param_init = post_param_init;
  collector->is_valid_object = major_is_valid_object;
  collector->describe_pointer = major_describe_pointer;
  collector->major_ops.copy_or_mark_object = major_copy_or_mark_object_canonical;
  collector->major_ops.scan_object = major_scan_object;
  if (is_concurrent != 0) goto <D.20648>; else goto <D.20649>;
  <D.20648>:
  collector->major_concurrent_ops.copy_or_mark_object = major_copy_or_mark_object_concurrent_canonical;
  collector->major_concurrent_ops.scan_object = major_scan_object_concurrent;
  collector->major_concurrent_ops.scan_vtype = major_scan_vtype_concurrent;
  <D.20649>:
  if (0 != 0) goto <D.20650>; else goto <D.20651>;
  <D.20650>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 2612, "(MS_BLOCK_SIZE % (8 * CARD_SIZE_IN_BYTES)) == 0");
  <D.20651>:
}


major_scan_vtype_concurrent (char * start, mword desc, struct SgenGrayQueue * queue)
{
  long unsigned int D.20652;
  long unsigned int D.20653;
  long unsigned int D.20656;
  long unsigned int D.20657;
  long unsigned int D.20658;
  long unsigned int D.20659;
  long unsigned int D.20660;
  long unsigned int D.20661;
  int D.20665;
  struct FILE * gc_debug_file.4;
  void * D.20672;
  int iftmp.5;
  int D.20676;
  int D.20678;
  _Bool D.20680;
  long int D.20681;
  long int D.20682;
  int iftmp.6;
  int D.20688;
  int D.20690;
  _Bool D.20692;
  long int D.20693;
  long int D.20694;
  int D.20700;
  int iftmp.7;
  int D.20709;
  int D.20711;
  _Bool D.20713;
  long int D.20714;
  long int D.20715;
  int iftmp.8;
  int D.20721;
  int D.20723;
  _Bool D.20725;
  long int D.20726;
  long int D.20727;
  long unsigned int D.20730;
  long unsigned int D.20731;
  int D.20732;
  int D.20736;
  void * D.20742;
  int iftmp.9;
  int D.20746;
  int D.20748;
  _Bool D.20750;
  long int D.20751;
  long int D.20752;
  int iftmp.10;
  int D.20758;
  int D.20760;
  _Bool D.20762;
  long int D.20763;
  long int D.20764;
  long unsigned int D.20767;
  long unsigned int D.20768;
  int D.20769;
  int D.20773;
  int iftmp.11;
  int D.20782;
  int D.20784;
  _Bool D.20786;
  long int D.20787;
  long int D.20788;
  int iftmp.12;
  int D.20794;
  int D.20796;
  _Bool D.20798;
  long int D.20799;
  long int D.20800;
  long unsigned int D.20803;
  long unsigned int D.20806;
  int D.20807;
  int D.20808;
  unsigned int D.20811;
  unsigned int el_size.13;
  unsigned int D.20813;
  sizetype D.20814;
  int D.20818;
  void * D.20824;
  int iftmp.14;
  int D.20828;
  int D.20830;
  _Bool D.20832;
  long int D.20833;
  long int D.20834;
  int iftmp.15;
  int D.20840;
  int D.20842;
  _Bool D.20844;
  long int D.20845;
  long int D.20846;
  int D.20852;
  int D.20853;
  long unsigned int D.20854;
  long unsigned int D.20855;
  long unsigned int D.20856;
  long unsigned int D.20857;
  void * * D.20858;
  int D.20862;
  void * D.20868;
  int iftmp.16;
  int D.20872;
  int D.20874;
  _Bool D.20876;
  long int D.20877;
  long int D.20878;
  int iftmp.17;
  int D.20884;
  int D.20886;
  _Bool D.20888;
  long int D.20889;
  long int D.20890;
  sizetype D.20893;
  long unsigned int D.20897;
  int D.20903;
  void * D.20909;
  int iftmp.18;
  int D.20913;
  int D.20915;
  _Bool D.20917;
  long int D.20918;
  long int D.20919;
  int iftmp.19;
  int D.20925;
  int D.20927;
  _Bool D.20929;
  long int D.20930;
  long int D.20931;
  long unsigned int D.20934;
  int D.20940;
  void * D.20946;
  int iftmp.20;
  int D.20950;
  int D.20952;
  _Bool D.20954;
  long int D.20955;
  long int D.20956;
  int iftmp.21;
  int D.20962;
  int D.20964;
  _Bool D.20966;
  long int D.20967;
  long int D.20968;
  long unsigned int D.20971;
  unsigned int D.20972;
  unsigned int D.20973;
  struct MonoVTable * D.20976;
  struct MonoClass * D.20977;
  const char * D.20978;
  const char * D.20979;
  gsize * bitmap_data.22;
  long unsigned int D.20981;
  int D.20987;
  void * D.20993;
  int iftmp.23;
  int D.20997;
  int D.20999;
  _Bool D.21001;
  long int D.21002;
  long int D.21003;
  int iftmp.24;
  int D.21009;
  int D.21011;
  _Bool D.21013;
  long int D.21014;
  long int D.21015;
  int bwords.25;

  start = start + 18446744073709551600;
  D.20652 = desc & 7;
  switch (D.20652) <default: <D.20310>, case 1: <D.20227>, case 2: <D.20238>, case 3: <D.20294>, case 4: <D.20250>, case 5: <D.20286>, case 7: <D.20309>>
  <D.20227>:
  D.20653 = desc & 4294901760;
  if (D.20653 != 0) goto <D.20654>; else goto <D.20655>;
  <D.20654>:
  {
    void * * _objptr_end;
    void * * _objptr;

    _objptr = start;
    D.20656 = desc >> 16;
    D.20657 = D.20656 & 255;
    D.20658 = D.20657 * 8;
    _objptr = _objptr + D.20658;
    D.20659 = desc >> 24;
    D.20660 = D.20659 & 255;
    D.20661 = D.20660 * 8;
    _objptr_end = _objptr + D.20661;
    {
      void * __old;
      void * __copy;

      __old = *_objptr;
      if (__old != 0B) goto <D.20664>; else goto <D.20662>;
      <D.20664>:
      D.20665 = sgen_ptr_in_nursery (__old);
      if (D.20665 == 0) goto <D.20666>; else goto <D.20662>;
      <D.20666>:
      __builtin_prefetch (__old);
      major_copy_or_mark_object_concurrent (_objptr, __old, queue);
      __copy = *_objptr;
      if (0 != 0) goto <D.20667>; else goto <D.20668>;
      <D.20667>:
      if (__old != __copy) goto <D.20669>; else goto <D.20670>;
      <D.20669>:
      gc_debug_file.4 = gc_debug_file;
      D.20672 = *_objptr;
      fprintf (gc_debug_file.4, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.20672, __old);
      gc_debug_file.4 = gc_debug_file;
      fflush (gc_debug_file.4);
      <D.20670>:
      <D.20668>:
      D.20676 = sgen_ptr_in_nursery (__copy);
      if (D.20676 != 0) goto <D.20677>; else goto <D.20674>;
      <D.20677>:
      D.20678 = sgen_ptr_in_nursery (_objptr);
      if (D.20678 == 0) goto <D.20679>; else goto <D.20674>;
      <D.20679>:
      iftmp.5 = 1;
      goto <D.20675>;
      <D.20674>:
      iftmp.5 = 0;
      <D.20675>:
      D.20680 = iftmp.5 != 0;
      D.20681 = (long int) D.20680;
      D.20682 = __builtin_expect (D.20681, 0);
      if (D.20682 != 0) goto <D.20683>; else goto <D.20684>;
      <D.20683>:
      sgen_add_to_global_remset (_objptr, __copy);
      <D.20684>:
      goto <D.20663>;
      <D.20662>:
      D.20688 = sgen_ptr_in_nursery (__old);
      if (D.20688 != 0) goto <D.20689>; else goto <D.20686>;
      <D.20689>:
      D.20690 = sgen_ptr_in_nursery (_objptr);
      if (D.20690 == 0) goto <D.20691>; else goto <D.20686>;
      <D.20691>:
      iftmp.6 = 1;
      goto <D.20687>;
      <D.20686>:
      iftmp.6 = 0;
      <D.20687>:
      D.20692 = iftmp.6 != 0;
      D.20693 = (long int) D.20692;
      D.20694 = __builtin_expect (D.20693, 0);
      if (D.20694 != 0) goto <D.20695>; else goto <D.20696>;
      <D.20695>:
      sgen_add_to_global_remset (_objptr, __old);
      <D.20696>:
      <D.20663>:
    }
    _objptr = _objptr + 8;
    goto <D.20235>;
    <D.20234>:
    {
      void * __old;
      void * __copy;

      __old = *_objptr;
      if (__old != 0B) goto <D.20699>; else goto <D.20697>;
      <D.20699>:
      D.20700 = sgen_ptr_in_nursery (__old);
      if (D.20700 == 0) goto <D.20701>; else goto <D.20697>;
      <D.20701>:
      __builtin_prefetch (__old);
      major_copy_or_mark_object_concurrent (_objptr, __old, queue);
      __copy = *_objptr;
      if (0 != 0) goto <D.20702>; else goto <D.20703>;
      <D.20702>:
      if (__old != __copy) goto <D.20704>; else goto <D.20705>;
      <D.20704>:
      gc_debug_file.4 = gc_debug_file;
      D.20672 = *_objptr;
      fprintf (gc_debug_file.4, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.20672, __old);
      gc_debug_file.4 = gc_debug_file;
      fflush (gc_debug_file.4);
      <D.20705>:
      <D.20703>:
      D.20709 = sgen_ptr_in_nursery (__copy);
      if (D.20709 != 0) goto <D.20710>; else goto <D.20707>;
      <D.20710>:
      D.20711 = sgen_ptr_in_nursery (_objptr);
      if (D.20711 == 0) goto <D.20712>; else goto <D.20707>;
      <D.20712>:
      iftmp.7 = 1;
      goto <D.20708>;
      <D.20707>:
      iftmp.7 = 0;
      <D.20708>:
      D.20713 = iftmp.7 != 0;
      D.20714 = (long int) D.20713;
      D.20715 = __builtin_expect (D.20714, 0);
      if (D.20715 != 0) goto <D.20716>; else goto <D.20717>;
      <D.20716>:
      sgen_add_to_global_remset (_objptr, __copy);
      <D.20717>:
      goto <D.20698>;
      <D.20697>:
      D.20721 = sgen_ptr_in_nursery (__old);
      if (D.20721 != 0) goto <D.20722>; else goto <D.20719>;
      <D.20722>:
      D.20723 = sgen_ptr_in_nursery (_objptr);
      if (D.20723 == 0) goto <D.20724>; else goto <D.20719>;
      <D.20724>:
      iftmp.8 = 1;
      goto <D.20720>;
      <D.20719>:
      iftmp.8 = 0;
      <D.20720>:
      D.20725 = iftmp.8 != 0;
      D.20726 = (long int) D.20725;
      D.20727 = __builtin_expect (D.20726, 0);
      if (D.20727 != 0) goto <D.20728>; else goto <D.20729>;
      <D.20728>:
      sgen_add_to_global_remset (_objptr, __old);
      <D.20729>:
      <D.20698>:
    }
    _objptr = _objptr + 8;
    <D.20235>:
    if (_objptr < _objptr_end) goto <D.20234>; else goto <D.20236>;
    <D.20236>:
  }
  <D.20655>:
  goto <D.20237>;
  <D.20238>:
  {
    void * * _objptr;
    gsize _bmap;

    _objptr = start;
    _bmap = desc >> 16;
    _objptr = _objptr + 16;
    {
      int _index;

      _index = __builtin_ctzl (_bmap);
      D.20730 = (long unsigned int) _index;
      D.20731 = D.20730 * 8;
      _objptr = _objptr + D.20731;
      D.20732 = _index + 1;
      _bmap = _bmap >> D.20732;
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.20735>; else goto <D.20733>;
        <D.20735>:
        D.20736 = sgen_ptr_in_nursery (__old);
        if (D.20736 == 0) goto <D.20737>; else goto <D.20733>;
        <D.20737>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.20738>; else goto <D.20739>;
        <D.20738>:
        if (__old != __copy) goto <D.20740>; else goto <D.20741>;
        <D.20740>:
        gc_debug_file.4 = gc_debug_file;
        D.20742 = *_objptr;
        fprintf (gc_debug_file.4, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.20742, __old);
        gc_debug_file.4 = gc_debug_file;
        fflush (gc_debug_file.4);
        <D.20741>:
        <D.20739>:
        D.20746 = sgen_ptr_in_nursery (__copy);
        if (D.20746 != 0) goto <D.20747>; else goto <D.20744>;
        <D.20747>:
        D.20748 = sgen_ptr_in_nursery (_objptr);
        if (D.20748 == 0) goto <D.20749>; else goto <D.20744>;
        <D.20749>:
        iftmp.9 = 1;
        goto <D.20745>;
        <D.20744>:
        iftmp.9 = 0;
        <D.20745>:
        D.20750 = iftmp.9 != 0;
        D.20751 = (long int) D.20750;
        D.20752 = __builtin_expect (D.20751, 0);
        if (D.20752 != 0) goto <D.20753>; else goto <D.20754>;
        <D.20753>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.20754>:
        goto <D.20734>;
        <D.20733>:
        D.20758 = sgen_ptr_in_nursery (__old);
        if (D.20758 != 0) goto <D.20759>; else goto <D.20756>;
        <D.20759>:
        D.20760 = sgen_ptr_in_nursery (_objptr);
        if (D.20760 == 0) goto <D.20761>; else goto <D.20756>;
        <D.20761>:
        iftmp.10 = 1;
        goto <D.20757>;
        <D.20756>:
        iftmp.10 = 0;
        <D.20757>:
        D.20762 = iftmp.10 != 0;
        D.20763 = (long int) D.20762;
        D.20764 = __builtin_expect (D.20763, 0);
        if (D.20764 != 0) goto <D.20765>; else goto <D.20766>;
        <D.20765>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.20766>:
        <D.20734>:
      }
      _objptr = _objptr + 8;
    }
    goto <D.20248>;
    <D.20247>:
    {
      int _index;

      _index = __builtin_ctzl (_bmap);
      D.20767 = (long unsigned int) _index;
      D.20768 = D.20767 * 8;
      _objptr = _objptr + D.20768;
      D.20769 = _index + 1;
      _bmap = _bmap >> D.20769;
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.20772>; else goto <D.20770>;
        <D.20772>:
        D.20773 = sgen_ptr_in_nursery (__old);
        if (D.20773 == 0) goto <D.20774>; else goto <D.20770>;
        <D.20774>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.20775>; else goto <D.20776>;
        <D.20775>:
        if (__old != __copy) goto <D.20777>; else goto <D.20778>;
        <D.20777>:
        gc_debug_file.4 = gc_debug_file;
        D.20742 = *_objptr;
        fprintf (gc_debug_file.4, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.20742, __old);
        gc_debug_file.4 = gc_debug_file;
        fflush (gc_debug_file.4);
        <D.20778>:
        <D.20776>:
        D.20782 = sgen_ptr_in_nursery (__copy);
        if (D.20782 != 0) goto <D.20783>; else goto <D.20780>;
        <D.20783>:
        D.20784 = sgen_ptr_in_nursery (_objptr);
        if (D.20784 == 0) goto <D.20785>; else goto <D.20780>;
        <D.20785>:
        iftmp.11 = 1;
        goto <D.20781>;
        <D.20780>:
        iftmp.11 = 0;
        <D.20781>:
        D.20786 = iftmp.11 != 0;
        D.20787 = (long int) D.20786;
        D.20788 = __builtin_expect (D.20787, 0);
        if (D.20788 != 0) goto <D.20789>; else goto <D.20790>;
        <D.20789>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.20790>:
        goto <D.20771>;
        <D.20770>:
        D.20794 = sgen_ptr_in_nursery (__old);
        if (D.20794 != 0) goto <D.20795>; else goto <D.20792>;
        <D.20795>:
        D.20796 = sgen_ptr_in_nursery (_objptr);
        if (D.20796 == 0) goto <D.20797>; else goto <D.20792>;
        <D.20797>:
        iftmp.12 = 1;
        goto <D.20793>;
        <D.20792>:
        iftmp.12 = 0;
        <D.20793>:
        D.20798 = iftmp.12 != 0;
        D.20799 = (long int) D.20798;
        D.20800 = __builtin_expect (D.20799, 0);
        if (D.20800 != 0) goto <D.20801>; else goto <D.20802>;
        <D.20801>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.20802>:
        <D.20771>:
      }
      _objptr = _objptr + 8;
    }
    <D.20248>:
    if (_bmap != 0) goto <D.20247>; else goto <D.20249>;
    <D.20249>:
  }
  goto <D.20237>;
  <D.20250>:
  D.20803 = desc & 4294950912;
  if (D.20803 != 0) goto <D.20804>; else goto <D.20805>;
  <D.20804>:
  {
    int el_size;
    int etype;

    D.20806 = desc >> 3;
    D.20807 = (int) D.20806;
    el_size = D.20807 & 1023;
    D.20808 = (int) desc;
    etype = D.20808 & 49152;
    if (etype == 16384) goto <D.20809>; else goto <D.20810>;
    <D.20809>:
    {
      void * * p;
      void * * end_refs;

      p = start + 32;
      D.20811 = MEM[(struct MonoArray *)start].max_length;
      el_size.13 = (unsigned int) el_size;
      D.20813 = D.20811 * el_size.13;
      D.20814 = (sizetype) D.20813;
      end_refs = p + D.20814;
      goto <D.20258>;
      <D.20257>:
      {
        void * __old;
        void * __copy;

        __old = *p;
        if (__old != 0B) goto <D.20817>; else goto <D.20815>;
        <D.20817>:
        D.20818 = sgen_ptr_in_nursery (__old);
        if (D.20818 == 0) goto <D.20819>; else goto <D.20815>;
        <D.20819>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (p, __old, queue);
        __copy = *p;
        if (0 != 0) goto <D.20820>; else goto <D.20821>;
        <D.20820>:
        if (__old != __copy) goto <D.20822>; else goto <D.20823>;
        <D.20822>:
        gc_debug_file.4 = gc_debug_file;
        D.20824 = *p;
        fprintf (gc_debug_file.4, "Overwrote field at %p with %p (was: %p)\n", p, D.20824, __old);
        gc_debug_file.4 = gc_debug_file;
        fflush (gc_debug_file.4);
        <D.20823>:
        <D.20821>:
        D.20828 = sgen_ptr_in_nursery (__copy);
        if (D.20828 != 0) goto <D.20829>; else goto <D.20826>;
        <D.20829>:
        D.20830 = sgen_ptr_in_nursery (p);
        if (D.20830 == 0) goto <D.20831>; else goto <D.20826>;
        <D.20831>:
        iftmp.14 = 1;
        goto <D.20827>;
        <D.20826>:
        iftmp.14 = 0;
        <D.20827>:
        D.20832 = iftmp.14 != 0;
        D.20833 = (long int) D.20832;
        D.20834 = __builtin_expect (D.20833, 0);
        if (D.20834 != 0) goto <D.20835>; else goto <D.20836>;
        <D.20835>:
        sgen_add_to_global_remset (p, __copy);
        <D.20836>:
        goto <D.20816>;
        <D.20815>:
        D.20840 = sgen_ptr_in_nursery (__old);
        if (D.20840 != 0) goto <D.20841>; else goto <D.20838>;
        <D.20841>:
        D.20842 = sgen_ptr_in_nursery (p);
        if (D.20842 == 0) goto <D.20843>; else goto <D.20838>;
        <D.20843>:
        iftmp.15 = 1;
        goto <D.20839>;
        <D.20838>:
        iftmp.15 = 0;
        <D.20839>:
        D.20844 = iftmp.15 != 0;
        D.20845 = (long int) D.20844;
        D.20846 = __builtin_expect (D.20845, 0);
        if (D.20846 != 0) goto <D.20847>; else goto <D.20848>;
        <D.20847>:
        sgen_add_to_global_remset (p, __old);
        <D.20848>:
        <D.20816>:
      }
      p = p + 8;
      <D.20258>:
      if (p < end_refs) goto <D.20257>; else goto <D.20259>;
      <D.20259>:
    }
    goto <D.20849>;
    <D.20810>:
    if (etype == 32768) goto <D.20850>; else goto <D.20851>;
    <D.20850>:
    {
      int offset;
      int num_refs;
      char * e_start;
      char * e_end;

      D.20656 = desc >> 16;
      D.20852 = (int) D.20656;
      offset = D.20852 & 255;
      D.20659 = desc >> 24;
      D.20853 = (int) D.20659;
      num_refs = D.20853 & 255;
      e_start = start + 32;
      D.20811 = MEM[(struct MonoArray *)start].max_length;
      el_size.13 = (unsigned int) el_size;
      D.20813 = D.20811 * el_size.13;
      D.20814 = (sizetype) D.20813;
      e_end = e_start + D.20814;
      goto <D.20272>;
      <D.20271>:
      {
        void * * p;
        int i;

        p = e_start;
        D.20854 = (long unsigned int) offset;
        D.20855 = D.20854 * 8;
        p = p + D.20855;
        i = 0;
        goto <D.20269>;
        <D.20268>:
        {
          void * __old;
          void * __copy;

          D.20856 = (long unsigned int) i;
          D.20857 = D.20856 * 8;
          D.20858 = p + D.20857;
          __old = *D.20858;
          if (__old != 0B) goto <D.20861>; else goto <D.20859>;
          <D.20861>:
          D.20862 = sgen_ptr_in_nursery (__old);
          if (D.20862 == 0) goto <D.20863>; else goto <D.20859>;
          <D.20863>:
          __builtin_prefetch (__old);
          D.20856 = (long unsigned int) i;
          D.20857 = D.20856 * 8;
          D.20858 = p + D.20857;
          major_copy_or_mark_object_concurrent (D.20858, __old, queue);
          D.20856 = (long unsigned int) i;
          D.20857 = D.20856 * 8;
          D.20858 = p + D.20857;
          __copy = *D.20858;
          if (0 != 0) goto <D.20864>; else goto <D.20865>;
          <D.20864>:
          if (__old != __copy) goto <D.20866>; else goto <D.20867>;
          <D.20866>:
          gc_debug_file.4 = gc_debug_file;
          D.20856 = (long unsigned int) i;
          D.20857 = D.20856 * 8;
          D.20858 = p + D.20857;
          D.20856 = (long unsigned int) i;
          D.20857 = D.20856 * 8;
          D.20858 = p + D.20857;
          D.20868 = *D.20858;
          fprintf (gc_debug_file.4, "Overwrote field at %p with %p (was: %p)\n", D.20858, D.20868, __old);
          gc_debug_file.4 = gc_debug_file;
          fflush (gc_debug_file.4);
          <D.20867>:
          <D.20865>:
          D.20872 = sgen_ptr_in_nursery (__copy);
          if (D.20872 != 0) goto <D.20873>; else goto <D.20870>;
          <D.20873>:
          D.20856 = (long unsigned int) i;
          D.20857 = D.20856 * 8;
          D.20858 = p + D.20857;
          D.20874 = sgen_ptr_in_nursery (D.20858);
          if (D.20874 == 0) goto <D.20875>; else goto <D.20870>;
          <D.20875>:
          iftmp.16 = 1;
          goto <D.20871>;
          <D.20870>:
          iftmp.16 = 0;
          <D.20871>:
          D.20876 = iftmp.16 != 0;
          D.20877 = (long int) D.20876;
          D.20878 = __builtin_expect (D.20877, 0);
          if (D.20878 != 0) goto <D.20879>; else goto <D.20880>;
          <D.20879>:
          D.20856 = (long unsigned int) i;
          D.20857 = D.20856 * 8;
          D.20858 = p + D.20857;
          sgen_add_to_global_remset (D.20858, __copy);
          <D.20880>:
          goto <D.20860>;
          <D.20859>:
          D.20884 = sgen_ptr_in_nursery (__old);
          if (D.20884 != 0) goto <D.20885>; else goto <D.20882>;
          <D.20885>:
          D.20856 = (long unsigned int) i;
          D.20857 = D.20856 * 8;
          D.20858 = p + D.20857;
          D.20886 = sgen_ptr_in_nursery (D.20858);
          if (D.20886 == 0) goto <D.20887>; else goto <D.20882>;
          <D.20887>:
          iftmp.17 = 1;
          goto <D.20883>;
          <D.20882>:
          iftmp.17 = 0;
          <D.20883>:
          D.20888 = iftmp.17 != 0;
          D.20889 = (long int) D.20888;
          D.20890 = __builtin_expect (D.20889, 0);
          if (D.20890 != 0) goto <D.20891>; else goto <D.20892>;
          <D.20891>:
          D.20856 = (long unsigned int) i;
          D.20857 = D.20856 * 8;
          D.20858 = p + D.20857;
          sgen_add_to_global_remset (D.20858, __old);
          <D.20892>:
          <D.20860>:
        }
        i = i + 1;
        <D.20269>:
        if (i < num_refs) goto <D.20268>; else goto <D.20270>;
        <D.20270>:
        D.20893 = (sizetype) el_size;
        e_start = e_start + D.20893;
      }
      <D.20272>:
      if (e_start < e_end) goto <D.20271>; else goto <D.20273>;
      <D.20273>:
    }
    goto <D.20894>;
    <D.20851>:
    if (etype == 49152) goto <D.20895>; else goto <D.20896>;
    <D.20895>:
    {
      char * e_start;
      char * e_end;

      e_start = start + 32;
      D.20811 = MEM[(struct MonoArray *)start].max_length;
      el_size.13 = (unsigned int) el_size;
      D.20813 = D.20811 * el_size.13;
      D.20814 = (sizetype) D.20813;
      e_end = e_start + D.20814;
      goto <D.20284>;
      <D.20283>:
      {
        void * * p;
        gsize _bmap;

        p = e_start;
        _bmap = desc >> 16;
        goto <D.20281>;
        <D.20280>:
        D.20897 = _bmap & 1;
        if (D.20897 != 0) goto <D.20898>; else goto <D.20899>;
        <D.20898>:
        {
          void * __old;
          void * __copy;

          __old = *p;
          if (__old != 0B) goto <D.20902>; else goto <D.20900>;
          <D.20902>:
          D.20903 = sgen_ptr_in_nursery (__old);
          if (D.20903 == 0) goto <D.20904>; else goto <D.20900>;
          <D.20904>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object_concurrent (p, __old, queue);
          __copy = *p;
          if (0 != 0) goto <D.20905>; else goto <D.20906>;
          <D.20905>:
          if (__old != __copy) goto <D.20907>; else goto <D.20908>;
          <D.20907>:
          gc_debug_file.4 = gc_debug_file;
          D.20909 = *p;
          fprintf (gc_debug_file.4, "Overwrote field at %p with %p (was: %p)\n", p, D.20909, __old);
          gc_debug_file.4 = gc_debug_file;
          fflush (gc_debug_file.4);
          <D.20908>:
          <D.20906>:
          D.20913 = sgen_ptr_in_nursery (__copy);
          if (D.20913 != 0) goto <D.20914>; else goto <D.20911>;
          <D.20914>:
          D.20915 = sgen_ptr_in_nursery (p);
          if (D.20915 == 0) goto <D.20916>; else goto <D.20911>;
          <D.20916>:
          iftmp.18 = 1;
          goto <D.20912>;
          <D.20911>:
          iftmp.18 = 0;
          <D.20912>:
          D.20917 = iftmp.18 != 0;
          D.20918 = (long int) D.20917;
          D.20919 = __builtin_expect (D.20918, 0);
          if (D.20919 != 0) goto <D.20920>; else goto <D.20921>;
          <D.20920>:
          sgen_add_to_global_remset (p, __copy);
          <D.20921>:
          goto <D.20901>;
          <D.20900>:
          D.20925 = sgen_ptr_in_nursery (__old);
          if (D.20925 != 0) goto <D.20926>; else goto <D.20923>;
          <D.20926>:
          D.20927 = sgen_ptr_in_nursery (p);
          if (D.20927 == 0) goto <D.20928>; else goto <D.20923>;
          <D.20928>:
          iftmp.19 = 1;
          goto <D.20924>;
          <D.20923>:
          iftmp.19 = 0;
          <D.20924>:
          D.20929 = iftmp.19 != 0;
          D.20930 = (long int) D.20929;
          D.20931 = __builtin_expect (D.20930, 0);
          if (D.20931 != 0) goto <D.20932>; else goto <D.20933>;
          <D.20932>:
          sgen_add_to_global_remset (p, __old);
          <D.20933>:
          <D.20901>:
        }
        <D.20899>:
        _bmap = _bmap >> 1;
        p = p + 8;
        <D.20281>:
        if (_bmap != 0) goto <D.20280>; else goto <D.20282>;
        <D.20282>:
        D.20893 = (sizetype) el_size;
        e_start = e_start + D.20893;
      }
      <D.20284>:
      if (e_start < e_end) goto <D.20283>; else goto <D.20285>;
      <D.20285>:
    }
    <D.20896>:
    <D.20894>:
    <D.20849>:
  }
  <D.20805>:
  goto <D.20237>;
  <D.20286>:
  {
    void * * _objptr;
    gsize _bmap;

    _objptr = start;
    _bmap = desc >> 3;
    _objptr = _objptr + 16;
    goto <D.20292>;
    <D.20291>:
    D.20934 = _bmap & 1;
    if (D.20934 != 0) goto <D.20935>; else goto <D.20936>;
    <D.20935>:
    {
      void * __old;
      void * __copy;

      __old = *_objptr;
      if (__old != 0B) goto <D.20939>; else goto <D.20937>;
      <D.20939>:
      D.20940 = sgen_ptr_in_nursery (__old);
      if (D.20940 == 0) goto <D.20941>; else goto <D.20937>;
      <D.20941>:
      __builtin_prefetch (__old);
      major_copy_or_mark_object_concurrent (_objptr, __old, queue);
      __copy = *_objptr;
      if (0 != 0) goto <D.20942>; else goto <D.20943>;
      <D.20942>:
      if (__old != __copy) goto <D.20944>; else goto <D.20945>;
      <D.20944>:
      gc_debug_file.4 = gc_debug_file;
      D.20946 = *_objptr;
      fprintf (gc_debug_file.4, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.20946, __old);
      gc_debug_file.4 = gc_debug_file;
      fflush (gc_debug_file.4);
      <D.20945>:
      <D.20943>:
      D.20950 = sgen_ptr_in_nursery (__copy);
      if (D.20950 != 0) goto <D.20951>; else goto <D.20948>;
      <D.20951>:
      D.20952 = sgen_ptr_in_nursery (_objptr);
      if (D.20952 == 0) goto <D.20953>; else goto <D.20948>;
      <D.20953>:
      iftmp.20 = 1;
      goto <D.20949>;
      <D.20948>:
      iftmp.20 = 0;
      <D.20949>:
      D.20954 = iftmp.20 != 0;
      D.20955 = (long int) D.20954;
      D.20956 = __builtin_expect (D.20955, 0);
      if (D.20956 != 0) goto <D.20957>; else goto <D.20958>;
      <D.20957>:
      sgen_add_to_global_remset (_objptr, __copy);
      <D.20958>:
      goto <D.20938>;
      <D.20937>:
      D.20962 = sgen_ptr_in_nursery (__old);
      if (D.20962 != 0) goto <D.20963>; else goto <D.20960>;
      <D.20963>:
      D.20964 = sgen_ptr_in_nursery (_objptr);
      if (D.20964 == 0) goto <D.20965>; else goto <D.20960>;
      <D.20965>:
      iftmp.21 = 1;
      goto <D.20961>;
      <D.20960>:
      iftmp.21 = 0;
      <D.20961>:
      D.20966 = iftmp.21 != 0;
      D.20967 = (long int) D.20966;
      D.20968 = __builtin_expect (D.20967, 0);
      if (D.20968 != 0) goto <D.20969>; else goto <D.20970>;
      <D.20969>:
      sgen_add_to_global_remset (_objptr, __old);
      <D.20970>:
      <D.20938>:
    }
    <D.20936>:
    _bmap = _bmap >> 1;
    _objptr = _objptr + 8;
    <D.20292>:
    if (_bmap != 0) goto <D.20291>; else goto <D.20293>;
    <D.20293>:
  }
  goto <D.20237>;
  <D.20294>:
  {
    void * * _objptr;
    gsize * bitmap_data;
    int bwords;
    void * * start_run;

    _objptr = start;
    bitmap_data = sgen_get_complex_descriptor (desc);
    D.20971 = *bitmap_data;
    D.20972 = (unsigned int) D.20971;
    D.20973 = D.20972 + 4294967295;
    bwords = (int) D.20973;
    start_run = _objptr;
    bitmap_data = bitmap_data + 8;
    if (0 != 0) goto <D.20974>; else goto <D.20975>;
    <D.20974>:
    {
      struct MonoObject * myobj;

      myobj = start;
      D.20976 = myobj->vtable;
      D.20977 = D.20976->klass;
      D.20978 = D.20977->name_space;
      D.20976 = myobj->vtable;
      D.20977 = D.20976->klass;
      D.20979 = D.20977->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.20978, D.20979);
    }
    <D.20975>:
    goto <D.20307>;
    <D.20306>:
    {
      gsize _bmap;

      bitmap_data.22 = bitmap_data;
      bitmap_data = bitmap_data.22 + 8;
      _bmap = *bitmap_data.22;
      _objptr = start_run;
      goto <D.20304>;
      <D.20303>:
      D.20981 = _bmap & 1;
      if (D.20981 != 0) goto <D.20982>; else goto <D.20983>;
      <D.20982>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.20986>; else goto <D.20984>;
        <D.20986>:
        D.20987 = sgen_ptr_in_nursery (__old);
        if (D.20987 == 0) goto <D.20988>; else goto <D.20984>;
        <D.20988>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.20989>; else goto <D.20990>;
        <D.20989>:
        if (__old != __copy) goto <D.20991>; else goto <D.20992>;
        <D.20991>:
        gc_debug_file.4 = gc_debug_file;
        D.20993 = *_objptr;
        fprintf (gc_debug_file.4, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.20993, __old);
        gc_debug_file.4 = gc_debug_file;
        fflush (gc_debug_file.4);
        <D.20992>:
        <D.20990>:
        D.20997 = sgen_ptr_in_nursery (__copy);
        if (D.20997 != 0) goto <D.20998>; else goto <D.20995>;
        <D.20998>:
        D.20999 = sgen_ptr_in_nursery (_objptr);
        if (D.20999 == 0) goto <D.21000>; else goto <D.20995>;
        <D.21000>:
        iftmp.23 = 1;
        goto <D.20996>;
        <D.20995>:
        iftmp.23 = 0;
        <D.20996>:
        D.21001 = iftmp.23 != 0;
        D.21002 = (long int) D.21001;
        D.21003 = __builtin_expect (D.21002, 0);
        if (D.21003 != 0) goto <D.21004>; else goto <D.21005>;
        <D.21004>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.21005>:
        goto <D.20985>;
        <D.20984>:
        D.21009 = sgen_ptr_in_nursery (__old);
        if (D.21009 != 0) goto <D.21010>; else goto <D.21007>;
        <D.21010>:
        D.21011 = sgen_ptr_in_nursery (_objptr);
        if (D.21011 == 0) goto <D.21012>; else goto <D.21007>;
        <D.21012>:
        iftmp.24 = 1;
        goto <D.21008>;
        <D.21007>:
        iftmp.24 = 0;
        <D.21008>:
        D.21013 = iftmp.24 != 0;
        D.21014 = (long int) D.21013;
        D.21015 = __builtin_expect (D.21014, 0);
        if (D.21015 != 0) goto <D.21016>; else goto <D.21017>;
        <D.21016>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.21017>:
        <D.20985>:
      }
      <D.20983>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 8;
      <D.20304>:
      if (_bmap != 0) goto <D.20303>; else goto <D.20305>;
      <D.20305>:
      start_run = start_run + 512;
    }
    <D.20307>:
    bwords.25 = bwords;
    bwords = bwords.25 + -1;
    if (bwords.25 > 0) goto <D.20306>; else goto <D.20308>;
    <D.20308>:
  }
  goto <D.20237>;
  <D.20309>:
  goto <D.20237>;
  <D.20310>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
  <D.20237>:
}


major_copy_or_mark_object_concurrent (void * * ptr, void * obj, struct SgenGrayQueue * queue)
{
  int iftmp.26;
  long unsigned int D.21023;
  long unsigned int D.21024;
  long unsigned int D.21026;
  _Bool D.21028;
  long int D.21029;
  long int D.21030;
  int D.21033;
  unsigned int D.21036;
  unsigned int D.21037;
  long unsigned int D.21038;
  long unsigned int obj.27;
  long unsigned int D.21042;
  struct MSBlockHeader * D.21043;
  long int obj.28;
  long int D.21045;
  int D.21046;
  long unsigned int D.21052;
  long int D.21053;
  long unsigned int D.21054;
  long unsigned int D.21055;
  long unsigned int D.21058;
  long unsigned int D.21059;
  long unsigned int D.21060;
  int iftmp.29;
  struct GrayQueueSection * D.21067;
  int D.21069;
  _Bool D.21070;
  long int D.21071;
  long int D.21072;
  int D.21076;
  int D.21077;
  int D.21079;
  struct MonoVTable * D.21082;
  void * D.21083;
  long unsigned int D.21084;
  int D.21085;
  int iftmp.30;
  _Bool D.21093;
  long int D.21094;
  long int D.21095;
  int D.21099;
  int D.21100;

  D.21023 = MEM[(mword *)obj];
  D.21024 = D.21023 & 1;
  if (D.21024 != 0) goto <D.21025>; else goto <D.21021>;
  <D.21025>:
  D.21023 = MEM[(mword *)obj];
  D.21026 = D.21023 & 18446744073709551612;
  if (D.21026 != 0) goto <D.21027>; else goto <D.21021>;
  <D.21027>:
  iftmp.26 = 1;
  goto <D.21022>;
  <D.21021>:
  iftmp.26 = 0;
  <D.21022>:
  D.21028 = iftmp.26 != 0;
  D.21029 = (long int) D.21028;
  D.21030 = __builtin_expect (D.21029, 0);
  if (D.21030 != 0) goto <D.21031>; else goto <D.21032>;
  <D.21031>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 1280, "!SGEN_OBJECT_IS_FORWARDED (obj)");
  <D.21032>:
  D.21033 = sgen_ptr_in_nursery (obj);
  if (D.21033 == 0) goto <D.21034>; else goto <D.21035>;
  <D.21034>:
  {
    mword objsize;

    D.21036 = sgen_safe_object_get_size (obj);
    D.21037 = D.21036 + 7;
    D.21038 = (long unsigned int) D.21037;
    objsize = D.21038 & 4294967288;
    if (objsize <= 8000) goto <D.21039>; else goto <D.21040>;
    <D.21039>:
    {
      struct MSBlockInfo * block;

      obj.27 = (long unsigned int) obj;
      D.21042 = obj.27 & 18446744073709535232;
      D.21043 = (struct MSBlockHeader *) D.21042;
      block = D.21043->info;
      {
        int __word;
        int __bit;

        {
          int i;

          obj.28 = (long int) obj;
          D.21045 = obj.28 >> 3;
          D.21046 = (int) D.21045;
          i = D.21046 & 2047;
          if (0 != 0) goto <D.21047>; else goto <D.21048>;
          <D.21047>:
          __word = i >> 5;
          __bit = i & 31;
          goto <D.21049>;
          <D.21048>:
          __word = i >> 6;
          __bit = i & 63;
          <D.21049>:
        }
        if (0 != 0) goto <D.21050>; else goto <D.21051>;
        <D.21050>:
        monoeg_g_log (0B, 4, "object %p not allocated", obj);
        <D.19956>:
        goto <D.19956>;
        <D.21051>:
        D.21052 = block->mark_words[__word];
        D.21053 = 1 << __bit;
        D.21054 = (long unsigned int) D.21053;
        D.21055 = D.21052 & D.21054;
        if (D.21055 == 0) goto <D.21056>; else goto <D.21057>;
        <D.21056>:
        D.21052 = block->mark_words[__word];
        D.21053 = 1 << __bit;
        D.21054 = (long unsigned int) D.21053;
        D.21058 = D.21052 | D.21054;
        block->mark_words[__word] = D.21058;
        D.21059 = BIT_FIELD_REF <*block, 64, 64>;
        D.21060 = D.21059 & 1073741824;
        if (D.21060 != 0) goto <D.21061>; else goto <D.21062>;
        <D.21061>:
        D.21067 = queue->first;
        if (D.21067 == 0B) goto <D.21064>; else goto <D.21068>;
        <D.21068>:
        D.21067 = queue->first;
        D.21069 = D.21067->end;
        if (D.21069 == 125) goto <D.21064>; else goto <D.21065>;
        <D.21064>:
        iftmp.29 = 1;
        goto <D.21066>;
        <D.21065>:
        iftmp.29 = 0;
        <D.21066>:
        D.21070 = iftmp.29 != 0;
        D.21071 = (long int) D.21070;
        D.21072 = __builtin_expect (D.21071, 0);
        if (D.21072 != 0) goto <D.21073>; else goto <D.21074>;
        <D.21073>:
        sgen_gray_object_enqueue (queue, obj);
        goto <D.21075>;
        <D.21074>:
        D.21067 = queue->first;
        D.21067 = queue->first;
        D.21069 = D.21067->end;
        D.21076 = D.21069;
        D.21077 = D.21076 + 1;
        D.21067->end = D.21077;
        D.21067->objects[D.21076] = obj;
        <D.21075>:
        __builtin_prefetch (obj);
        <D.21062>:
        <D.21057>:
      }
    }
    goto <D.21078>;
    <D.21040>:
    D.21079 = sgen_los_object_is_pinned (obj);
    if (D.21079 != 0) goto <D.21080>; else goto <D.21081>;
    <D.21080>:
    return;
    <D.21081>:
    sgen_los_pin_object (obj);
    D.21023 = MEM[(mword *)obj];
    D.21026 = D.21023 & 18446744073709551612;
    D.21082 = (struct MonoVTable *) D.21026;
    D.21083 = D.21082->gc_descr;
    D.21084 = (long unsigned int) D.21083;
    D.21085 = sgen_gc_descr_has_references (D.21084);
    if (D.21085 != 0) goto <D.21086>; else goto <D.21087>;
    <D.21086>:
    D.21067 = queue->first;
    if (D.21067 == 0B) goto <D.21089>; else goto <D.21092>;
    <D.21092>:
    D.21067 = queue->first;
    D.21069 = D.21067->end;
    if (D.21069 == 125) goto <D.21089>; else goto <D.21090>;
    <D.21089>:
    iftmp.30 = 1;
    goto <D.21091>;
    <D.21090>:
    iftmp.30 = 0;
    <D.21091>:
    D.21093 = iftmp.30 != 0;
    D.21094 = (long int) D.21093;
    D.21095 = __builtin_expect (D.21094, 0);
    if (D.21095 != 0) goto <D.21096>; else goto <D.21097>;
    <D.21096>:
    sgen_gray_object_enqueue (queue, obj);
    goto <D.21098>;
    <D.21097>:
    D.21067 = queue->first;
    D.21067 = queue->first;
    D.21069 = D.21067->end;
    D.21099 = D.21069;
    D.21100 = D.21099 + 1;
    D.21067->end = D.21100;
    D.21067->objects[D.21099] = obj;
    <D.21098>:
    __builtin_prefetch (obj);
    <D.21087>:
    <D.21078>:
  }
  <D.21035>:
}


sgen_safe_object_get_size (struct MonoObject * obj)
{
  char * iftmp.31;
  long unsigned int D.21103;
  long unsigned int D.21104;
  long unsigned int D.21107;
  guint D.21111;
  struct MonoVTable * D.21112;
  char * forwarded;

  D.21103 = MEM[(mword *)obj];
  D.21104 = D.21103 & 1;
  if (D.21104 != 0) goto <D.21105>; else goto <D.21106>;
  <D.21105>:
  D.21103 = MEM[(mword *)obj];
  D.21107 = D.21103 & 18446744073709551612;
  iftmp.31 = (char *) D.21107;
  goto <D.21108>;
  <D.21106>:
  iftmp.31 = 0B;
  <D.21108>:
  forwarded = iftmp.31;
  if (forwarded != 0B) goto <D.21109>; else goto <D.21110>;
  <D.21109>:
  obj = forwarded;
  <D.21110>:
  D.21103 = MEM[(mword *)obj];
  D.21107 = D.21103 & 18446744073709551612;
  D.21112 = (struct MonoVTable *) D.21107;
  D.21111 = sgen_par_object_get_size (D.21112, obj);
  return D.21111;
}


sgen_par_object_get_size (struct MonoVTable * vtable, struct MonoObject * o)
{
  void * D.21114;
  long unsigned int D.21115;
  guint D.21120;
  int D.21121;
  int D.21122;
  unsigned int D.21123;
  long unsigned int D.21126;
  int D.21127;
  unsigned int D.21128;
  unsigned int element_size.32;
  unsigned int D.21130;
  long unsigned int D.21131;
  long unsigned int D.21132;
  struct MonoClass * D.21135;
  unsigned char D.21136;
  long unsigned int D.21137;
  long unsigned int D.21138;
  mword descr;
  mword type;

  D.21114 = vtable->gc_descr;
  descr = (mword) D.21114;
  type = descr & 7;
  D.21115 = type + 18446744073709551615;
  if (D.21115 <= 1) goto <D.21116>; else goto <D.21117>;
  <D.21116>:
  {
    mword size;

    size = descr & 65528;
    if (size == 0) goto <D.21118>; else goto <D.21119>;
    <D.21118>:
    D.21121 = MEM[(struct MonoString *)o].length;
    D.21122 = D.21121 * 2;
    D.21123 = (unsigned int) D.21122;
    D.21120 = D.21123 + 26;
    return D.21120;
    <D.21119>:
    D.21120 = (guint) size;
    return D.21120;
  }
  <D.21117>:
  if (type == 4) goto <D.21124>; else goto <D.21125>;
  <D.21124>:
  {
    int element_size;
    struct MonoArray * array;
    size_t size;

    D.21126 = descr >> 3;
    D.21127 = (int) D.21126;
    element_size = D.21127 & 1023;
    array = o;
    D.21128 = array->max_length;
    element_size.32 = (unsigned int) element_size;
    D.21130 = D.21128 * element_size.32;
    D.21131 = (long unsigned int) D.21130;
    size = D.21131 + 32;
    D.21132 = descr & 8192;
    if (D.21132 != 0) goto <D.21133>; else goto <D.21134>;
    <D.21133>:
    size = size + 3;
    size = size & 18446744073709551612;
    D.21135 = vtable->klass;
    D.21136 = D.21135->rank;
    D.21137 = (long unsigned int) D.21136;
    D.21138 = D.21137 * 8;
    size = D.21138 + size;
    <D.21134>:
    D.21120 = (guint) size;
    return D.21120;
  }
  <D.21125>:
  D.21120 = slow_object_get_size (vtable, o);
  return D.21120;
}


slow_object_get_size (struct MonoVTable * vtable, struct MonoObject * o)
{
  struct MonoClass * D.21140;
  guint D.21143;
  int D.21144;
  int D.21145;
  unsigned int D.21146;
  unsigned char D.21147;
  int D.21150;
  unsigned int D.21151;
  unsigned int D.21152;
  unsigned int D.21153;
  long unsigned int D.21154;
  struct MonoArrayBounds * D.21155;
  _Bool D.21156;
  long int D.21157;
  long int D.21158;
  long unsigned int D.21161;
  long unsigned int D.21162;
  int D.21163;
  struct MonoClass * klass;

  klass = vtable->klass;
  D.21140 = mono_defaults.string_class;
  if (D.21140 == klass) goto <D.21141>; else goto <D.21142>;
  <D.21141>:
  D.21144 = MEM[(struct MonoString *)o].length;
  D.21145 = D.21144 * 2;
  D.21146 = (unsigned int) D.21145;
  D.21143 = D.21146 + 26;
  return D.21143;
  <D.21142>:
  D.21147 = klass->rank;
  if (D.21147 != 0) goto <D.21148>; else goto <D.21149>;
  <D.21148>:
  {
    struct MonoArray * array;
    size_t size;

    array = o;
    D.21150 = klass->sizes.element_size;
    D.21151 = (unsigned int) D.21150;
    D.21152 = array->max_length;
    D.21153 = D.21151 * D.21152;
    D.21154 = (long unsigned int) D.21153;
    size = D.21154 + 32;
    D.21155 = array->bounds;
    D.21156 = D.21155 != 0B;
    D.21157 = (long int) D.21156;
    D.21158 = __builtin_expect (D.21157, 0);
    if (D.21158 != 0) goto <D.21159>; else goto <D.21160>;
    <D.21159>:
    size = size + 3;
    size = size & 18446744073709551612;
    D.21147 = klass->rank;
    D.21161 = (long unsigned int) D.21147;
    D.21162 = D.21161 * 8;
    size = D.21162 + size;
    <D.21160>:
    D.21143 = (guint) size;
    return D.21143;
  }
  <D.21149>:
  D.21163 = klass->instance_size;
  D.21143 = (guint) D.21163;
  return D.21143;
}


sgen_gc_descr_has_references (mword desc)
{
  long unsigned int D.21165;
  gboolean D.21168;
  long unsigned int D.21169;
  long unsigned int D.21172;

  D.21165 = desc & 4294901767;
  if (D.21165 == 1) goto <D.21166>; else goto <D.21167>;
  <D.21166>:
  D.21168 = 0;
  return D.21168;
  <D.21167>:
  D.21169 = desc & 49159;
  if (D.21169 == 4) goto <D.21170>; else goto <D.21171>;
  <D.21170>:
  D.21168 = 0;
  return D.21168;
  <D.21171>:
  D.21172 = desc & 7;
  if (D.21172 == 7) goto <D.21173>; else goto <D.21174>;
  <D.21173>:
  D.21168 = 0;
  return D.21168;
  <D.21174>:
  D.21168 = 1;
  return D.21168;
}


__attribute__((always_inline))
sgen_ptr_in_nursery (void * p)
{
  gboolean D.21176;
  int sgen_nursery_bits.33;
  int D.21178;
  int D.21179;
  long unsigned int D.21180;
  long unsigned int p.34;
  long unsigned int D.21182;
  char * sgen_nursery_start.35;
  long unsigned int sgen_nursery_start.36;
  _Bool D.21185;

  sgen_nursery_bits.33 = sgen_nursery_bits;
  D.21178 = 1 << sgen_nursery_bits.33;
  D.21179 = -D.21178;
  D.21180 = (long unsigned int) D.21179;
  p.34 = (long unsigned int) p;
  D.21182 = D.21180 & p.34;
  sgen_nursery_start.35 = sgen_nursery_start;
  sgen_nursery_start.36 = (long unsigned int) sgen_nursery_start.35;
  D.21185 = D.21182 == sgen_nursery_start.36;
  D.21176 = (gboolean) D.21185;
  return D.21176;
}


major_scan_object_concurrent (char * start, struct SgenGrayQueue * queue)
{
  long unsigned int D.21187;
  long unsigned int D.21188;
  long unsigned int D.21189;
  long unsigned int D.21190;
  long unsigned int D.21193;
  long unsigned int D.21194;
  long unsigned int D.21195;
  long unsigned int D.21196;
  long unsigned int D.21197;
  long unsigned int D.21198;
  int D.21202;
  struct FILE * gc_debug_file.37;
  void * D.21209;
  int iftmp.38;
  int D.21213;
  int D.21215;
  _Bool D.21217;
  long int D.21218;
  long int D.21219;
  int iftmp.39;
  int D.21225;
  int D.21227;
  _Bool D.21229;
  long int D.21230;
  long int D.21231;
  int D.21237;
  int iftmp.40;
  int D.21246;
  int D.21248;
  _Bool D.21250;
  long int D.21251;
  long int D.21252;
  int iftmp.41;
  int D.21258;
  int D.21260;
  _Bool D.21262;
  long int D.21263;
  long int D.21264;
  long unsigned int D.21267;
  long unsigned int D.21268;
  int D.21269;
  int D.21273;
  void * D.21279;
  int iftmp.42;
  int D.21283;
  int D.21285;
  _Bool D.21287;
  long int D.21288;
  long int D.21289;
  int iftmp.43;
  int D.21295;
  int D.21297;
  _Bool D.21299;
  long int D.21300;
  long int D.21301;
  long unsigned int D.21304;
  long unsigned int D.21305;
  int D.21306;
  int D.21310;
  int iftmp.44;
  int D.21319;
  int D.21321;
  _Bool D.21323;
  long int D.21324;
  long int D.21325;
  int iftmp.45;
  int D.21331;
  int D.21333;
  _Bool D.21335;
  long int D.21336;
  long int D.21337;
  long unsigned int D.21340;
  long unsigned int D.21343;
  int D.21344;
  int D.21345;
  unsigned int D.21348;
  unsigned int el_size.46;
  unsigned int D.21350;
  sizetype D.21351;
  int D.21355;
  void * D.21361;
  int iftmp.47;
  int D.21365;
  int D.21367;
  _Bool D.21369;
  long int D.21370;
  long int D.21371;
  int iftmp.48;
  int D.21377;
  int D.21379;
  _Bool D.21381;
  long int D.21382;
  long int D.21383;
  int D.21389;
  int D.21390;
  long unsigned int D.21391;
  long unsigned int D.21392;
  long unsigned int D.21393;
  long unsigned int D.21394;
  void * * D.21395;
  int D.21399;
  void * D.21405;
  int iftmp.49;
  int D.21409;
  int D.21411;
  _Bool D.21413;
  long int D.21414;
  long int D.21415;
  int iftmp.50;
  int D.21421;
  int D.21423;
  _Bool D.21425;
  long int D.21426;
  long int D.21427;
  sizetype D.21430;
  long unsigned int D.21434;
  int D.21440;
  void * D.21446;
  int iftmp.51;
  int D.21450;
  int D.21452;
  _Bool D.21454;
  long int D.21455;
  long int D.21456;
  int iftmp.52;
  int D.21462;
  int D.21464;
  _Bool D.21466;
  long int D.21467;
  long int D.21468;
  long unsigned int D.21471;
  int D.21477;
  void * D.21483;
  int iftmp.53;
  int D.21487;
  int D.21489;
  _Bool D.21491;
  long int D.21492;
  long int D.21493;
  int iftmp.54;
  int D.21499;
  int D.21501;
  _Bool D.21503;
  long int D.21504;
  long int D.21505;
  long unsigned int D.21508;
  unsigned int D.21509;
  unsigned int D.21510;
  struct MonoVTable * D.21513;
  struct MonoClass * D.21514;
  const char * D.21515;
  const char * D.21516;
  gsize * bitmap_data.55;
  long unsigned int D.21518;
  int D.21524;
  void * D.21530;
  int iftmp.56;
  int D.21534;
  int D.21536;
  _Bool D.21538;
  long int D.21539;
  long int D.21540;
  int iftmp.57;
  int D.21546;
  int D.21548;
  _Bool D.21550;
  long int D.21551;
  long int D.21552;
  int bwords.58;
  long unsigned int D.21556;
  gsize * mbitmap_data.59;
  long unsigned int D.21558;
  unsigned int D.21559;
  unsigned int D.21560;
  struct MonoClass * D.21561;
  unsigned int el_size.60;
  unsigned int D.21563;
  sizetype D.21564;
  const char * D.21567;
  const char * D.21568;
  gsize * bitmap_data.61;
  long unsigned int D.21570;
  int D.21576;
  void * D.21582;
  int iftmp.62;
  int D.21586;
  int D.21588;
  _Bool D.21590;
  long int D.21591;
  long int D.21592;
  int iftmp.63;
  int D.21598;
  int D.21600;
  _Bool D.21602;
  long int D.21603;
  long int D.21604;
  unsigned int bwords.64;
  sizetype D.21608;

  {
    struct GCVTable * vt;
    mword desc;

    D.21187 = MEM[(mword *)start];
    D.21188 = D.21187 & 18446744073709551612;
    vt = (struct GCVTable *) D.21188;
    desc = vt->desc;
    D.21189 = desc & 7;
    switch (D.21189) <default: <D.20221>, case 1: <D.20116>, case 2: <D.20127>, case 3: <D.20183>, case 4: <D.20139>, case 5: <D.20175>, case 6: <D.20198>, case 7: <D.20220>>
    <D.20116>:
    D.21190 = desc & 4294901760;
    if (D.21190 != 0) goto <D.21191>; else goto <D.21192>;
    <D.21191>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.21193 = desc >> 16;
      D.21194 = D.21193 & 255;
      D.21195 = D.21194 * 8;
      _objptr = _objptr + D.21195;
      D.21196 = desc >> 24;
      D.21197 = D.21196 & 255;
      D.21198 = D.21197 * 8;
      _objptr_end = _objptr + D.21198;
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.21201>; else goto <D.21199>;
        <D.21201>:
        D.21202 = sgen_ptr_in_nursery (__old);
        if (D.21202 == 0) goto <D.21203>; else goto <D.21199>;
        <D.21203>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.21204>; else goto <D.21205>;
        <D.21204>:
        if (__old != __copy) goto <D.21206>; else goto <D.21207>;
        <D.21206>:
        gc_debug_file.37 = gc_debug_file;
        D.21209 = *_objptr;
        fprintf (gc_debug_file.37, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21209, __old);
        gc_debug_file.37 = gc_debug_file;
        fflush (gc_debug_file.37);
        <D.21207>:
        <D.21205>:
        D.21213 = sgen_ptr_in_nursery (__copy);
        if (D.21213 != 0) goto <D.21214>; else goto <D.21211>;
        <D.21214>:
        D.21215 = sgen_ptr_in_nursery (_objptr);
        if (D.21215 == 0) goto <D.21216>; else goto <D.21211>;
        <D.21216>:
        iftmp.38 = 1;
        goto <D.21212>;
        <D.21211>:
        iftmp.38 = 0;
        <D.21212>:
        D.21217 = iftmp.38 != 0;
        D.21218 = (long int) D.21217;
        D.21219 = __builtin_expect (D.21218, 0);
        if (D.21219 != 0) goto <D.21220>; else goto <D.21221>;
        <D.21220>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.21221>:
        goto <D.21200>;
        <D.21199>:
        D.21225 = sgen_ptr_in_nursery (__old);
        if (D.21225 != 0) goto <D.21226>; else goto <D.21223>;
        <D.21226>:
        D.21227 = sgen_ptr_in_nursery (_objptr);
        if (D.21227 == 0) goto <D.21228>; else goto <D.21223>;
        <D.21228>:
        iftmp.39 = 1;
        goto <D.21224>;
        <D.21223>:
        iftmp.39 = 0;
        <D.21224>:
        D.21229 = iftmp.39 != 0;
        D.21230 = (long int) D.21229;
        D.21231 = __builtin_expect (D.21230, 0);
        if (D.21231 != 0) goto <D.21232>; else goto <D.21233>;
        <D.21232>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.21233>:
        <D.21200>:
      }
      _objptr = _objptr + 8;
      goto <D.20124>;
      <D.20123>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.21236>; else goto <D.21234>;
        <D.21236>:
        D.21237 = sgen_ptr_in_nursery (__old);
        if (D.21237 == 0) goto <D.21238>; else goto <D.21234>;
        <D.21238>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.21239>; else goto <D.21240>;
        <D.21239>:
        if (__old != __copy) goto <D.21241>; else goto <D.21242>;
        <D.21241>:
        gc_debug_file.37 = gc_debug_file;
        D.21209 = *_objptr;
        fprintf (gc_debug_file.37, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21209, __old);
        gc_debug_file.37 = gc_debug_file;
        fflush (gc_debug_file.37);
        <D.21242>:
        <D.21240>:
        D.21246 = sgen_ptr_in_nursery (__copy);
        if (D.21246 != 0) goto <D.21247>; else goto <D.21244>;
        <D.21247>:
        D.21248 = sgen_ptr_in_nursery (_objptr);
        if (D.21248 == 0) goto <D.21249>; else goto <D.21244>;
        <D.21249>:
        iftmp.40 = 1;
        goto <D.21245>;
        <D.21244>:
        iftmp.40 = 0;
        <D.21245>:
        D.21250 = iftmp.40 != 0;
        D.21251 = (long int) D.21250;
        D.21252 = __builtin_expect (D.21251, 0);
        if (D.21252 != 0) goto <D.21253>; else goto <D.21254>;
        <D.21253>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.21254>:
        goto <D.21235>;
        <D.21234>:
        D.21258 = sgen_ptr_in_nursery (__old);
        if (D.21258 != 0) goto <D.21259>; else goto <D.21256>;
        <D.21259>:
        D.21260 = sgen_ptr_in_nursery (_objptr);
        if (D.21260 == 0) goto <D.21261>; else goto <D.21256>;
        <D.21261>:
        iftmp.41 = 1;
        goto <D.21257>;
        <D.21256>:
        iftmp.41 = 0;
        <D.21257>:
        D.21262 = iftmp.41 != 0;
        D.21263 = (long int) D.21262;
        D.21264 = __builtin_expect (D.21263, 0);
        if (D.21264 != 0) goto <D.21265>; else goto <D.21266>;
        <D.21265>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.21266>:
        <D.21235>:
      }
      _objptr = _objptr + 8;
      <D.20124>:
      if (_objptr < _objptr_end) goto <D.20123>; else goto <D.20125>;
      <D.20125>:
    }
    <D.21192>:
    goto <D.20126>;
    <D.20127>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 16;
      _objptr = _objptr + 16;
      {
        int _index;

        _index = __builtin_ctzl (_bmap);
        D.21267 = (long unsigned int) _index;
        D.21268 = D.21267 * 8;
        _objptr = _objptr + D.21268;
        D.21269 = _index + 1;
        _bmap = _bmap >> D.21269;
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.21272>; else goto <D.21270>;
          <D.21272>:
          D.21273 = sgen_ptr_in_nursery (__old);
          if (D.21273 == 0) goto <D.21274>; else goto <D.21270>;
          <D.21274>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object_concurrent (_objptr, __old, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.21275>; else goto <D.21276>;
          <D.21275>:
          if (__old != __copy) goto <D.21277>; else goto <D.21278>;
          <D.21277>:
          gc_debug_file.37 = gc_debug_file;
          D.21279 = *_objptr;
          fprintf (gc_debug_file.37, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21279, __old);
          gc_debug_file.37 = gc_debug_file;
          fflush (gc_debug_file.37);
          <D.21278>:
          <D.21276>:
          D.21283 = sgen_ptr_in_nursery (__copy);
          if (D.21283 != 0) goto <D.21284>; else goto <D.21281>;
          <D.21284>:
          D.21285 = sgen_ptr_in_nursery (_objptr);
          if (D.21285 == 0) goto <D.21286>; else goto <D.21281>;
          <D.21286>:
          iftmp.42 = 1;
          goto <D.21282>;
          <D.21281>:
          iftmp.42 = 0;
          <D.21282>:
          D.21287 = iftmp.42 != 0;
          D.21288 = (long int) D.21287;
          D.21289 = __builtin_expect (D.21288, 0);
          if (D.21289 != 0) goto <D.21290>; else goto <D.21291>;
          <D.21290>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.21291>:
          goto <D.21271>;
          <D.21270>:
          D.21295 = sgen_ptr_in_nursery (__old);
          if (D.21295 != 0) goto <D.21296>; else goto <D.21293>;
          <D.21296>:
          D.21297 = sgen_ptr_in_nursery (_objptr);
          if (D.21297 == 0) goto <D.21298>; else goto <D.21293>;
          <D.21298>:
          iftmp.43 = 1;
          goto <D.21294>;
          <D.21293>:
          iftmp.43 = 0;
          <D.21294>:
          D.21299 = iftmp.43 != 0;
          D.21300 = (long int) D.21299;
          D.21301 = __builtin_expect (D.21300, 0);
          if (D.21301 != 0) goto <D.21302>; else goto <D.21303>;
          <D.21302>:
          sgen_add_to_global_remset (_objptr, __old);
          <D.21303>:
          <D.21271>:
        }
        _objptr = _objptr + 8;
      }
      goto <D.20137>;
      <D.20136>:
      {
        int _index;

        _index = __builtin_ctzl (_bmap);
        D.21304 = (long unsigned int) _index;
        D.21305 = D.21304 * 8;
        _objptr = _objptr + D.21305;
        D.21306 = _index + 1;
        _bmap = _bmap >> D.21306;
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.21309>; else goto <D.21307>;
          <D.21309>:
          D.21310 = sgen_ptr_in_nursery (__old);
          if (D.21310 == 0) goto <D.21311>; else goto <D.21307>;
          <D.21311>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object_concurrent (_objptr, __old, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.21312>; else goto <D.21313>;
          <D.21312>:
          if (__old != __copy) goto <D.21314>; else goto <D.21315>;
          <D.21314>:
          gc_debug_file.37 = gc_debug_file;
          D.21279 = *_objptr;
          fprintf (gc_debug_file.37, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21279, __old);
          gc_debug_file.37 = gc_debug_file;
          fflush (gc_debug_file.37);
          <D.21315>:
          <D.21313>:
          D.21319 = sgen_ptr_in_nursery (__copy);
          if (D.21319 != 0) goto <D.21320>; else goto <D.21317>;
          <D.21320>:
          D.21321 = sgen_ptr_in_nursery (_objptr);
          if (D.21321 == 0) goto <D.21322>; else goto <D.21317>;
          <D.21322>:
          iftmp.44 = 1;
          goto <D.21318>;
          <D.21317>:
          iftmp.44 = 0;
          <D.21318>:
          D.21323 = iftmp.44 != 0;
          D.21324 = (long int) D.21323;
          D.21325 = __builtin_expect (D.21324, 0);
          if (D.21325 != 0) goto <D.21326>; else goto <D.21327>;
          <D.21326>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.21327>:
          goto <D.21308>;
          <D.21307>:
          D.21331 = sgen_ptr_in_nursery (__old);
          if (D.21331 != 0) goto <D.21332>; else goto <D.21329>;
          <D.21332>:
          D.21333 = sgen_ptr_in_nursery (_objptr);
          if (D.21333 == 0) goto <D.21334>; else goto <D.21329>;
          <D.21334>:
          iftmp.45 = 1;
          goto <D.21330>;
          <D.21329>:
          iftmp.45 = 0;
          <D.21330>:
          D.21335 = iftmp.45 != 0;
          D.21336 = (long int) D.21335;
          D.21337 = __builtin_expect (D.21336, 0);
          if (D.21337 != 0) goto <D.21338>; else goto <D.21339>;
          <D.21338>:
          sgen_add_to_global_remset (_objptr, __old);
          <D.21339>:
          <D.21308>:
        }
        _objptr = _objptr + 8;
      }
      <D.20137>:
      if (_bmap != 0) goto <D.20136>; else goto <D.20138>;
      <D.20138>:
    }
    goto <D.20126>;
    <D.20139>:
    D.21340 = desc & 4294950912;
    if (D.21340 != 0) goto <D.21341>; else goto <D.21342>;
    <D.21341>:
    {
      int el_size;
      int etype;

      D.21343 = desc >> 3;
      D.21344 = (int) D.21343;
      el_size = D.21344 & 1023;
      D.21345 = (int) desc;
      etype = D.21345 & 49152;
      if (etype == 16384) goto <D.21346>; else goto <D.21347>;
      <D.21346>:
      {
        void * * p;
        void * * end_refs;

        p = start + 32;
        D.21348 = MEM[(struct MonoArray *)start].max_length;
        el_size.46 = (unsigned int) el_size;
        D.21350 = D.21348 * el_size.46;
        D.21351 = (sizetype) D.21350;
        end_refs = p + D.21351;
        goto <D.20147>;
        <D.20146>:
        {
          void * __old;
          void * __copy;

          __old = *p;
          if (__old != 0B) goto <D.21354>; else goto <D.21352>;
          <D.21354>:
          D.21355 = sgen_ptr_in_nursery (__old);
          if (D.21355 == 0) goto <D.21356>; else goto <D.21352>;
          <D.21356>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object_concurrent (p, __old, queue);
          __copy = *p;
          if (0 != 0) goto <D.21357>; else goto <D.21358>;
          <D.21357>:
          if (__old != __copy) goto <D.21359>; else goto <D.21360>;
          <D.21359>:
          gc_debug_file.37 = gc_debug_file;
          D.21361 = *p;
          fprintf (gc_debug_file.37, "Overwrote field at %p with %p (was: %p)\n", p, D.21361, __old);
          gc_debug_file.37 = gc_debug_file;
          fflush (gc_debug_file.37);
          <D.21360>:
          <D.21358>:
          D.21365 = sgen_ptr_in_nursery (__copy);
          if (D.21365 != 0) goto <D.21366>; else goto <D.21363>;
          <D.21366>:
          D.21367 = sgen_ptr_in_nursery (p);
          if (D.21367 == 0) goto <D.21368>; else goto <D.21363>;
          <D.21368>:
          iftmp.47 = 1;
          goto <D.21364>;
          <D.21363>:
          iftmp.47 = 0;
          <D.21364>:
          D.21369 = iftmp.47 != 0;
          D.21370 = (long int) D.21369;
          D.21371 = __builtin_expect (D.21370, 0);
          if (D.21371 != 0) goto <D.21372>; else goto <D.21373>;
          <D.21372>:
          sgen_add_to_global_remset (p, __copy);
          <D.21373>:
          goto <D.21353>;
          <D.21352>:
          D.21377 = sgen_ptr_in_nursery (__old);
          if (D.21377 != 0) goto <D.21378>; else goto <D.21375>;
          <D.21378>:
          D.21379 = sgen_ptr_in_nursery (p);
          if (D.21379 == 0) goto <D.21380>; else goto <D.21375>;
          <D.21380>:
          iftmp.48 = 1;
          goto <D.21376>;
          <D.21375>:
          iftmp.48 = 0;
          <D.21376>:
          D.21381 = iftmp.48 != 0;
          D.21382 = (long int) D.21381;
          D.21383 = __builtin_expect (D.21382, 0);
          if (D.21383 != 0) goto <D.21384>; else goto <D.21385>;
          <D.21384>:
          sgen_add_to_global_remset (p, __old);
          <D.21385>:
          <D.21353>:
        }
        p = p + 8;
        <D.20147>:
        if (p < end_refs) goto <D.20146>; else goto <D.20148>;
        <D.20148>:
      }
      goto <D.21386>;
      <D.21347>:
      if (etype == 32768) goto <D.21387>; else goto <D.21388>;
      <D.21387>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.21193 = desc >> 16;
        D.21389 = (int) D.21193;
        offset = D.21389 & 255;
        D.21196 = desc >> 24;
        D.21390 = (int) D.21196;
        num_refs = D.21390 & 255;
        e_start = start + 32;
        D.21348 = MEM[(struct MonoArray *)start].max_length;
        el_size.46 = (unsigned int) el_size;
        D.21350 = D.21348 * el_size.46;
        D.21351 = (sizetype) D.21350;
        e_end = e_start + D.21351;
        goto <D.20161>;
        <D.20160>:
        {
          void * * p;
          int i;

          p = e_start;
          D.21391 = (long unsigned int) offset;
          D.21392 = D.21391 * 8;
          p = p + D.21392;
          i = 0;
          goto <D.20158>;
          <D.20157>:
          {
            void * __old;
            void * __copy;

            D.21393 = (long unsigned int) i;
            D.21394 = D.21393 * 8;
            D.21395 = p + D.21394;
            __old = *D.21395;
            if (__old != 0B) goto <D.21398>; else goto <D.21396>;
            <D.21398>:
            D.21399 = sgen_ptr_in_nursery (__old);
            if (D.21399 == 0) goto <D.21400>; else goto <D.21396>;
            <D.21400>:
            __builtin_prefetch (__old);
            D.21393 = (long unsigned int) i;
            D.21394 = D.21393 * 8;
            D.21395 = p + D.21394;
            major_copy_or_mark_object_concurrent (D.21395, __old, queue);
            D.21393 = (long unsigned int) i;
            D.21394 = D.21393 * 8;
            D.21395 = p + D.21394;
            __copy = *D.21395;
            if (0 != 0) goto <D.21401>; else goto <D.21402>;
            <D.21401>:
            if (__old != __copy) goto <D.21403>; else goto <D.21404>;
            <D.21403>:
            gc_debug_file.37 = gc_debug_file;
            D.21393 = (long unsigned int) i;
            D.21394 = D.21393 * 8;
            D.21395 = p + D.21394;
            D.21393 = (long unsigned int) i;
            D.21394 = D.21393 * 8;
            D.21395 = p + D.21394;
            D.21405 = *D.21395;
            fprintf (gc_debug_file.37, "Overwrote field at %p with %p (was: %p)\n", D.21395, D.21405, __old);
            gc_debug_file.37 = gc_debug_file;
            fflush (gc_debug_file.37);
            <D.21404>:
            <D.21402>:
            D.21409 = sgen_ptr_in_nursery (__copy);
            if (D.21409 != 0) goto <D.21410>; else goto <D.21407>;
            <D.21410>:
            D.21393 = (long unsigned int) i;
            D.21394 = D.21393 * 8;
            D.21395 = p + D.21394;
            D.21411 = sgen_ptr_in_nursery (D.21395);
            if (D.21411 == 0) goto <D.21412>; else goto <D.21407>;
            <D.21412>:
            iftmp.49 = 1;
            goto <D.21408>;
            <D.21407>:
            iftmp.49 = 0;
            <D.21408>:
            D.21413 = iftmp.49 != 0;
            D.21414 = (long int) D.21413;
            D.21415 = __builtin_expect (D.21414, 0);
            if (D.21415 != 0) goto <D.21416>; else goto <D.21417>;
            <D.21416>:
            D.21393 = (long unsigned int) i;
            D.21394 = D.21393 * 8;
            D.21395 = p + D.21394;
            sgen_add_to_global_remset (D.21395, __copy);
            <D.21417>:
            goto <D.21397>;
            <D.21396>:
            D.21421 = sgen_ptr_in_nursery (__old);
            if (D.21421 != 0) goto <D.21422>; else goto <D.21419>;
            <D.21422>:
            D.21393 = (long unsigned int) i;
            D.21394 = D.21393 * 8;
            D.21395 = p + D.21394;
            D.21423 = sgen_ptr_in_nursery (D.21395);
            if (D.21423 == 0) goto <D.21424>; else goto <D.21419>;
            <D.21424>:
            iftmp.50 = 1;
            goto <D.21420>;
            <D.21419>:
            iftmp.50 = 0;
            <D.21420>:
            D.21425 = iftmp.50 != 0;
            D.21426 = (long int) D.21425;
            D.21427 = __builtin_expect (D.21426, 0);
            if (D.21427 != 0) goto <D.21428>; else goto <D.21429>;
            <D.21428>:
            D.21393 = (long unsigned int) i;
            D.21394 = D.21393 * 8;
            D.21395 = p + D.21394;
            sgen_add_to_global_remset (D.21395, __old);
            <D.21429>:
            <D.21397>:
          }
          i = i + 1;
          <D.20158>:
          if (i < num_refs) goto <D.20157>; else goto <D.20159>;
          <D.20159>:
          D.21430 = (sizetype) el_size;
          e_start = e_start + D.21430;
        }
        <D.20161>:
        if (e_start < e_end) goto <D.20160>; else goto <D.20162>;
        <D.20162>:
      }
      goto <D.21431>;
      <D.21388>:
      if (etype == 49152) goto <D.21432>; else goto <D.21433>;
      <D.21432>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 32;
        D.21348 = MEM[(struct MonoArray *)start].max_length;
        el_size.46 = (unsigned int) el_size;
        D.21350 = D.21348 * el_size.46;
        D.21351 = (sizetype) D.21350;
        e_end = e_start + D.21351;
        goto <D.20173>;
        <D.20172>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.20170>;
          <D.20169>:
          D.21434 = _bmap & 1;
          if (D.21434 != 0) goto <D.21435>; else goto <D.21436>;
          <D.21435>:
          {
            void * __old;
            void * __copy;

            __old = *p;
            if (__old != 0B) goto <D.21439>; else goto <D.21437>;
            <D.21439>:
            D.21440 = sgen_ptr_in_nursery (__old);
            if (D.21440 == 0) goto <D.21441>; else goto <D.21437>;
            <D.21441>:
            __builtin_prefetch (__old);
            major_copy_or_mark_object_concurrent (p, __old, queue);
            __copy = *p;
            if (0 != 0) goto <D.21442>; else goto <D.21443>;
            <D.21442>:
            if (__old != __copy) goto <D.21444>; else goto <D.21445>;
            <D.21444>:
            gc_debug_file.37 = gc_debug_file;
            D.21446 = *p;
            fprintf (gc_debug_file.37, "Overwrote field at %p with %p (was: %p)\n", p, D.21446, __old);
            gc_debug_file.37 = gc_debug_file;
            fflush (gc_debug_file.37);
            <D.21445>:
            <D.21443>:
            D.21450 = sgen_ptr_in_nursery (__copy);
            if (D.21450 != 0) goto <D.21451>; else goto <D.21448>;
            <D.21451>:
            D.21452 = sgen_ptr_in_nursery (p);
            if (D.21452 == 0) goto <D.21453>; else goto <D.21448>;
            <D.21453>:
            iftmp.51 = 1;
            goto <D.21449>;
            <D.21448>:
            iftmp.51 = 0;
            <D.21449>:
            D.21454 = iftmp.51 != 0;
            D.21455 = (long int) D.21454;
            D.21456 = __builtin_expect (D.21455, 0);
            if (D.21456 != 0) goto <D.21457>; else goto <D.21458>;
            <D.21457>:
            sgen_add_to_global_remset (p, __copy);
            <D.21458>:
            goto <D.21438>;
            <D.21437>:
            D.21462 = sgen_ptr_in_nursery (__old);
            if (D.21462 != 0) goto <D.21463>; else goto <D.21460>;
            <D.21463>:
            D.21464 = sgen_ptr_in_nursery (p);
            if (D.21464 == 0) goto <D.21465>; else goto <D.21460>;
            <D.21465>:
            iftmp.52 = 1;
            goto <D.21461>;
            <D.21460>:
            iftmp.52 = 0;
            <D.21461>:
            D.21466 = iftmp.52 != 0;
            D.21467 = (long int) D.21466;
            D.21468 = __builtin_expect (D.21467, 0);
            if (D.21468 != 0) goto <D.21469>; else goto <D.21470>;
            <D.21469>:
            sgen_add_to_global_remset (p, __old);
            <D.21470>:
            <D.21438>:
          }
          <D.21436>:
          _bmap = _bmap >> 1;
          p = p + 8;
          <D.20170>:
          if (_bmap != 0) goto <D.20169>; else goto <D.20171>;
          <D.20171>:
          D.21430 = (sizetype) el_size;
          e_start = e_start + D.21430;
        }
        <D.20173>:
        if (e_start < e_end) goto <D.20172>; else goto <D.20174>;
        <D.20174>:
      }
      <D.21433>:
      <D.21431>:
      <D.21386>:
    }
    <D.21342>:
    goto <D.20126>;
    <D.20175>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 16;
      goto <D.20181>;
      <D.20180>:
      D.21471 = _bmap & 1;
      if (D.21471 != 0) goto <D.21472>; else goto <D.21473>;
      <D.21472>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.21476>; else goto <D.21474>;
        <D.21476>:
        D.21477 = sgen_ptr_in_nursery (__old);
        if (D.21477 == 0) goto <D.21478>; else goto <D.21474>;
        <D.21478>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.21479>; else goto <D.21480>;
        <D.21479>:
        if (__old != __copy) goto <D.21481>; else goto <D.21482>;
        <D.21481>:
        gc_debug_file.37 = gc_debug_file;
        D.21483 = *_objptr;
        fprintf (gc_debug_file.37, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21483, __old);
        gc_debug_file.37 = gc_debug_file;
        fflush (gc_debug_file.37);
        <D.21482>:
        <D.21480>:
        D.21487 = sgen_ptr_in_nursery (__copy);
        if (D.21487 != 0) goto <D.21488>; else goto <D.21485>;
        <D.21488>:
        D.21489 = sgen_ptr_in_nursery (_objptr);
        if (D.21489 == 0) goto <D.21490>; else goto <D.21485>;
        <D.21490>:
        iftmp.53 = 1;
        goto <D.21486>;
        <D.21485>:
        iftmp.53 = 0;
        <D.21486>:
        D.21491 = iftmp.53 != 0;
        D.21492 = (long int) D.21491;
        D.21493 = __builtin_expect (D.21492, 0);
        if (D.21493 != 0) goto <D.21494>; else goto <D.21495>;
        <D.21494>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.21495>:
        goto <D.21475>;
        <D.21474>:
        D.21499 = sgen_ptr_in_nursery (__old);
        if (D.21499 != 0) goto <D.21500>; else goto <D.21497>;
        <D.21500>:
        D.21501 = sgen_ptr_in_nursery (_objptr);
        if (D.21501 == 0) goto <D.21502>; else goto <D.21497>;
        <D.21502>:
        iftmp.54 = 1;
        goto <D.21498>;
        <D.21497>:
        iftmp.54 = 0;
        <D.21498>:
        D.21503 = iftmp.54 != 0;
        D.21504 = (long int) D.21503;
        D.21505 = __builtin_expect (D.21504, 0);
        if (D.21505 != 0) goto <D.21506>; else goto <D.21507>;
        <D.21506>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.21507>:
        <D.21475>:
      }
      <D.21473>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 8;
      <D.20181>:
      if (_bmap != 0) goto <D.20180>; else goto <D.20182>;
      <D.20182>:
    }
    goto <D.20126>;
    <D.20183>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.21508 = *bitmap_data;
      D.21509 = (unsigned int) D.21508;
      D.21510 = D.21509 + 4294967295;
      bwords = (int) D.21510;
      start_run = _objptr;
      bitmap_data = bitmap_data + 8;
      if (0 != 0) goto <D.21511>; else goto <D.21512>;
      <D.21511>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.21513 = myobj->vtable;
        D.21514 = D.21513->klass;
        D.21515 = D.21514->name_space;
        D.21513 = myobj->vtable;
        D.21514 = D.21513->klass;
        D.21516 = D.21514->name;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.21515, D.21516);
      }
      <D.21512>:
      goto <D.20196>;
      <D.20195>:
      {
        gsize _bmap;

        bitmap_data.55 = bitmap_data;
        bitmap_data = bitmap_data.55 + 8;
        _bmap = *bitmap_data.55;
        _objptr = start_run;
        goto <D.20193>;
        <D.20192>:
        D.21518 = _bmap & 1;
        if (D.21518 != 0) goto <D.21519>; else goto <D.21520>;
        <D.21519>:
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.21523>; else goto <D.21521>;
          <D.21523>:
          D.21524 = sgen_ptr_in_nursery (__old);
          if (D.21524 == 0) goto <D.21525>; else goto <D.21521>;
          <D.21525>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object_concurrent (_objptr, __old, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.21526>; else goto <D.21527>;
          <D.21526>:
          if (__old != __copy) goto <D.21528>; else goto <D.21529>;
          <D.21528>:
          gc_debug_file.37 = gc_debug_file;
          D.21530 = *_objptr;
          fprintf (gc_debug_file.37, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21530, __old);
          gc_debug_file.37 = gc_debug_file;
          fflush (gc_debug_file.37);
          <D.21529>:
          <D.21527>:
          D.21534 = sgen_ptr_in_nursery (__copy);
          if (D.21534 != 0) goto <D.21535>; else goto <D.21532>;
          <D.21535>:
          D.21536 = sgen_ptr_in_nursery (_objptr);
          if (D.21536 == 0) goto <D.21537>; else goto <D.21532>;
          <D.21537>:
          iftmp.56 = 1;
          goto <D.21533>;
          <D.21532>:
          iftmp.56 = 0;
          <D.21533>:
          D.21538 = iftmp.56 != 0;
          D.21539 = (long int) D.21538;
          D.21540 = __builtin_expect (D.21539, 0);
          if (D.21540 != 0) goto <D.21541>; else goto <D.21542>;
          <D.21541>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.21542>:
          goto <D.21522>;
          <D.21521>:
          D.21546 = sgen_ptr_in_nursery (__old);
          if (D.21546 != 0) goto <D.21547>; else goto <D.21544>;
          <D.21547>:
          D.21548 = sgen_ptr_in_nursery (_objptr);
          if (D.21548 == 0) goto <D.21549>; else goto <D.21544>;
          <D.21549>:
          iftmp.57 = 1;
          goto <D.21545>;
          <D.21544>:
          iftmp.57 = 0;
          <D.21545>:
          D.21550 = iftmp.57 != 0;
          D.21551 = (long int) D.21550;
          D.21552 = __builtin_expect (D.21551, 0);
          if (D.21552 != 0) goto <D.21553>; else goto <D.21554>;
          <D.21553>:
          sgen_add_to_global_remset (_objptr, __old);
          <D.21554>:
          <D.21522>:
        }
        <D.21520>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 8;
        <D.20193>:
        if (_bmap != 0) goto <D.20192>; else goto <D.20194>;
        <D.20194>:
        start_run = start_run + 512;
      }
      <D.20196>:
      bwords.58 = bwords;
      bwords = bwords.58 + -1;
      if (bwords.58 > 0) goto <D.20195>; else goto <D.20197>;
      <D.20197>:
    }
    goto <D.20126>;
    <D.20198>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.21556 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.21556);
      mbitmap_data.59 = mbitmap_data;
      mbitmap_data = mbitmap_data.59 + 8;
      D.21558 = *mbitmap_data.59;
      D.21559 = (unsigned int) D.21558;
      D.21560 = D.21559 + 4294967295;
      mbwords = (int) D.21560;
      D.21561 = vt->klass;
      el_size = mono_array_element_size (D.21561);
      e_start = start + 32;
      D.21348 = MEM[(struct MonoArray *)start].max_length;
      el_size.60 = (unsigned int) el_size;
      D.21563 = D.21348 * el_size.60;
      D.21564 = (sizetype) D.21563;
      e_end = e_start + D.21564;
      if (0 != 0) goto <D.21565>; else goto <D.21566>;
      <D.21565>:
      D.21556 = vt->desc;
      D.21561 = vt->klass;
      D.21567 = D.21561->name_space;
      D.21561 = vt->klass;
      D.21568 = D.21561->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.21556, D.21567, D.21568);
      <D.21566>:
      goto <D.20218>;
      <D.20217>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

        _objptr = e_start;
        bitmap_data = mbitmap_data;
        bwords = (unsigned int) mbwords;
        goto <D.20215>;
        <D.20214>:
        {
          gsize _bmap;
          void * * start_run;

          bitmap_data.61 = bitmap_data;
          bitmap_data = bitmap_data.61 + 8;
          _bmap = *bitmap_data.61;
          start_run = _objptr;
          goto <D.20212>;
          <D.20211>:
          D.21570 = _bmap & 1;
          if (D.21570 != 0) goto <D.21571>; else goto <D.21572>;
          <D.21571>:
          {
            void * __old;
            void * __copy;

            __old = *_objptr;
            if (__old != 0B) goto <D.21575>; else goto <D.21573>;
            <D.21575>:
            D.21576 = sgen_ptr_in_nursery (__old);
            if (D.21576 == 0) goto <D.21577>; else goto <D.21573>;
            <D.21577>:
            __builtin_prefetch (__old);
            major_copy_or_mark_object_concurrent (_objptr, __old, queue);
            __copy = *_objptr;
            if (0 != 0) goto <D.21578>; else goto <D.21579>;
            <D.21578>:
            if (__old != __copy) goto <D.21580>; else goto <D.21581>;
            <D.21580>:
            gc_debug_file.37 = gc_debug_file;
            D.21582 = *_objptr;
            fprintf (gc_debug_file.37, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21582, __old);
            gc_debug_file.37 = gc_debug_file;
            fflush (gc_debug_file.37);
            <D.21581>:
            <D.21579>:
            D.21586 = sgen_ptr_in_nursery (__copy);
            if (D.21586 != 0) goto <D.21587>; else goto <D.21584>;
            <D.21587>:
            D.21588 = sgen_ptr_in_nursery (_objptr);
            if (D.21588 == 0) goto <D.21589>; else goto <D.21584>;
            <D.21589>:
            iftmp.62 = 1;
            goto <D.21585>;
            <D.21584>:
            iftmp.62 = 0;
            <D.21585>:
            D.21590 = iftmp.62 != 0;
            D.21591 = (long int) D.21590;
            D.21592 = __builtin_expect (D.21591, 0);
            if (D.21592 != 0) goto <D.21593>; else goto <D.21594>;
            <D.21593>:
            sgen_add_to_global_remset (_objptr, __copy);
            <D.21594>:
            goto <D.21574>;
            <D.21573>:
            D.21598 = sgen_ptr_in_nursery (__old);
            if (D.21598 != 0) goto <D.21599>; else goto <D.21596>;
            <D.21599>:
            D.21600 = sgen_ptr_in_nursery (_objptr);
            if (D.21600 == 0) goto <D.21601>; else goto <D.21596>;
            <D.21601>:
            iftmp.63 = 1;
            goto <D.21597>;
            <D.21596>:
            iftmp.63 = 0;
            <D.21597>:
            D.21602 = iftmp.63 != 0;
            D.21603 = (long int) D.21602;
            D.21604 = __builtin_expect (D.21603, 0);
            if (D.21604 != 0) goto <D.21605>; else goto <D.21606>;
            <D.21605>:
            sgen_add_to_global_remset (_objptr, __old);
            <D.21606>:
            <D.21574>:
          }
          <D.21572>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 8;
          <D.20212>:
          if (_bmap != 0) goto <D.20211>; else goto <D.20213>;
          <D.20213>:
          _objptr = start_run + 512;
        }
        <D.20215>:
        bwords.64 = bwords;
        bwords = bwords.64 + 4294967295;
        if (bwords.64 != 0) goto <D.20214>; else goto <D.20216>;
        <D.20216>:
        D.21608 = (sizetype) el_size;
        e_start = e_start + D.21608;
      }
      <D.20218>:
      if (e_start < e_end) goto <D.20217>; else goto <D.20219>;
      <D.20219>:
    }
    goto <D.20126>;
    <D.20220>:
    goto <D.20126>;
    <D.20221>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.20126>:
  }
}


major_copy_or_mark_object_concurrent_canonical (void * * ptr, struct SgenGrayQueue * queue)
{
  void * D.21610;

  D.21610 = *ptr;
  major_copy_or_mark_object_concurrent (ptr, D.21610, queue);
}


major_scan_object (char * start, struct SgenGrayQueue * queue)
{
  long unsigned int D.21611;
  long unsigned int D.21612;
  long unsigned int D.21613;
  long unsigned int D.21614;
  long unsigned int D.21617;
  long unsigned int D.21618;
  long unsigned int D.21619;
  long unsigned int D.21620;
  long unsigned int D.21621;
  long unsigned int D.21622;
  struct FILE * gc_debug_file.65;
  void * D.21630;
  int iftmp.66;
  int D.21634;
  int D.21636;
  _Bool D.21638;
  long int D.21639;
  long int D.21640;
  int iftmp.67;
  int D.21655;
  int D.21657;
  _Bool D.21659;
  long int D.21660;
  long int D.21661;
  long unsigned int D.21667;
  long unsigned int D.21668;
  int D.21669;
  void * D.21676;
  int iftmp.68;
  int D.21680;
  int D.21682;
  _Bool D.21684;
  long int D.21685;
  long int D.21686;
  long unsigned int D.21692;
  long unsigned int D.21693;
  int D.21694;
  int iftmp.69;
  int D.21704;
  int D.21706;
  _Bool D.21708;
  long int D.21709;
  long int D.21710;
  long unsigned int D.21716;
  long unsigned int D.21719;
  int D.21720;
  int D.21721;
  unsigned int D.21724;
  unsigned int el_size.70;
  unsigned int D.21726;
  sizetype D.21727;
  void * D.21734;
  int iftmp.71;
  int D.21738;
  int D.21740;
  _Bool D.21742;
  long int D.21743;
  long int D.21744;
  int D.21753;
  int D.21754;
  long unsigned int D.21755;
  long unsigned int D.21756;
  long unsigned int D.21757;
  long unsigned int D.21758;
  void * * D.21759;
  void * D.21766;
  int iftmp.72;
  int D.21770;
  int D.21772;
  _Bool D.21774;
  long int D.21775;
  long int D.21776;
  sizetype D.21782;
  long unsigned int D.21786;
  void * D.21795;
  int iftmp.73;
  int D.21799;
  int D.21801;
  _Bool D.21803;
  long int D.21804;
  long int D.21805;
  long unsigned int D.21811;
  void * D.21820;
  int iftmp.74;
  int D.21824;
  int D.21826;
  _Bool D.21828;
  long int D.21829;
  long int D.21830;
  long unsigned int D.21836;
  unsigned int D.21837;
  unsigned int D.21838;
  struct MonoVTable * D.21841;
  struct MonoClass * D.21842;
  const char * D.21843;
  const char * D.21844;
  gsize * bitmap_data.75;
  long unsigned int D.21846;
  void * D.21855;
  int iftmp.76;
  int D.21859;
  int D.21861;
  _Bool D.21863;
  long int D.21864;
  long int D.21865;
  int bwords.77;
  long unsigned int D.21872;
  gsize * mbitmap_data.78;
  long unsigned int D.21874;
  unsigned int D.21875;
  unsigned int D.21876;
  struct MonoClass * D.21877;
  unsigned int el_size.79;
  unsigned int D.21879;
  sizetype D.21880;
  const char * D.21883;
  const char * D.21884;
  gsize * bitmap_data.80;
  long unsigned int D.21886;
  void * D.21895;
  int iftmp.81;
  int D.21899;
  int D.21901;
  _Bool D.21903;
  long int D.21904;
  long int D.21905;
  unsigned int bwords.82;
  sizetype D.21912;

  {
    struct GCVTable * vt;
    mword desc;

    D.21611 = MEM[(mword *)start];
    D.21612 = D.21611 & 18446744073709551612;
    vt = (struct GCVTable *) D.21612;
    desc = vt->desc;
    D.21613 = desc & 7;
    switch (D.21613) <default: <D.20108>, case 1: <D.20003>, case 2: <D.20014>, case 3: <D.20070>, case 4: <D.20026>, case 5: <D.20062>, case 6: <D.20085>, case 7: <D.20107>>
    <D.20003>:
    D.21614 = desc & 4294901760;
    if (D.21614 != 0) goto <D.21615>; else goto <D.21616>;
    <D.21615>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.21617 = desc >> 16;
      D.21618 = D.21617 & 255;
      D.21619 = D.21618 * 8;
      _objptr = _objptr + D.21619;
      D.21620 = desc >> 24;
      D.21621 = D.21620 & 255;
      D.21622 = D.21621 * 8;
      _objptr_end = _objptr + D.21622;
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.21623>; else goto <D.21624>;
        <D.21623>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.21625>; else goto <D.21626>;
        <D.21625>:
        if (__old != __copy) goto <D.21627>; else goto <D.21628>;
        <D.21627>:
        gc_debug_file.65 = gc_debug_file;
        D.21630 = *_objptr;
        fprintf (gc_debug_file.65, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21630, __old);
        gc_debug_file.65 = gc_debug_file;
        fflush (gc_debug_file.65);
        <D.21628>:
        <D.21626>:
        D.21634 = sgen_ptr_in_nursery (__copy);
        if (D.21634 != 0) goto <D.21635>; else goto <D.21632>;
        <D.21635>:
        D.21636 = sgen_ptr_in_nursery (_objptr);
        if (D.21636 == 0) goto <D.21637>; else goto <D.21632>;
        <D.21637>:
        iftmp.66 = 1;
        goto <D.21633>;
        <D.21632>:
        iftmp.66 = 0;
        <D.21633>:
        D.21638 = iftmp.66 != 0;
        D.21639 = (long int) D.21638;
        D.21640 = __builtin_expect (D.21639, 0);
        if (D.21640 != 0) goto <D.21641>; else goto <D.21642>;
        <D.21641>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.21642>:
        goto <D.21643>;
        <D.21624>:
        if (0 != 0) goto <D.21644>; else goto <D.21645>;
        <D.21644>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.21645>:
        <D.21643>:
      }
      _objptr = _objptr + 8;
      goto <D.20011>;
      <D.20010>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.21646>; else goto <D.21647>;
        <D.21646>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.21648>; else goto <D.21649>;
        <D.21648>:
        if (__old != __copy) goto <D.21650>; else goto <D.21651>;
        <D.21650>:
        gc_debug_file.65 = gc_debug_file;
        D.21630 = *_objptr;
        fprintf (gc_debug_file.65, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21630, __old);
        gc_debug_file.65 = gc_debug_file;
        fflush (gc_debug_file.65);
        <D.21651>:
        <D.21649>:
        D.21655 = sgen_ptr_in_nursery (__copy);
        if (D.21655 != 0) goto <D.21656>; else goto <D.21653>;
        <D.21656>:
        D.21657 = sgen_ptr_in_nursery (_objptr);
        if (D.21657 == 0) goto <D.21658>; else goto <D.21653>;
        <D.21658>:
        iftmp.67 = 1;
        goto <D.21654>;
        <D.21653>:
        iftmp.67 = 0;
        <D.21654>:
        D.21659 = iftmp.67 != 0;
        D.21660 = (long int) D.21659;
        D.21661 = __builtin_expect (D.21660, 0);
        if (D.21661 != 0) goto <D.21662>; else goto <D.21663>;
        <D.21662>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.21663>:
        goto <D.21664>;
        <D.21647>:
        if (0 != 0) goto <D.21665>; else goto <D.21666>;
        <D.21665>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.21666>:
        <D.21664>:
      }
      _objptr = _objptr + 8;
      <D.20011>:
      if (_objptr < _objptr_end) goto <D.20010>; else goto <D.20012>;
      <D.20012>:
    }
    <D.21616>:
    goto <D.20013>;
    <D.20014>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 16;
      _objptr = _objptr + 16;
      {
        int _index;

        _index = __builtin_ctzl (_bmap);
        D.21667 = (long unsigned int) _index;
        D.21668 = D.21667 * 8;
        _objptr = _objptr + D.21668;
        D.21669 = _index + 1;
        _bmap = _bmap >> D.21669;
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.21670>; else goto <D.21671>;
          <D.21670>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object (_objptr, __old, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.21672>; else goto <D.21673>;
          <D.21672>:
          if (__old != __copy) goto <D.21674>; else goto <D.21675>;
          <D.21674>:
          gc_debug_file.65 = gc_debug_file;
          D.21676 = *_objptr;
          fprintf (gc_debug_file.65, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21676, __old);
          gc_debug_file.65 = gc_debug_file;
          fflush (gc_debug_file.65);
          <D.21675>:
          <D.21673>:
          D.21680 = sgen_ptr_in_nursery (__copy);
          if (D.21680 != 0) goto <D.21681>; else goto <D.21678>;
          <D.21681>:
          D.21682 = sgen_ptr_in_nursery (_objptr);
          if (D.21682 == 0) goto <D.21683>; else goto <D.21678>;
          <D.21683>:
          iftmp.68 = 1;
          goto <D.21679>;
          <D.21678>:
          iftmp.68 = 0;
          <D.21679>:
          D.21684 = iftmp.68 != 0;
          D.21685 = (long int) D.21684;
          D.21686 = __builtin_expect (D.21685, 0);
          if (D.21686 != 0) goto <D.21687>; else goto <D.21688>;
          <D.21687>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.21688>:
          goto <D.21689>;
          <D.21671>:
          if (0 != 0) goto <D.21690>; else goto <D.21691>;
          <D.21690>:
          sgen_add_to_global_remset (_objptr, __old);
          <D.21691>:
          <D.21689>:
        }
        _objptr = _objptr + 8;
      }
      goto <D.20024>;
      <D.20023>:
      {
        int _index;

        _index = __builtin_ctzl (_bmap);
        D.21692 = (long unsigned int) _index;
        D.21693 = D.21692 * 8;
        _objptr = _objptr + D.21693;
        D.21694 = _index + 1;
        _bmap = _bmap >> D.21694;
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.21695>; else goto <D.21696>;
          <D.21695>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object (_objptr, __old, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.21697>; else goto <D.21698>;
          <D.21697>:
          if (__old != __copy) goto <D.21699>; else goto <D.21700>;
          <D.21699>:
          gc_debug_file.65 = gc_debug_file;
          D.21676 = *_objptr;
          fprintf (gc_debug_file.65, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21676, __old);
          gc_debug_file.65 = gc_debug_file;
          fflush (gc_debug_file.65);
          <D.21700>:
          <D.21698>:
          D.21704 = sgen_ptr_in_nursery (__copy);
          if (D.21704 != 0) goto <D.21705>; else goto <D.21702>;
          <D.21705>:
          D.21706 = sgen_ptr_in_nursery (_objptr);
          if (D.21706 == 0) goto <D.21707>; else goto <D.21702>;
          <D.21707>:
          iftmp.69 = 1;
          goto <D.21703>;
          <D.21702>:
          iftmp.69 = 0;
          <D.21703>:
          D.21708 = iftmp.69 != 0;
          D.21709 = (long int) D.21708;
          D.21710 = __builtin_expect (D.21709, 0);
          if (D.21710 != 0) goto <D.21711>; else goto <D.21712>;
          <D.21711>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.21712>:
          goto <D.21713>;
          <D.21696>:
          if (0 != 0) goto <D.21714>; else goto <D.21715>;
          <D.21714>:
          sgen_add_to_global_remset (_objptr, __old);
          <D.21715>:
          <D.21713>:
        }
        _objptr = _objptr + 8;
      }
      <D.20024>:
      if (_bmap != 0) goto <D.20023>; else goto <D.20025>;
      <D.20025>:
    }
    goto <D.20013>;
    <D.20026>:
    D.21716 = desc & 4294950912;
    if (D.21716 != 0) goto <D.21717>; else goto <D.21718>;
    <D.21717>:
    {
      int el_size;
      int etype;

      D.21719 = desc >> 3;
      D.21720 = (int) D.21719;
      el_size = D.21720 & 1023;
      D.21721 = (int) desc;
      etype = D.21721 & 49152;
      if (etype == 16384) goto <D.21722>; else goto <D.21723>;
      <D.21722>:
      {
        void * * p;
        void * * end_refs;

        p = start + 32;
        D.21724 = MEM[(struct MonoArray *)start].max_length;
        el_size.70 = (unsigned int) el_size;
        D.21726 = D.21724 * el_size.70;
        D.21727 = (sizetype) D.21726;
        end_refs = p + D.21727;
        goto <D.20034>;
        <D.20033>:
        {
          void * __old;
          void * __copy;

          __old = *p;
          if (__old != 0B) goto <D.21728>; else goto <D.21729>;
          <D.21728>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object (p, __old, queue);
          __copy = *p;
          if (0 != 0) goto <D.21730>; else goto <D.21731>;
          <D.21730>:
          if (__old != __copy) goto <D.21732>; else goto <D.21733>;
          <D.21732>:
          gc_debug_file.65 = gc_debug_file;
          D.21734 = *p;
          fprintf (gc_debug_file.65, "Overwrote field at %p with %p (was: %p)\n", p, D.21734, __old);
          gc_debug_file.65 = gc_debug_file;
          fflush (gc_debug_file.65);
          <D.21733>:
          <D.21731>:
          D.21738 = sgen_ptr_in_nursery (__copy);
          if (D.21738 != 0) goto <D.21739>; else goto <D.21736>;
          <D.21739>:
          D.21740 = sgen_ptr_in_nursery (p);
          if (D.21740 == 0) goto <D.21741>; else goto <D.21736>;
          <D.21741>:
          iftmp.71 = 1;
          goto <D.21737>;
          <D.21736>:
          iftmp.71 = 0;
          <D.21737>:
          D.21742 = iftmp.71 != 0;
          D.21743 = (long int) D.21742;
          D.21744 = __builtin_expect (D.21743, 0);
          if (D.21744 != 0) goto <D.21745>; else goto <D.21746>;
          <D.21745>:
          sgen_add_to_global_remset (p, __copy);
          <D.21746>:
          goto <D.21747>;
          <D.21729>:
          if (0 != 0) goto <D.21748>; else goto <D.21749>;
          <D.21748>:
          sgen_add_to_global_remset (p, __old);
          <D.21749>:
          <D.21747>:
        }
        p = p + 8;
        <D.20034>:
        if (p < end_refs) goto <D.20033>; else goto <D.20035>;
        <D.20035>:
      }
      goto <D.21750>;
      <D.21723>:
      if (etype == 32768) goto <D.21751>; else goto <D.21752>;
      <D.21751>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.21617 = desc >> 16;
        D.21753 = (int) D.21617;
        offset = D.21753 & 255;
        D.21620 = desc >> 24;
        D.21754 = (int) D.21620;
        num_refs = D.21754 & 255;
        e_start = start + 32;
        D.21724 = MEM[(struct MonoArray *)start].max_length;
        el_size.70 = (unsigned int) el_size;
        D.21726 = D.21724 * el_size.70;
        D.21727 = (sizetype) D.21726;
        e_end = e_start + D.21727;
        goto <D.20048>;
        <D.20047>:
        {
          void * * p;
          int i;

          p = e_start;
          D.21755 = (long unsigned int) offset;
          D.21756 = D.21755 * 8;
          p = p + D.21756;
          i = 0;
          goto <D.20045>;
          <D.20044>:
          {
            void * __old;
            void * __copy;

            D.21757 = (long unsigned int) i;
            D.21758 = D.21757 * 8;
            D.21759 = p + D.21758;
            __old = *D.21759;
            if (__old != 0B) goto <D.21760>; else goto <D.21761>;
            <D.21760>:
            __builtin_prefetch (__old);
            D.21757 = (long unsigned int) i;
            D.21758 = D.21757 * 8;
            D.21759 = p + D.21758;
            major_copy_or_mark_object (D.21759, __old, queue);
            D.21757 = (long unsigned int) i;
            D.21758 = D.21757 * 8;
            D.21759 = p + D.21758;
            __copy = *D.21759;
            if (0 != 0) goto <D.21762>; else goto <D.21763>;
            <D.21762>:
            if (__old != __copy) goto <D.21764>; else goto <D.21765>;
            <D.21764>:
            gc_debug_file.65 = gc_debug_file;
            D.21757 = (long unsigned int) i;
            D.21758 = D.21757 * 8;
            D.21759 = p + D.21758;
            D.21757 = (long unsigned int) i;
            D.21758 = D.21757 * 8;
            D.21759 = p + D.21758;
            D.21766 = *D.21759;
            fprintf (gc_debug_file.65, "Overwrote field at %p with %p (was: %p)\n", D.21759, D.21766, __old);
            gc_debug_file.65 = gc_debug_file;
            fflush (gc_debug_file.65);
            <D.21765>:
            <D.21763>:
            D.21770 = sgen_ptr_in_nursery (__copy);
            if (D.21770 != 0) goto <D.21771>; else goto <D.21768>;
            <D.21771>:
            D.21757 = (long unsigned int) i;
            D.21758 = D.21757 * 8;
            D.21759 = p + D.21758;
            D.21772 = sgen_ptr_in_nursery (D.21759);
            if (D.21772 == 0) goto <D.21773>; else goto <D.21768>;
            <D.21773>:
            iftmp.72 = 1;
            goto <D.21769>;
            <D.21768>:
            iftmp.72 = 0;
            <D.21769>:
            D.21774 = iftmp.72 != 0;
            D.21775 = (long int) D.21774;
            D.21776 = __builtin_expect (D.21775, 0);
            if (D.21776 != 0) goto <D.21777>; else goto <D.21778>;
            <D.21777>:
            D.21757 = (long unsigned int) i;
            D.21758 = D.21757 * 8;
            D.21759 = p + D.21758;
            sgen_add_to_global_remset (D.21759, __copy);
            <D.21778>:
            goto <D.21779>;
            <D.21761>:
            if (0 != 0) goto <D.21780>; else goto <D.21781>;
            <D.21780>:
            D.21757 = (long unsigned int) i;
            D.21758 = D.21757 * 8;
            D.21759 = p + D.21758;
            sgen_add_to_global_remset (D.21759, __old);
            <D.21781>:
            <D.21779>:
          }
          i = i + 1;
          <D.20045>:
          if (i < num_refs) goto <D.20044>; else goto <D.20046>;
          <D.20046>:
          D.21782 = (sizetype) el_size;
          e_start = e_start + D.21782;
        }
        <D.20048>:
        if (e_start < e_end) goto <D.20047>; else goto <D.20049>;
        <D.20049>:
      }
      goto <D.21783>;
      <D.21752>:
      if (etype == 49152) goto <D.21784>; else goto <D.21785>;
      <D.21784>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 32;
        D.21724 = MEM[(struct MonoArray *)start].max_length;
        el_size.70 = (unsigned int) el_size;
        D.21726 = D.21724 * el_size.70;
        D.21727 = (sizetype) D.21726;
        e_end = e_start + D.21727;
        goto <D.20060>;
        <D.20059>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.20057>;
          <D.20056>:
          D.21786 = _bmap & 1;
          if (D.21786 != 0) goto <D.21787>; else goto <D.21788>;
          <D.21787>:
          {
            void * __old;
            void * __copy;

            __old = *p;
            if (__old != 0B) goto <D.21789>; else goto <D.21790>;
            <D.21789>:
            __builtin_prefetch (__old);
            major_copy_or_mark_object (p, __old, queue);
            __copy = *p;
            if (0 != 0) goto <D.21791>; else goto <D.21792>;
            <D.21791>:
            if (__old != __copy) goto <D.21793>; else goto <D.21794>;
            <D.21793>:
            gc_debug_file.65 = gc_debug_file;
            D.21795 = *p;
            fprintf (gc_debug_file.65, "Overwrote field at %p with %p (was: %p)\n", p, D.21795, __old);
            gc_debug_file.65 = gc_debug_file;
            fflush (gc_debug_file.65);
            <D.21794>:
            <D.21792>:
            D.21799 = sgen_ptr_in_nursery (__copy);
            if (D.21799 != 0) goto <D.21800>; else goto <D.21797>;
            <D.21800>:
            D.21801 = sgen_ptr_in_nursery (p);
            if (D.21801 == 0) goto <D.21802>; else goto <D.21797>;
            <D.21802>:
            iftmp.73 = 1;
            goto <D.21798>;
            <D.21797>:
            iftmp.73 = 0;
            <D.21798>:
            D.21803 = iftmp.73 != 0;
            D.21804 = (long int) D.21803;
            D.21805 = __builtin_expect (D.21804, 0);
            if (D.21805 != 0) goto <D.21806>; else goto <D.21807>;
            <D.21806>:
            sgen_add_to_global_remset (p, __copy);
            <D.21807>:
            goto <D.21808>;
            <D.21790>:
            if (0 != 0) goto <D.21809>; else goto <D.21810>;
            <D.21809>:
            sgen_add_to_global_remset (p, __old);
            <D.21810>:
            <D.21808>:
          }
          <D.21788>:
          _bmap = _bmap >> 1;
          p = p + 8;
          <D.20057>:
          if (_bmap != 0) goto <D.20056>; else goto <D.20058>;
          <D.20058>:
          D.21782 = (sizetype) el_size;
          e_start = e_start + D.21782;
        }
        <D.20060>:
        if (e_start < e_end) goto <D.20059>; else goto <D.20061>;
        <D.20061>:
      }
      <D.21785>:
      <D.21783>:
      <D.21750>:
    }
    <D.21718>:
    goto <D.20013>;
    <D.20062>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 16;
      goto <D.20068>;
      <D.20067>:
      D.21811 = _bmap & 1;
      if (D.21811 != 0) goto <D.21812>; else goto <D.21813>;
      <D.21812>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.21814>; else goto <D.21815>;
        <D.21814>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.21816>; else goto <D.21817>;
        <D.21816>:
        if (__old != __copy) goto <D.21818>; else goto <D.21819>;
        <D.21818>:
        gc_debug_file.65 = gc_debug_file;
        D.21820 = *_objptr;
        fprintf (gc_debug_file.65, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21820, __old);
        gc_debug_file.65 = gc_debug_file;
        fflush (gc_debug_file.65);
        <D.21819>:
        <D.21817>:
        D.21824 = sgen_ptr_in_nursery (__copy);
        if (D.21824 != 0) goto <D.21825>; else goto <D.21822>;
        <D.21825>:
        D.21826 = sgen_ptr_in_nursery (_objptr);
        if (D.21826 == 0) goto <D.21827>; else goto <D.21822>;
        <D.21827>:
        iftmp.74 = 1;
        goto <D.21823>;
        <D.21822>:
        iftmp.74 = 0;
        <D.21823>:
        D.21828 = iftmp.74 != 0;
        D.21829 = (long int) D.21828;
        D.21830 = __builtin_expect (D.21829, 0);
        if (D.21830 != 0) goto <D.21831>; else goto <D.21832>;
        <D.21831>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.21832>:
        goto <D.21833>;
        <D.21815>:
        if (0 != 0) goto <D.21834>; else goto <D.21835>;
        <D.21834>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.21835>:
        <D.21833>:
      }
      <D.21813>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 8;
      <D.20068>:
      if (_bmap != 0) goto <D.20067>; else goto <D.20069>;
      <D.20069>:
    }
    goto <D.20013>;
    <D.20070>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.21836 = *bitmap_data;
      D.21837 = (unsigned int) D.21836;
      D.21838 = D.21837 + 4294967295;
      bwords = (int) D.21838;
      start_run = _objptr;
      bitmap_data = bitmap_data + 8;
      if (0 != 0) goto <D.21839>; else goto <D.21840>;
      <D.21839>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.21841 = myobj->vtable;
        D.21842 = D.21841->klass;
        D.21843 = D.21842->name_space;
        D.21841 = myobj->vtable;
        D.21842 = D.21841->klass;
        D.21844 = D.21842->name;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.21843, D.21844);
      }
      <D.21840>:
      goto <D.20083>;
      <D.20082>:
      {
        gsize _bmap;

        bitmap_data.75 = bitmap_data;
        bitmap_data = bitmap_data.75 + 8;
        _bmap = *bitmap_data.75;
        _objptr = start_run;
        goto <D.20080>;
        <D.20079>:
        D.21846 = _bmap & 1;
        if (D.21846 != 0) goto <D.21847>; else goto <D.21848>;
        <D.21847>:
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.21849>; else goto <D.21850>;
          <D.21849>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object (_objptr, __old, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.21851>; else goto <D.21852>;
          <D.21851>:
          if (__old != __copy) goto <D.21853>; else goto <D.21854>;
          <D.21853>:
          gc_debug_file.65 = gc_debug_file;
          D.21855 = *_objptr;
          fprintf (gc_debug_file.65, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21855, __old);
          gc_debug_file.65 = gc_debug_file;
          fflush (gc_debug_file.65);
          <D.21854>:
          <D.21852>:
          D.21859 = sgen_ptr_in_nursery (__copy);
          if (D.21859 != 0) goto <D.21860>; else goto <D.21857>;
          <D.21860>:
          D.21861 = sgen_ptr_in_nursery (_objptr);
          if (D.21861 == 0) goto <D.21862>; else goto <D.21857>;
          <D.21862>:
          iftmp.76 = 1;
          goto <D.21858>;
          <D.21857>:
          iftmp.76 = 0;
          <D.21858>:
          D.21863 = iftmp.76 != 0;
          D.21864 = (long int) D.21863;
          D.21865 = __builtin_expect (D.21864, 0);
          if (D.21865 != 0) goto <D.21866>; else goto <D.21867>;
          <D.21866>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.21867>:
          goto <D.21868>;
          <D.21850>:
          if (0 != 0) goto <D.21869>; else goto <D.21870>;
          <D.21869>:
          sgen_add_to_global_remset (_objptr, __old);
          <D.21870>:
          <D.21868>:
        }
        <D.21848>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 8;
        <D.20080>:
        if (_bmap != 0) goto <D.20079>; else goto <D.20081>;
        <D.20081>:
        start_run = start_run + 512;
      }
      <D.20083>:
      bwords.77 = bwords;
      bwords = bwords.77 + -1;
      if (bwords.77 > 0) goto <D.20082>; else goto <D.20084>;
      <D.20084>:
    }
    goto <D.20013>;
    <D.20085>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.21872 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.21872);
      mbitmap_data.78 = mbitmap_data;
      mbitmap_data = mbitmap_data.78 + 8;
      D.21874 = *mbitmap_data.78;
      D.21875 = (unsigned int) D.21874;
      D.21876 = D.21875 + 4294967295;
      mbwords = (int) D.21876;
      D.21877 = vt->klass;
      el_size = mono_array_element_size (D.21877);
      e_start = start + 32;
      D.21724 = MEM[(struct MonoArray *)start].max_length;
      el_size.79 = (unsigned int) el_size;
      D.21879 = D.21724 * el_size.79;
      D.21880 = (sizetype) D.21879;
      e_end = e_start + D.21880;
      if (0 != 0) goto <D.21881>; else goto <D.21882>;
      <D.21881>:
      D.21872 = vt->desc;
      D.21877 = vt->klass;
      D.21883 = D.21877->name_space;
      D.21877 = vt->klass;
      D.21884 = D.21877->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.21872, D.21883, D.21884);
      <D.21882>:
      goto <D.20105>;
      <D.20104>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

        _objptr = e_start;
        bitmap_data = mbitmap_data;
        bwords = (unsigned int) mbwords;
        goto <D.20102>;
        <D.20101>:
        {
          gsize _bmap;
          void * * start_run;

          bitmap_data.80 = bitmap_data;
          bitmap_data = bitmap_data.80 + 8;
          _bmap = *bitmap_data.80;
          start_run = _objptr;
          goto <D.20099>;
          <D.20098>:
          D.21886 = _bmap & 1;
          if (D.21886 != 0) goto <D.21887>; else goto <D.21888>;
          <D.21887>:
          {
            void * __old;
            void * __copy;

            __old = *_objptr;
            if (__old != 0B) goto <D.21889>; else goto <D.21890>;
            <D.21889>:
            __builtin_prefetch (__old);
            major_copy_or_mark_object (_objptr, __old, queue);
            __copy = *_objptr;
            if (0 != 0) goto <D.21891>; else goto <D.21892>;
            <D.21891>:
            if (__old != __copy) goto <D.21893>; else goto <D.21894>;
            <D.21893>:
            gc_debug_file.65 = gc_debug_file;
            D.21895 = *_objptr;
            fprintf (gc_debug_file.65, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21895, __old);
            gc_debug_file.65 = gc_debug_file;
            fflush (gc_debug_file.65);
            <D.21894>:
            <D.21892>:
            D.21899 = sgen_ptr_in_nursery (__copy);
            if (D.21899 != 0) goto <D.21900>; else goto <D.21897>;
            <D.21900>:
            D.21901 = sgen_ptr_in_nursery (_objptr);
            if (D.21901 == 0) goto <D.21902>; else goto <D.21897>;
            <D.21902>:
            iftmp.81 = 1;
            goto <D.21898>;
            <D.21897>:
            iftmp.81 = 0;
            <D.21898>:
            D.21903 = iftmp.81 != 0;
            D.21904 = (long int) D.21903;
            D.21905 = __builtin_expect (D.21904, 0);
            if (D.21905 != 0) goto <D.21906>; else goto <D.21907>;
            <D.21906>:
            sgen_add_to_global_remset (_objptr, __copy);
            <D.21907>:
            goto <D.21908>;
            <D.21890>:
            if (0 != 0) goto <D.21909>; else goto <D.21910>;
            <D.21909>:
            sgen_add_to_global_remset (_objptr, __old);
            <D.21910>:
            <D.21908>:
          }
          <D.21888>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 8;
          <D.20099>:
          if (_bmap != 0) goto <D.20098>; else goto <D.20100>;
          <D.20100>:
          _objptr = start_run + 512;
        }
        <D.20102>:
        bwords.82 = bwords;
        bwords = bwords.82 + 4294967295;
        if (bwords.82 != 0) goto <D.20101>; else goto <D.20103>;
        <D.20103>:
        D.21912 = (sizetype) el_size;
        e_start = e_start + D.21912;
      }
      <D.20105>:
      if (e_start < e_end) goto <D.20104>; else goto <D.20106>;
      <D.20106>:
    }
    goto <D.20013>;
    <D.20107>:
    goto <D.20013>;
    <D.20108>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.20013>:
  }
}


major_copy_or_mark_object (void * * ptr, void * obj, struct SgenGrayQueue * queue)
{
  int current_collection_generation.83;
  int D.21919;
  char * iftmp.84;
  long unsigned int D.21923;
  long unsigned int D.21924;
  long unsigned int D.21927;
  long unsigned int D.21931;
  int D.21934;
  _Bool D.21937;
  long int D.21938;
  long int D.21939;
  int D.21942;
  long unsigned int obj.85;
  long unsigned int D.21946;
  struct MSBlockHeader * D.21947;
  gboolean * evacuate_block_obj_sizes.86;
  long unsigned int D.21949;
  long unsigned int D.21950;
  gboolean * D.21951;
  long int obj.87;
  long int D.21953;
  int D.21954;
  long unsigned int D.21960;
  long int D.21961;
  long unsigned int D.21962;
  long unsigned int D.21963;
  long unsigned int D.21966;
  long unsigned int D.21967;
  long unsigned int D.21968;
  int iftmp.88;
  struct GrayQueueSection * D.21975;
  int D.21977;
  _Bool D.21978;
  long int D.21979;
  long int D.21980;
  int D.21984;
  int D.21985;
  int D.21986;
  long unsigned int D.21994;
  long int D.21995;
  long unsigned int D.21996;
  long unsigned int D.21997;
  char * iftmp.89;
  unsigned int D.22005;
  unsigned int D.22006;
  long unsigned int D.22007;
  long unsigned int D.22010;
  long unsigned int D.22011;
  gboolean * D.22012;
  long unsigned int D.22015;
  _Bool D.22017;
  long int D.22018;
  long int D.22019;
  long unsigned int D.22022;
  long unsigned int D.22030;
  long int D.22031;
  long unsigned int D.22032;
  long unsigned int D.22033;
  long unsigned int D.22036;
  int iftmp.90;
  _Bool D.22044;
  long int D.22045;
  long int D.22046;
  int D.22050;
  int D.22051;
  int D.22053;
  struct MonoVTable * D.22056;
  void * D.22057;
  long unsigned int D.22058;
  int D.22059;
  int iftmp.91;
  _Bool D.22067;
  long int D.22068;
  long int D.22069;
  int D.22073;
  int D.22074;
  struct MSBlockInfo * block;
  void do_copy_object = <<< error >>>;

  if (0 != 0) goto <D.21914>; else goto <D.21915>;
  <D.21914>:
  monoeg_g_log (0B, 4, "null object from pointer %p", ptr);
  <D.19963>:
  goto <D.19963>;
  <D.21915>:
  if (0 != 0) goto <D.21916>; else goto <D.21917>;
  <D.21916>:
  current_collection_generation.83 = current_collection_generation;
  monoeg_g_log (0B, 4, "old gen parallel allocator called from a %d collection", current_collection_generation.83);
  <D.19964>:
  goto <D.19964>;
  <D.21917>:
  D.21919 = sgen_ptr_in_nursery (obj);
  if (D.21919 != 0) goto <D.21920>; else goto <D.21921>;
  <D.21920>:
  {
    int word;
    int bit;
    char * forwarded;
    char * old_obj;

    D.21923 = MEM[(mword *)obj];
    D.21924 = D.21923 & 1;
    if (D.21924 != 0) goto <D.21925>; else goto <D.21926>;
    <D.21925>:
    D.21923 = MEM[(mword *)obj];
    D.21927 = D.21923 & 18446744073709551612;
    iftmp.84 = (char *) D.21927;
    goto <D.21928>;
    <D.21926>:
    iftmp.84 = 0B;
    <D.21928>:
    forwarded = iftmp.84;
    if (forwarded != 0B) goto <D.21929>; else goto <D.21930>;
    <D.21929>:
    *ptr = forwarded;
    return;
    <D.21930>:
    D.21923 = MEM[(mword *)obj];
    D.21931 = D.21923 & 2;
    if (D.21931 != 0) goto <D.21932>; else goto <D.21933>;
    <D.21932>:
    return;
    <D.21933>:
    D.21934 = sgen_nursery_is_to_space (obj);
    if (D.21934 != 0) goto <D.21935>; else goto <D.21936>;
    <D.21935>:
    return;
    <D.21936>:
    do_copy_object:
    old_obj = obj;
    obj = copy_object_no_checks (obj, queue);
    D.21937 = old_obj == obj;
    D.21938 = (long int) D.21937;
    D.21939 = __builtin_expect (D.21938, 0);
    if (D.21939 != 0) goto <D.21940>; else goto <D.21941>;
    <D.21940>:
    D.21942 = sgen_ptr_in_nursery (obj);
    if (D.21942 == 0) goto <D.21943>; else goto <D.21944>;
    <D.21943>:
    {
      int size_index;

      obj.85 = (long unsigned int) obj;
      D.21946 = obj.85 & 18446744073709535232;
      D.21947 = (struct MSBlockHeader *) D.21946;
      block = D.21947->info;
      size_index = block->obj_size_index;
      evacuate_block_obj_sizes.86 = evacuate_block_obj_sizes;
      D.21949 = (long unsigned int) size_index;
      D.21950 = D.21949 * 4;
      D.21951 = evacuate_block_obj_sizes.86 + D.21950;
      *D.21951 = 0;
      {
        int __word;
        int __bit;

        {
          int i;

          obj.87 = (long int) obj;
          D.21953 = obj.87 >> 3;
          D.21954 = (int) D.21953;
          i = D.21954 & 2047;
          if (0 != 0) goto <D.21955>; else goto <D.21956>;
          <D.21955>:
          __word = i >> 5;
          __bit = i & 31;
          goto <D.21957>;
          <D.21956>:
          __word = i >> 6;
          __bit = i & 63;
          <D.21957>:
        }
        if (0 != 0) goto <D.21958>; else goto <D.21959>;
        <D.21958>:
        monoeg_g_log (0B, 4, "object %p not allocated", obj);
        <D.19974>:
        goto <D.19974>;
        <D.21959>:
        D.21960 = block->mark_words[__word];
        D.21961 = 1 << __bit;
        D.21962 = (long unsigned int) D.21961;
        D.21963 = D.21960 & D.21962;
        if (D.21963 == 0) goto <D.21964>; else goto <D.21965>;
        <D.21964>:
        D.21960 = block->mark_words[__word];
        D.21961 = 1 << __bit;
        D.21962 = (long unsigned int) D.21961;
        D.21966 = D.21960 | D.21962;
        block->mark_words[__word] = D.21966;
        D.21967 = BIT_FIELD_REF <*block, 64, 64>;
        D.21968 = D.21967 & 1073741824;
        if (D.21968 != 0) goto <D.21969>; else goto <D.21970>;
        <D.21969>:
        D.21975 = queue->first;
        if (D.21975 == 0B) goto <D.21972>; else goto <D.21976>;
        <D.21976>:
        D.21975 = queue->first;
        D.21977 = D.21975->end;
        if (D.21977 == 125) goto <D.21972>; else goto <D.21973>;
        <D.21972>:
        iftmp.88 = 1;
        goto <D.21974>;
        <D.21973>:
        iftmp.88 = 0;
        <D.21974>:
        D.21978 = iftmp.88 != 0;
        D.21979 = (long int) D.21978;
        D.21980 = __builtin_expect (D.21979, 0);
        if (D.21980 != 0) goto <D.21981>; else goto <D.21982>;
        <D.21981>:
        sgen_gray_object_enqueue (queue, obj);
        goto <D.21983>;
        <D.21982>:
        D.21975 = queue->first;
        D.21975 = queue->first;
        D.21977 = D.21975->end;
        D.21984 = D.21977;
        D.21985 = D.21984 + 1;
        D.21975->end = D.21985;
        D.21975->objects[D.21984] = obj;
        <D.21983>:
        __builtin_prefetch (obj);
        <D.21970>:
        <D.21965>:
      }
    }
    <D.21944>:
    return;
    <D.21941>:
    *ptr = obj;
    D.21986 = sgen_ptr_in_nursery (obj);
    if (D.21986 == 0) goto <D.21987>; else goto <D.21988>;
    <D.21987>:
    obj.85 = (long unsigned int) obj;
    D.21946 = obj.85 & 18446744073709535232;
    D.21947 = (struct MSBlockHeader *) D.21946;
    block = D.21947->info;
    {
      int i;

      obj.87 = (long int) obj;
      D.21953 = obj.87 >> 3;
      D.21954 = (int) D.21953;
      i = D.21954 & 2047;
      if (0 != 0) goto <D.21989>; else goto <D.21990>;
      <D.21989>:
      word = i >> 5;
      bit = i & 31;
      goto <D.21991>;
      <D.21990>:
      word = i >> 6;
      bit = i & 63;
      <D.21991>:
    }
    if (0 != 0) goto <D.21992>; else goto <D.21993>;
    <D.21992>:
    monoeg_g_log (0B, 4, "object %p already marked", obj);
    <D.19976>:
    goto <D.19976>;
    <D.21993>:
    D.21994 = block->mark_words[word];
    D.21995 = 1 << bit;
    D.21996 = (long unsigned int) D.21995;
    D.21997 = D.21994 | D.21996;
    block->mark_words[word] = D.21997;
    <D.21988>:
  }
  goto <D.21998>;
  <D.21921>:
  {
    char * forwarded;
    mword objsize;

    D.21923 = MEM[(mword *)obj];
    D.21924 = D.21923 & 1;
    if (D.21924 != 0) goto <D.22000>; else goto <D.22001>;
    <D.22000>:
    D.21923 = MEM[(mword *)obj];
    D.21927 = D.21923 & 18446744073709551612;
    iftmp.89 = (char *) D.21927;
    goto <D.22002>;
    <D.22001>:
    iftmp.89 = 0B;
    <D.22002>:
    forwarded = iftmp.89;
    if (forwarded != 0B) goto <D.22003>; else goto <D.22004>;
    <D.22003>:
    *ptr = forwarded;
    return;
    <D.22004>:
    D.22005 = sgen_safe_object_get_size (obj);
    D.22006 = D.22005 + 7;
    D.22007 = (long unsigned int) D.22006;
    objsize = D.22007 & 4294967288;
    if (objsize <= 8000) goto <D.22008>; else goto <D.22009>;
    <D.22008>:
    {
      int size_index;
      gboolean evacuate;

      obj.85 = (long unsigned int) obj;
      D.21946 = obj.85 & 18446744073709535232;
      D.21947 = (struct MSBlockHeader *) D.21946;
      block = D.21947->info;
      size_index = block->obj_size_index;
      evacuate_block_obj_sizes.86 = evacuate_block_obj_sizes;
      D.22010 = (long unsigned int) size_index;
      D.22011 = D.22010 * 4;
      D.22012 = evacuate_block_obj_sizes.86 + D.22011;
      evacuate = *D.22012;
      if (evacuate != 0) goto <D.22014>; else goto <D.22013>;
      <D.22014>:
      D.21967 = BIT_FIELD_REF <*block, 64, 64>;
      D.22015 = D.21967 & 536870912;
      if (D.22015 == 0) goto <D.22016>; else goto <D.22013>;
      <D.22016>:
      D.21923 = MEM[(mword *)obj];
      D.21931 = D.21923 & 2;
      D.22017 = D.21931 != 0;
      D.22018 = (long int) D.22017;
      D.22019 = __builtin_expect (D.22018, 0);
      if (D.22019 != 0) goto <D.22020>; else goto <D.22021>;
      <D.22020>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 1425, "!SGEN_OBJECT_IS_PINNED (obj)");
      <D.22021>:
      D.21967 = BIT_FIELD_REF <*block, 64, 64>;
      D.22022 = D.21967 & 268435456;
      if (D.22022 != 0) goto <D.22023>; else goto <D.22024>;
      <D.22023>:
      return;
      <D.22024>:
      goto do_copy_object;
      <D.22013>:
      {
        int __word;
        int __bit;

        {
          int i;

          obj.87 = (long int) obj;
          D.21953 = obj.87 >> 3;
          D.21954 = (int) D.21953;
          i = D.21954 & 2047;
          if (0 != 0) goto <D.22025>; else goto <D.22026>;
          <D.22025>:
          __word = i >> 5;
          __bit = i & 31;
          goto <D.22027>;
          <D.22026>:
          __word = i >> 6;
          __bit = i & 63;
          <D.22027>:
        }
        if (0 != 0) goto <D.22028>; else goto <D.22029>;
        <D.22028>:
        monoeg_g_log (0B, 4, "object %p not allocated", obj);
        <D.19984>:
        goto <D.19984>;
        <D.22029>:
        D.22030 = block->mark_words[__word];
        D.22031 = 1 << __bit;
        D.22032 = (long unsigned int) D.22031;
        D.22033 = D.22030 & D.22032;
        if (D.22033 == 0) goto <D.22034>; else goto <D.22035>;
        <D.22034>:
        D.22030 = block->mark_words[__word];
        D.22031 = 1 << __bit;
        D.22032 = (long unsigned int) D.22031;
        D.22036 = D.22030 | D.22032;
        block->mark_words[__word] = D.22036;
        D.21967 = BIT_FIELD_REF <*block, 64, 64>;
        D.21968 = D.21967 & 1073741824;
        if (D.21968 != 0) goto <D.22037>; else goto <D.22038>;
        <D.22037>:
        D.21975 = queue->first;
        if (D.21975 == 0B) goto <D.22040>; else goto <D.22043>;
        <D.22043>:
        D.21975 = queue->first;
        D.21977 = D.21975->end;
        if (D.21977 == 125) goto <D.22040>; else goto <D.22041>;
        <D.22040>:
        iftmp.90 = 1;
        goto <D.22042>;
        <D.22041>:
        iftmp.90 = 0;
        <D.22042>:
        D.22044 = iftmp.90 != 0;
        D.22045 = (long int) D.22044;
        D.22046 = __builtin_expect (D.22045, 0);
        if (D.22046 != 0) goto <D.22047>; else goto <D.22048>;
        <D.22047>:
        sgen_gray_object_enqueue (queue, obj);
        goto <D.22049>;
        <D.22048>:
        D.21975 = queue->first;
        D.21975 = queue->first;
        D.21977 = D.21975->end;
        D.22050 = D.21977;
        D.22051 = D.22050 + 1;
        D.21975->end = D.22051;
        D.21975->objects[D.22050] = obj;
        <D.22049>:
        __builtin_prefetch (obj);
        <D.22038>:
        <D.22035>:
      }
    }
    goto <D.22052>;
    <D.22009>:
    D.22053 = sgen_los_object_is_pinned (obj);
    if (D.22053 != 0) goto <D.22054>; else goto <D.22055>;
    <D.22054>:
    return;
    <D.22055>:
    sgen_los_pin_object (obj);
    D.21923 = MEM[(mword *)obj];
    D.21927 = D.21923 & 18446744073709551612;
    D.22056 = (struct MonoVTable *) D.21927;
    D.22057 = D.22056->gc_descr;
    D.22058 = (long unsigned int) D.22057;
    D.22059 = sgen_gc_descr_has_references (D.22058);
    if (D.22059 != 0) goto <D.22060>; else goto <D.22061>;
    <D.22060>:
    D.21975 = queue->first;
    if (D.21975 == 0B) goto <D.22063>; else goto <D.22066>;
    <D.22066>:
    D.21975 = queue->first;
    D.21977 = D.21975->end;
    if (D.21977 == 125) goto <D.22063>; else goto <D.22064>;
    <D.22063>:
    iftmp.91 = 1;
    goto <D.22065>;
    <D.22064>:
    iftmp.91 = 0;
    <D.22065>:
    D.22067 = iftmp.91 != 0;
    D.22068 = (long int) D.22067;
    D.22069 = __builtin_expect (D.22068, 0);
    if (D.22069 != 0) goto <D.22070>; else goto <D.22071>;
    <D.22070>:
    sgen_gray_object_enqueue (queue, obj);
    goto <D.22072>;
    <D.22071>:
    D.21975 = queue->first;
    D.21975 = queue->first;
    D.21977 = D.21975->end;
    D.22073 = D.21977;
    D.22074 = D.22073 + 1;
    D.21975->end = D.22074;
    D.21975->objects[D.22073] = obj;
    <D.22072>:
    __builtin_prefetch (obj);
    <D.22061>:
    <D.22052>:
  }
  <D.21998>:
}


sgen_nursery_is_to_space (char * object)
{
  long int object.92;
  char * sgen_nursery_start.93;
  long int sgen_nursery_start.94;
  long int D.22079;
  long int D.22080;
  int D.22081;
  _Bool D.22082;
  long int D.22083;
  long int D.22084;
  char * D.22087;
  char * D.22088;
  int sgen_space_bitmap_size.95;
  _Bool D.22090;
  long int D.22091;
  long int D.22092;
  gboolean D.22095;
  char * sgen_space_bitmap.96;
  sizetype D.22097;
  char * D.22098;
  char D.22099;
  int D.22100;
  int D.22101;
  int D.22102;
  _Bool D.22103;
  int idx;
  int byte;
  int bit;

  object.92 = (long int) object;
  sgen_nursery_start.93 = sgen_nursery_start;
  sgen_nursery_start.94 = (long int) sgen_nursery_start.93;
  D.22079 = object.92 - sgen_nursery_start.94;
  D.22080 = D.22079 >> 9;
  idx = (int) D.22080;
  byte = idx / 8;
  bit = idx & 7;
  D.22081 = sgen_ptr_in_nursery (object);
  D.22082 = D.22081 == 0;
  D.22083 = (long int) D.22082;
  D.22084 = __builtin_expect (D.22083, 0);
  if (D.22084 != 0) goto <D.22085>; else goto <D.22086>;
  <D.22085>:
  D.22087 = sgen_get_nursery_start ();
  D.22088 = sgen_get_nursery_end ();
  monoeg_g_log (0B, 4, "object %p is not in nursery [%p - %p]", object, D.22087, D.22088);
  <D.19017>:
  goto <D.19017>;
  <D.22086>:
  sgen_space_bitmap_size.95 = sgen_space_bitmap_size;
  D.22090 = byte >= sgen_space_bitmap_size.95;
  D.22091 = (long int) D.22090;
  D.22092 = __builtin_expect (D.22091, 0);
  if (D.22092 != 0) goto <D.22093>; else goto <D.22094>;
  <D.22093>:
  sgen_space_bitmap_size.95 = sgen_space_bitmap_size;
  monoeg_g_log (0B, 4, "byte index %d out of range", byte, sgen_space_bitmap_size.95);
  <D.19018>:
  goto <D.19018>;
  <D.22094>:
  sgen_space_bitmap.96 = sgen_space_bitmap;
  D.22097 = (sizetype) byte;
  D.22098 = sgen_space_bitmap.96 + D.22097;
  D.22099 = *D.22098;
  D.22100 = (int) D.22099;
  D.22101 = D.22100 >> bit;
  D.22102 = D.22101 & 1;
  D.22103 = D.22102 != 0;
  D.22095 = (gboolean) D.22103;
  return D.22095;
}


__attribute__((always_inline))
sgen_get_nursery_start ()
{
  char * D.22105;

  D.22105 = sgen_nursery_start;
  return D.22105;
}


__attribute__((always_inline))
sgen_get_nursery_end ()
{
  char * D.22107;

  D.22107 = sgen_nursery_end;
  return D.22107;
}


__attribute__((__unused__, noinline))
copy_object_no_checks (void * obj, struct SgenGrayQueue * queue)
{
  void * D.22109;
  long unsigned int D.22110;
  unsigned int D.22111;
  unsigned int D.22112;
  long unsigned int D.22113;
  char * (*<T3212>) (struct MonoVTable *, char *, size_t, gboolean) D.22114;
  _Bool D.22115;
  long int D.22116;
  long int D.22117;
  int D.22120;
  _Bool D.22124;
  long int D.22125;
  long int D.22126;
  void * D.22129;
  struct SgenGrayQueue * iftmp.97;
  long unsigned int destination.98;
  long unsigned int D.22135;
  struct MonoVTable * vt;
  gboolean has_references;
  mword objsize;
  char * destination;

  vt = MEM[(struct MonoObject *)obj].vtable;
  D.22109 = vt->gc_descr;
  D.22110 = (long unsigned int) D.22109;
  has_references = sgen_gc_descr_has_references (D.22110);
  D.22111 = sgen_par_object_get_size (vt, obj);
  D.22112 = D.22111 + 7;
  D.22113 = (long unsigned int) D.22112;
  objsize = D.22113 & 4294967288;
  D.22114 = sgen_minor_collector.alloc_for_promotion;
  destination = D.22114 (vt, obj, objsize, has_references);
  D.22115 = destination == 0B;
  D.22116 = (long int) D.22115;
  D.22117 = __builtin_expect (D.22116, 0);
  if (D.22117 != 0) goto <D.22118>; else goto <D.22119>;
  <D.22118>:
  D.22120 = sgen_ptr_in_nursery (obj);
  if (D.22120 != 0) goto <D.22121>; else goto <D.22122>;
  <D.22121>:
  sgen_pin_object (obj, queue);
  goto <D.22123>;
  <D.22122>:
  D.22124 = objsize > 8000;
  D.22125 = (long int) D.22124;
  D.22126 = __builtin_expect (D.22125, 0);
  if (D.22126 != 0) goto <D.22127>; else goto <D.22128>;
  <D.22127>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-copy-object.h", 115, "objsize <= SGEN_MAX_SMALL_OBJ_SIZE");
  <D.22128>:
  pin_major_object (obj, queue);
  <D.22123>:
  sgen_set_pinned_from_failed_allocation (objsize);
  D.22129 = obj;
  return D.22129;
  <D.22119>:
  if (has_references != 0) goto <D.22131>; else goto <D.22132>;
  <D.22131>:
  iftmp.97 = queue;
  goto <D.22133>;
  <D.22132>:
  iftmp.97 = 0B;
  <D.22133>:
  par_copy_object_no_checks (destination, vt, obj, objsize, iftmp.97);
  destination.98 = (long unsigned int) destination;
  D.22135 = destination.98 | 1;
  MEM[(mword *)obj] = D.22135;
  D.22129 = destination;
  return D.22129;
}


par_copy_object_no_checks (char * destination, struct MonoVTable * vt, void * obj, mword objsize, struct SgenGrayQueue * queue)
{
  struct MonoClass * D.22139;
  const char * D.22140;
  const char * D.22141;
  struct FILE * gc_debug_file.99;
  struct MonoVTable * D.22145;
  struct MonoClass * D.22146;
  const char * D.22147;
  long unsigned int D.22150;
  const void * D.22151;
  mword * D.22152;
  long unsigned int D.22153;
  mword * D.22154;
  long unsigned int D.22155;
  mword * D.22156;
  long unsigned int D.22157;
  mword * D.22158;
  long unsigned int D.22159;
  mword * D.22160;
  long unsigned int D.22161;
  mword * D.22162;
  long unsigned int D.22163;
  mword * D.22164;
  long unsigned int D.22165;
  char * D.22167;
  const void * D.22168;
  long unsigned int D.22169;
  int iftmp.100;
  unsigned char D.22175;
  struct MonoArrayBounds * D.22177;
  _Bool D.22179;
  long int D.22180;
  long int D.22181;
  long int D.22184;
  long int obj.101;
  long int D.22186;
  sizetype D.22187;
  char * D.22188;
  int D.22191;
  long unsigned int D.22192;
  <unnamed type> mono_profiler_events.102;
  unsigned int D.22194;
  _Bool D.22195;
  long int D.22196;
  long int D.22197;
  const char * D.22204;
  int iftmp.103;
  struct GrayQueueSection * D.22209;
  int D.22211;
  _Bool D.22212;
  long int D.22213;
  long int D.22214;
  int D.22218;
  int D.22219;
  static const void * copy_labels[9] = {(const void *) &LAB_0, (const void *) &LAB_1, (const void *) &LAB_2, (const void *) &LAB_3, (const void *) &LAB_4, (const void *) &LAB_5, (const void *) &LAB_6, (const void *) &LAB_7, (const void *) &LAB_8};
  void LAB_0 = <<< error >>>;
  void LAB_1 = <<< error >>>;
  void LAB_2 = <<< error >>>;
  void LAB_3 = <<< error >>>;
  void LAB_4 = <<< error >>>;
  void LAB_5 = <<< error >>>;
  void LAB_6 = <<< error >>>;
  void LAB_7 = <<< error >>>;
  void LAB_8 = <<< error >>>;

  if (0 != 0) goto <D.22137>; else goto <D.22138>;
  <D.22137>:
  D.22139 = vt->klass;
  D.22140 = D.22139->name_space;
  D.22139 = vt->klass;
  D.22141 = D.22139->name;
  monoeg_g_log (0B, 4, "vtable %p for class %s:%s was not initialized", vt, D.22140, D.22141);
  <D.19934>:
  goto <D.19934>;
  <D.22138>:
  if (0 != 0) goto <D.22142>; else goto <D.22143>;
  <D.22142>:
  gc_debug_file.99 = gc_debug_file;
  D.22145 = MEM[(struct MonoObject *)obj].vtable;
  D.22146 = D.22145->klass;
  D.22147 = D.22146->name;
  fprintf (gc_debug_file.99, " (to %p, %s size: %lu)\n", destination, D.22147, objsize);
  gc_debug_file.99 = gc_debug_file;
  fflush (gc_debug_file.99);
  <D.22143>:
  if (objsize <= 64) goto <D.22148>; else goto <D.22149>;
  <D.22148>:
  {
    mword * dest;

    dest = destination;
    D.22150 = objsize / 8;
    D.22151 = copy_labels[D.22150];
    goto D.22151;
    LAB_8:
    D.22152 = dest + 56;
    D.22153 = MEM[(mword *)obj + 56B];
    *D.22152 = D.22153;
    LAB_7:
    D.22154 = dest + 48;
    D.22155 = MEM[(mword *)obj + 48B];
    *D.22154 = D.22155;
    LAB_6:
    D.22156 = dest + 40;
    D.22157 = MEM[(mword *)obj + 40B];
    *D.22156 = D.22157;
    LAB_5:
    D.22158 = dest + 32;
    D.22159 = MEM[(mword *)obj + 32B];
    *D.22158 = D.22159;
    LAB_4:
    D.22160 = dest + 24;
    D.22161 = MEM[(mword *)obj + 24B];
    *D.22160 = D.22161;
    LAB_3:
    D.22162 = dest + 16;
    D.22163 = MEM[(mword *)obj + 16B];
    *D.22162 = D.22163;
    LAB_2:
    D.22164 = dest + 8;
    D.22165 = MEM[(mword *)obj + 8B];
    *D.22164 = D.22165;
    LAB_1:
    LAB_0:
  }
  goto <D.22166>;
  <D.22149>:
  D.22167 = destination + 8;
  D.22168 = obj + 8;
  D.22169 = objsize + 18446744073709551608;
  mono_gc_memmove_aligned (D.22167, D.22168, D.22169);
  <D.22166>:
  if (0 != 0) goto <D.22170>; else goto <D.22171>;
  <D.22170>:
  D.22139 = vt->klass;
  D.22140 = D.22139->name_space;
  D.22139 = vt->klass;
  D.22141 = D.22139->name;
  monoeg_g_log (0B, 4, "vtable %p for class %s:%s has no gc descriptor", vt, D.22140, D.22141);
  <D.19936>:
  goto <D.19936>;
  <D.22171>:
  D.22175 = vt->rank;
  if (D.22175 != 0) goto <D.22176>; else goto <D.22173>;
  <D.22176>:
  D.22177 = MEM[(struct MonoArray *)obj].bounds;
  if (D.22177 != 0B) goto <D.22178>; else goto <D.22173>;
  <D.22178>:
  iftmp.100 = 1;
  goto <D.22174>;
  <D.22173>:
  iftmp.100 = 0;
  <D.22174>:
  D.22179 = iftmp.100 != 0;
  D.22180 = (long int) D.22179;
  D.22181 = __builtin_expect (D.22180, 0);
  if (D.22181 != 0) goto <D.22182>; else goto <D.22183>;
  <D.22182>:
  {
    struct MonoArray * array;

    array = destination;
    D.22177 = MEM[(struct MonoArray *)obj].bounds;
    D.22184 = (long int) D.22177;
    obj.101 = (long int) obj;
    D.22186 = D.22184 - obj.101;
    D.22187 = (sizetype) D.22186;
    D.22188 = destination + D.22187;
    array->bounds = D.22188;
    if (0 != 0) goto <D.22189>; else goto <D.22190>;
    <D.22189>:
    gc_debug_file.99 = gc_debug_file;
    D.22175 = vt->rank;
    D.22191 = (int) D.22175;
    D.22192 = mono_array_length (array);
    fprintf (gc_debug_file.99, "Array instance %p: size: %lu, rank: %d, length: %lu\n", array, objsize, D.22191, D.22192);
    gc_debug_file.99 = gc_debug_file;
    fflush (gc_debug_file.99);
    <D.22190>:
  }
  <D.22183>:
  mono_profiler_events.102 = mono_profiler_events;
  D.22194 = mono_profiler_events.102 & 524288;
  D.22195 = D.22194 != 0;
  D.22196 = (long int) D.22195;
  D.22197 = __builtin_expect (D.22196, 0);
  if (D.22197 != 0) goto <D.22198>; else goto <D.22199>;
  <D.22198>:
  sgen_register_moved_object (obj, destination);
  <D.22199>:
  obj = destination;
  if (queue != 0B) goto <D.22200>; else goto <D.22201>;
  <D.22200>:
  if (0 != 0) goto <D.22202>; else goto <D.22203>;
  <D.22202>:
  gc_debug_file.99 = gc_debug_file;
  D.22204 = sgen_safe_name (obj);
  fprintf (gc_debug_file.99, "Enqueuing gray object %p (%s)\n", obj, D.22204);
  gc_debug_file.99 = gc_debug_file;
  fflush (gc_debug_file.99);
  <D.22203>:
  D.22209 = queue->first;
  if (D.22209 == 0B) goto <D.22206>; else goto <D.22210>;
  <D.22210>:
  D.22209 = queue->first;
  D.22211 = D.22209->end;
  if (D.22211 == 125) goto <D.22206>; else goto <D.22207>;
  <D.22206>:
  iftmp.103 = 1;
  goto <D.22208>;
  <D.22207>:
  iftmp.103 = 0;
  <D.22208>:
  D.22212 = iftmp.103 != 0;
  D.22213 = (long int) D.22212;
  D.22214 = __builtin_expect (D.22213, 0);
  if (D.22214 != 0) goto <D.22215>; else goto <D.22216>;
  <D.22215>:
  sgen_gray_object_enqueue (queue, obj);
  goto <D.22217>;
  <D.22216>:
  D.22209 = queue->first;
  D.22209 = queue->first;
  D.22211 = D.22209->end;
  D.22218 = D.22211;
  D.22219 = D.22218 + 1;
  D.22209->end = D.22219;
  D.22209->objects[D.22218] = obj;
  <D.22217>:
  __builtin_prefetch (obj);
  <D.22201>:
}


major_copy_or_mark_object_canonical (void * * ptr, struct SgenGrayQueue * queue)
{
  void * D.22222;

  D.22222 = *ptr;
  major_copy_or_mark_object (ptr, D.22222, queue);
}


major_describe_pointer (char * ptr)
{
  char * D.22225;
  char * D.22227;
  int gc_debug_level.105;
  _Bool D.22229;
  long int D.22230;
  long int D.22231;
  struct FILE * gc_debug_file.106;
  int D.22235;
  <unnamed-unsigned:1> D.22236;
  int D.22237;
  <unnamed-unsigned:1> D.22238;
  int D.22239;
  long int ptr.107;
  char * D.22241;
  long int D.22242;
  long int D.22243;
  long int D.22244;
  long int D.22245;
  int D.22246;
  sizetype D.22247;
  sizetype D.22248;
  int iftmp.108;
  void * D.22253;
  char * D.22255;
  struct MonoVTable * iftmp.109;
  long unsigned int D.22260;
  long unsigned int D.22261;
  long int obj.110;
  long int D.22264;
  int D.22265;
  long unsigned int D.22269;
  unsigned int D.22270;
  long int D.22271;
  unsigned int D.22272;
  unsigned int D.22273;
  long int D.22290;
  _Bool D.22296;
  int D.22297;
  struct MonoVTable * D.22298;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.19867>;
  <D.19866>:
  {
    int idx;
    char * obj;
    gboolean live;
    struct MonoVTable * vtable;
    int w;
    int b;
    gboolean marked;

    D.22225 = block->block;
    if (D.22225 > ptr) goto <D.22223>; else goto <D.22226>;
    <D.22226>:
    D.22225 = block->block;
    D.22227 = D.22225 + 16384;
    if (D.22227 <= ptr) goto <D.22223>; else goto <D.22224>;
    <D.22223>:
    // predicted unlikely by continue predictor.
    goto <D.19864>;
    <D.22224>:
    gc_debug_level.105 = gc_debug_level;
    D.22229 = gc_debug_level.105 >= 0;
    D.22230 = (long int) D.22229;
    D.22231 = __builtin_expect (D.22230, 0);
    if (D.22231 != 0) goto <D.22232>; else goto <D.22233>;
    <D.22232>:
    gc_debug_file.106 = gc_debug_file;
    D.22225 = block->block;
    D.22235 = block->obj_size;
    D.22236 = block->pinned;
    D.22237 = (int) D.22236;
    D.22238 = block->has_references;
    D.22239 = (int) D.22238;
    fprintf (gc_debug_file.106, "major-ptr (block %p sz %d pin %d ref %d)\n\n", D.22225, D.22235, D.22237, D.22239);
    gc_debug_file.106 = gc_debug_file;
    fflush (gc_debug_file.106);
    <D.22233>:
    ptr.107 = (long int) ptr;
    D.22225 = block->block;
    D.22241 = D.22225 + 16;
    D.22242 = (long int) D.22241;
    D.22243 = ptr.107 - D.22242;
    D.22235 = block->obj_size;
    D.22244 = (long int) D.22235;
    D.22245 = D.22243 / D.22244;
    idx = (int) D.22245;
    D.22225 = block->block;
    D.22235 = block->obj_size;
    D.22246 = D.22235 * idx;
    D.22247 = (sizetype) D.22246;
    D.22248 = D.22247 + 16;
    obj = D.22225 + D.22248;
    D.22253 = MEM[(void * *)obj];
    if (D.22253 != 0B) goto <D.22254>; else goto <D.22250>;
    <D.22254>:
    D.22255 = MEM[(char * *)obj];
    D.22225 = block->block;
    if (D.22255 < D.22225) goto <D.22251>; else goto <D.22256>;
    <D.22256>:
    D.22255 = MEM[(char * *)obj];
    D.22225 = block->block;
    D.22227 = D.22225 + 16384;
    if (D.22255 >= D.22227) goto <D.22251>; else goto <D.22250>;
    <D.22251>:
    iftmp.108 = 1;
    goto <D.22252>;
    <D.22250>:
    iftmp.108 = 0;
    <D.22252>:
    live = iftmp.108;
    if (live != 0) goto <D.22258>; else goto <D.22259>;
    <D.22258>:
    D.22260 = MEM[(mword *)obj];
    D.22261 = D.22260 & 18446744073709551612;
    iftmp.109 = (struct MonoVTable *) D.22261;
    goto <D.22262>;
    <D.22259>:
    iftmp.109 = 0B;
    <D.22262>:
    vtable = iftmp.109;
    {
      int i;

      obj.110 = (long int) obj;
      D.22264 = obj.110 >> 3;
      D.22265 = (int) D.22264;
      i = D.22265 & 2047;
      if (0 != 0) goto <D.22266>; else goto <D.22267>;
      <D.22266>:
      w = i >> 5;
      b = i & 31;
      goto <D.22268>;
      <D.22267>:
      w = i >> 6;
      b = i & 63;
      <D.22268>:
    }
    D.22269 = block->mark_words[w];
    D.22270 = (unsigned int) D.22269;
    D.22271 = 1 << b;
    D.22272 = (unsigned int) D.22271;
    D.22273 = D.22270 & D.22272;
    marked = (gboolean) D.22273;
    if (obj == ptr) goto <D.22274>; else goto <D.22275>;
    <D.22274>:
    gc_debug_level.105 = gc_debug_level;
    D.22229 = gc_debug_level.105 >= 0;
    D.22230 = (long int) D.22229;
    D.22231 = __builtin_expect (D.22230, 0);
    if (D.22231 != 0) goto <D.22276>; else goto <D.22277>;
    <D.22276>:
    gc_debug_file.106 = gc_debug_file;
    fprintf (gc_debug_file.106, "\t(\n");
    gc_debug_file.106 = gc_debug_file;
    fflush (gc_debug_file.106);
    <D.22277>:
    if (live != 0) goto <D.22278>; else goto <D.22279>;
    <D.22278>:
    gc_debug_level.105 = gc_debug_level;
    D.22229 = gc_debug_level.105 >= 0;
    D.22230 = (long int) D.22229;
    D.22231 = __builtin_expect (D.22230, 0);
    if (D.22231 != 0) goto <D.22280>; else goto <D.22281>;
    <D.22280>:
    gc_debug_file.106 = gc_debug_file;
    fprintf (gc_debug_file.106, "object\n");
    gc_debug_file.106 = gc_debug_file;
    fflush (gc_debug_file.106);
    <D.22281>:
    goto <D.22282>;
    <D.22279>:
    gc_debug_level.105 = gc_debug_level;
    D.22229 = gc_debug_level.105 >= 0;
    D.22230 = (long int) D.22229;
    D.22231 = __builtin_expect (D.22230, 0);
    if (D.22231 != 0) goto <D.22283>; else goto <D.22284>;
    <D.22283>:
    gc_debug_file.106 = gc_debug_file;
    fprintf (gc_debug_file.106, "dead-object\n");
    gc_debug_file.106 = gc_debug_file;
    fflush (gc_debug_file.106);
    <D.22284>:
    <D.22282>:
    goto <D.22285>;
    <D.22275>:
    if (live != 0) goto <D.22286>; else goto <D.22287>;
    <D.22286>:
    gc_debug_level.105 = gc_debug_level;
    D.22229 = gc_debug_level.105 >= 0;
    D.22230 = (long int) D.22229;
    D.22231 = __builtin_expect (D.22230, 0);
    if (D.22231 != 0) goto <D.22288>; else goto <D.22289>;
    <D.22288>:
    gc_debug_file.106 = gc_debug_file;
    ptr.107 = (long int) ptr;
    obj.110 = (long int) obj;
    D.22290 = ptr.107 - obj.110;
    fprintf (gc_debug_file.106, "interior-ptr offset %td\n", D.22290);
    gc_debug_file.106 = gc_debug_file;
    fflush (gc_debug_file.106);
    <D.22289>:
    goto <D.22291>;
    <D.22287>:
    gc_debug_level.105 = gc_debug_level;
    D.22229 = gc_debug_level.105 >= 0;
    D.22230 = (long int) D.22229;
    D.22231 = __builtin_expect (D.22230, 0);
    if (D.22231 != 0) goto <D.22292>; else goto <D.22293>;
    <D.22292>:
    gc_debug_file.106 = gc_debug_file;
    ptr.107 = (long int) ptr;
    obj.110 = (long int) obj;
    D.22290 = ptr.107 - obj.110;
    fprintf (gc_debug_file.106, "dead-interior-ptr offset %td\n", D.22290);
    gc_debug_file.106 = gc_debug_file;
    fflush (gc_debug_file.106);
    <D.22293>:
    <D.22291>:
    <D.22285>:
    gc_debug_level.105 = gc_debug_level;
    D.22229 = gc_debug_level.105 >= 0;
    D.22230 = (long int) D.22229;
    D.22231 = __builtin_expect (D.22230, 0);
    if (D.22231 != 0) goto <D.22294>; else goto <D.22295>;
    <D.22294>:
    gc_debug_file.106 = gc_debug_file;
    D.22296 = marked != 0;
    D.22297 = (int) D.22296;
    fprintf (gc_debug_file.106, " marked %d)\n\n", D.22297);
    gc_debug_file.106 = gc_debug_file;
    fflush (gc_debug_file.106);
    <D.22295>:
    D.22298 = vtable;
    return D.22298;
  }
  <D.19864>:
  block = block->next;
  <D.19867>:
  if (block != 0B) goto <D.19866>; else goto <D.19868>;
  <D.19868>:
  D.22298 = 0B;
  return D.22298;
}


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

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


major_is_valid_object (char * object)
{
  char * D.22304;
  char * D.22306;
  long int object.111;
  char * D.22308;
  long int D.22309;
  long int D.22310;
  int D.22311;
  long int D.22312;
  long int D.22313;
  int D.22314;
  sizetype D.22315;
  sizetype D.22316;
  gboolean D.22319;
  int iftmp.112;
  void * D.22324;
  char * D.22326;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.19851>;
  <D.19850>:
  {
    int idx;
    char * obj;

    D.22304 = block->block;
    if (D.22304 > object) goto <D.22302>; else goto <D.22305>;
    <D.22305>:
    D.22304 = block->block;
    D.22306 = D.22304 + 16384;
    if (D.22306 <= object) goto <D.22302>; else goto <D.22303>;
    <D.22302>:
    // predicted unlikely by continue predictor.
    goto <D.19849>;
    <D.22303>:
    object.111 = (long int) object;
    D.22304 = block->block;
    D.22308 = D.22304 + 16;
    D.22309 = (long int) D.22308;
    D.22310 = object.111 - D.22309;
    D.22311 = block->obj_size;
    D.22312 = (long int) D.22311;
    D.22313 = D.22310 / D.22312;
    idx = (int) D.22313;
    D.22304 = block->block;
    D.22311 = block->obj_size;
    D.22314 = D.22311 * idx;
    D.22315 = (sizetype) D.22314;
    D.22316 = D.22315 + 16;
    obj = D.22304 + D.22316;
    if (obj != object) goto <D.22317>; else goto <D.22318>;
    <D.22317>:
    D.22319 = 0;
    return D.22319;
    <D.22318>:
    D.22324 = MEM[(void * *)obj];
    if (D.22324 != 0B) goto <D.22325>; else goto <D.22321>;
    <D.22325>:
    D.22326 = MEM[(char * *)obj];
    D.22304 = block->block;
    if (D.22326 < D.22304) goto <D.22322>; else goto <D.22327>;
    <D.22327>:
    D.22326 = MEM[(char * *)obj];
    D.22304 = block->block;
    D.22306 = D.22304 + 16384;
    if (D.22326 >= D.22306) goto <D.22322>; else goto <D.22321>;
    <D.22322>:
    iftmp.112 = 1;
    goto <D.22323>;
    <D.22321>:
    iftmp.112 = 0;
    <D.22323>:
    D.22319 = iftmp.112;
    return D.22319;
  }
  <D.19849>:
  block = block->next;
  <D.19851>:
  if (block != 0B) goto <D.19850>; else goto <D.19852>;
  <D.19852>:
  D.22319 = 0;
  return D.22319;
}


post_param_init (struct SgenMajorCollector * collector)
{
  int lazy_sweep.113;

  lazy_sweep.113 = lazy_sweep;
  collector->sweeps_lazily = lazy_sweep.113;
}


major_print_gc_param_usage ()
{
  struct _IO_FILE * stderr.114;

  stderr.114 = stderr;
  fprintf (stderr.114, "  evacuation-threshold=P (where P is a percentage, an integer in 0-100)\n  (no-)lazy-sweep\n");
}


major_handle_gc_param (const char * opt)
{
  int D.22331;
  char * D.22334;
  unsigned int percentage.115;
  struct _IO_FILE * stderr.116;
  float D.22339;
  float D.22340;
  gboolean D.22341;
  int D.22342;
  int D.22345;

  D.22331 = monoeg_g_str_has_prefix (opt, "evacuation-threshold=");
  if (D.22331 != 0) goto <D.22332>; else goto <D.22333>;
  <D.22332>:
  {
    const char * arg;
    int percentage;

    D.22334 = __builtin_strchr (opt, 61);
    arg = D.22334 + 1;
    percentage = atoi (arg);
    percentage.115 = (unsigned int) percentage;
    if (percentage.115 > 100) goto <D.22336>; else goto <D.22337>;
    <D.22336>:
    stderr.116 = stderr;
    fprintf (stderr.116, "evacuation-threshold must be an integer in the range 0-100.\n");
    exit (1);
    <D.22337>:
    D.22339 = (float) percentage;
    D.22340 = D.22339 / 1.0e+2;
    evacuation_threshold = D.22340;
    D.22341 = 1;
    return D.22341;
  }
  <D.22333>:
  D.22342 = strcmp (opt, "lazy-sweep");
  if (D.22342 == 0) goto <D.22343>; else goto <D.22344>;
  <D.22343>:
  lazy_sweep = 1;
  D.22341 = 1;
  return D.22341;
  <D.22344>:
  D.22345 = strcmp (opt, "no-lazy-sweep");
  if (D.22345 == 0) goto <D.22346>; else goto <D.22347>;
  <D.22346>:
  lazy_sweep = 0;
  D.22341 = 1;
  return D.22341;
  <D.22347>:
  D.22341 = 0;
  return D.22341;
}


__attribute__((__gnu_inline__, __pure__, __leaf__, __nothrow__))
atoi (const char * __nptr)
{
  int D.22349;
  long int D.22350;

  D.22350 = strtol (__nptr, 0B, 10);
  D.22349 = (int) D.22350;
  return D.22349;
}


__attribute__((__gnu_inline__, nothrow, leaf, pure))
strcmp (const char * __s1, const char * __s2)
{
  int iftmp.117;
  int iftmp.118;
  int D.22360;
  char * __p1;
  char * __p2;
  int __ret;

  __p1 = __s1;
  __p2 = __s2;
  __asm__ __volatile__("   slr   0,0
0: clst  %1,%2
   jo    0b
   ipm   %0
   srl   %0,28" : "=d" __ret, "=&a" __p1, "=&a" __p2 : "1" __p1, "2" __p2 : "0", "memory", "cc");
  if (__ret != 0) goto <D.22353>; else goto <D.22354>;
  <D.22353>:
  if (__ret == 1) goto <D.22356>; else goto <D.22357>;
  <D.22356>:
  iftmp.118 = -1;
  goto <D.22358>;
  <D.22357>:
  iftmp.118 = 1;
  <D.22358>:
  iftmp.117 = iftmp.118;
  goto <D.22359>;
  <D.22354>:
  iftmp.117 = 0;
  <D.22359>:
  __ret = iftmp.117;
  D.22360 = __ret;
  return D.22360;
}


get_num_major_sections ()
{
  int D.22362;

  D.22362 = num_major_sections;
  return D.22362;
}


major_report_pinned_memory_usage ()
{
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-marksweep.c", 2077);
}


obj_is_from_pinned_alloc (char * ptr)
{
  char * D.22364;
  char * D.22367;
  gboolean D.22370;
  <unnamed-unsigned:1> D.22371;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.19745>;
  <D.19744>:
  D.22364 = block->block;
  if (D.22364 <= ptr) goto <D.22365>; else goto <D.22366>;
  <D.22365>:
  D.22364 = block->block;
  D.22367 = D.22364 + 16384;
  if (D.22367 >= ptr) goto <D.22368>; else goto <D.22369>;
  <D.22368>:
  D.22371 = block->pinned;
  D.22370 = (gboolean) D.22371;
  return D.22370;
  <D.22369>:
  <D.22366>:
  block = block->next;
  <D.19745>:
  if (block != 0B) goto <D.19744>; else goto <D.19746>;
  <D.19746>:
  D.22370 = 0;
  return D.22370;
}


major_ptr_is_in_non_pinned_space (char * ptr, char * * start)
{
  char * D.22373;
  char * D.22376;
  int D.22379;
  int D.22380;
  sizetype D.22381;
  sizetype D.22382;
  char * D.22383;
  int D.22386;
  int D.22387;
  sizetype D.22388;
  sizetype D.22389;
  char * D.22390;
  gboolean D.22393;
  long unsigned int D.22394;
  long unsigned int D.22395;
  _Bool D.22396;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.19824>;
  <D.19823>:
  D.22373 = block->block;
  if (D.22373 <= ptr) goto <D.22374>; else goto <D.22375>;
  <D.22374>:
  D.22373 = block->block;
  D.22376 = D.22373 + 16384;
  if (D.22376 >= ptr) goto <D.22377>; else goto <D.22378>;
  <D.22377>:
  {
    int count;
    int i;

    D.22379 = block->obj_size;
    count = 16368 / D.22379;
    *start = 0B;
    i = 0;
    goto <D.19822>;
    <D.19821>:
    D.22373 = block->block;
    D.22379 = block->obj_size;
    D.22380 = D.22379 * i;
    D.22381 = (sizetype) D.22380;
    D.22382 = D.22381 + 16;
    D.22383 = D.22373 + D.22382;
    if (D.22383 <= ptr) goto <D.22384>; else goto <D.22385>;
    <D.22384>:
    D.22373 = block->block;
    D.22379 = block->obj_size;
    D.22386 = i + 1;
    D.22387 = D.22379 * D.22386;
    D.22388 = (sizetype) D.22387;
    D.22389 = D.22388 + 16;
    D.22390 = D.22373 + D.22389;
    if (D.22390 > ptr) goto <D.22391>; else goto <D.22392>;
    <D.22391>:
    D.22373 = block->block;
    D.22379 = block->obj_size;
    D.22380 = D.22379 * i;
    D.22381 = (sizetype) D.22380;
    D.22382 = D.22381 + 16;
    D.22383 = D.22373 + D.22382;
    *start = D.22383;
    goto <D.19820>;
    <D.22392>:
    <D.22385>:
    i = i + 1;
    <D.19822>:
    if (i <= count) goto <D.19821>; else goto <D.19820>;
    <D.19820>:
    D.22394 = BIT_FIELD_REF <*block, 64, 64>;
    D.22395 = D.22394 & 2147483648;
    D.22396 = D.22395 == 0;
    D.22393 = (gboolean) D.22396;
    return D.22393;
  }
  <D.22378>:
  <D.22375>:
  block = block->next;
  <D.19824>:
  if (block != 0B) goto <D.19823>; else goto <D.19825>;
  <D.19825>:
  D.22393 = 0;
  return D.22393;
}


major_have_computer_minor_collection_allowance ()
{
  long unsigned int D.22398;
  long unsigned int D.22399;
  int have_swept.119;
  _Bool D.22401;
  long int D.22402;
  long int D.22403;
  void * empty_blocks.120;
  int num_empty_blocks.121;
  int D.22408;
  long long int stat_major_blocks_freed.122;
  long long int D.22410;
  int section_reserve;

  D.22398 = sgen_get_minor_collection_allowance ();
  D.22399 = D.22398 / 16384;
  section_reserve = (int) D.22399;
  have_swept.119 = have_swept;
  D.22401 = have_swept.119 == 0;
  D.22402 = (long int) D.22401;
  D.22403 = __builtin_expect (D.22402, 0);
  if (D.22403 != 0) goto <D.22404>; else goto <D.22405>;
  <D.22404>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 1898, "have_swept");
  <D.22405>:
  goto <D.20461>;
  <D.20460>:
  {
    void * next;

    empty_blocks.120 = empty_blocks;
    next = MEM[(void * *)empty_blocks.120];
    empty_blocks.120 = empty_blocks;
    sgen_free_os_memory (empty_blocks.120, 16384, 1);
    empty_blocks = next;
    num_empty_blocks.121 = num_empty_blocks;
    D.22408 = num_empty_blocks.121 + -1;
    num_empty_blocks = D.22408;
    stat_major_blocks_freed.122 = stat_major_blocks_freed;
    D.22410 = stat_major_blocks_freed.122 + 1;
    stat_major_blocks_freed = D.22410;
  }
  <D.20461>:
  num_empty_blocks.121 = num_empty_blocks;
  if (num_empty_blocks.121 > section_reserve) goto <D.20460>; else goto <D.20462>;
  <D.20462>:
}


major_finish_major_collection ()
{

}


major_start_major_collection ()
{
  gboolean * evacuate_block_obj_sizes.123;
  long unsigned int D.22412;
  long unsigned int D.22413;
  gboolean * D.22414;
  int D.22415;
  struct MSBlockInfo * * D.22418;
  long unsigned int D.22419;
  struct MSBlockInfo * * D.22420;
  struct MSBlockInfo * * D.22421;
  struct MSBlockInfo * * D.22422;
  int num_block_obj_sizes.124;
  int lazy_sweep.125;
  struct MSBlockInfo * D.22427;
  int i;

  i = 0;
  goto <D.20445>;
  <D.20444>:
  evacuate_block_obj_sizes.123 = evacuate_block_obj_sizes;
  D.22412 = (long unsigned int) i;
  D.22413 = D.22412 * 4;
  D.22414 = evacuate_block_obj_sizes.123 + D.22413;
  D.22415 = *D.22414;
  if (D.22415 == 0) goto <D.22416>; else goto <D.22417>;
  <D.22416>:
  // predicted unlikely by continue predictor.
  goto <D.20443>;
  <D.22417>:
  D.22418 = free_block_lists[0];
  D.22412 = (long unsigned int) i;
  D.22419 = D.22412 * 8;
  D.22420 = D.22418 + D.22419;
  *D.22420 = 0B;
  D.22421 = free_block_lists[2];
  D.22412 = (long unsigned int) i;
  D.22419 = D.22412 * 8;
  D.22422 = D.22421 + D.22419;
  *D.22422 = 0B;
  <D.20443>:
  i = i + 1;
  <D.20445>:
  num_block_obj_sizes.124 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.124) goto <D.20444>; else goto <D.20446>;
  <D.20446>:
  lazy_sweep.125 = lazy_sweep;
  if (lazy_sweep.125 != 0) goto <D.22425>; else goto <D.22426>;
  <D.22425>:
  {
    struct MSBlockInfo * * iter;

    iter = &all_blocks;
    goto <D.20450>;
    <D.20449>:
    {
      struct MSBlockInfo * block;

      block = *iter;
      sweep_block (block, 1);
      iter = &block->next;
    }
    <D.20450>:
    D.22427 = *iter;
    if (D.22427 != 0B) goto <D.20449>; else goto <D.20451>;
    <D.20451>:
  }
  <D.22426>:
}


sweep_block (struct MSBlockInfo * block, gboolean during_major_collection)
{
  int D.22430;
  _Bool D.22431;
  long int D.22432;
  long int D.22433;
  long unsigned int D.22436;
  long unsigned int D.22437;
  int D.22440;
  mword[32] * D.22441;
  void * * D.22442;
  int count;
  void * reversed;

  reversed = 0B;
  if (during_major_collection == 0) goto <D.22428>; else goto <D.22429>;
  <D.22428>:
  D.22430 = sgen_concurrent_collection_in_progress ();
  D.22431 = D.22430 != 0;
  D.22432 = (long int) D.22431;
  D.22433 = __builtin_expect (D.22432, 0);
  if (D.22433 != 0) goto <D.22434>; else goto <D.22435>;
  <D.22434>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 1551, "!sgen_concurrent_collection_in_progress ()");
  <D.22435>:
  <D.22429>:
  D.22436 = BIT_FIELD_REF <*block, 64, 64>;
  D.22437 = D.22436 & 134217728;
  if (D.22437 != 0) goto <D.22438>; else goto <D.22439>;
  <D.22438>:
  return;
  <D.22439>:
  D.22440 = block->obj_size;
  count = 16368 / D.22440;
  block->free_list = 0B;
  D.22440 = block->obj_size;
  switch (D.22440) <default: <D.20348>, case 16: <D.20346>>
  <D.20346>:
  sweep_block_for_size (block, count, 16);
  goto <D.20347>;
  <D.20348>:
  D.22440 = block->obj_size;
  sweep_block_for_size (block, count, D.22440);
  goto <D.20347>;
  <D.20347>:
  D.22441 = &block->mark_words;
  memset (D.22441, 0, 256);
  reversed = 0B;
  goto <D.20351>;
  <D.20350>:
  {
    void * next;

    D.22442 = block->free_list;
    next = *D.22442;
    D.22442 = block->free_list;
    *D.22442 = reversed;
    reversed = block->free_list;
    block->free_list = next;
  }
  <D.20351>:
  D.22442 = block->free_list;
  if (D.22442 != 0B) goto <D.20350>; else goto <D.20352>;
  <D.20352>:
  block->free_list = reversed;
  block->swept = 1;
}


sweep_block_for_size (struct MSBlockInfo * block, int count, int obj_size)
{
  char * D.22444;
  int D.22445;
  sizetype D.22446;
  sizetype D.22447;
  long int obj.126;
  long int D.22449;
  int D.22450;
  long unsigned int D.22454;
  long int D.22455;
  long unsigned int D.22456;
  long unsigned int D.22457;
  void * D.22465;
  char * D.22468;
  char * D.22470;
  long unsigned int D.22471;
  void * * D.22472;
  int obj_index;

  obj_index = 0;
  goto <D.20338>;
  <D.20337>:
  {
    int word;
    int bit;
    void * obj;

    D.22444 = block->block;
    D.22445 = obj_size * obj_index;
    D.22446 = (sizetype) D.22445;
    D.22447 = D.22446 + 16;
    obj = D.22444 + D.22447;
    {
      int i;

      obj.126 = (long int) obj;
      D.22449 = obj.126 >> 3;
      D.22450 = (int) D.22449;
      i = D.22450 & 2047;
      if (0 != 0) goto <D.22451>; else goto <D.22452>;
      <D.22451>:
      word = i >> 5;
      bit = i & 31;
      goto <D.22453>;
      <D.22452>:
      word = i >> 6;
      bit = i & 63;
      <D.22453>:
    }
    D.22454 = block->mark_words[word];
    D.22455 = 1 << bit;
    D.22456 = (long unsigned int) D.22455;
    D.22457 = D.22454 & D.22456;
    if (D.22457 != 0) goto <D.22458>; else goto <D.22459>;
    <D.22458>:
    if (0 != 0) goto <D.22460>; else goto <D.22461>;
    <D.22460>:
    monoeg_g_log (0B, 4, "object %p not allocated", obj);
    <D.20336>:
    goto <D.20336>;
    <D.22461>:
    goto <D.22462>;
    <D.22459>:
    D.22465 = MEM[(void * *)obj];
    if (D.22465 != 0B) goto <D.22466>; else goto <D.22467>;
    <D.22466>:
    D.22468 = MEM[(char * *)obj];
    D.22444 = block->block;
    if (D.22468 < D.22444) goto <D.22463>; else goto <D.22469>;
    <D.22469>:
    D.22468 = MEM[(char * *)obj];
    D.22444 = block->block;
    D.22470 = D.22444 + 16384;
    if (D.22468 >= D.22470) goto <D.22463>; else goto <D.22464>;
    <D.22463>:
    D.22471 = (long unsigned int) obj_size;
    memset (obj, 0, D.22471);
    <D.22464>:
    <D.22467>:
    D.22472 = block->free_list;
    MEM[(void * *)obj] = D.22472;
    block->free_list = obj;
    <D.22462>:
  }
  obj_index = obj_index + 1;
  <D.20338>:
  if (obj_index < count) goto <D.20337>; else goto <D.20339>;
  <D.20339>:
}


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

  D.22474 = __builtin_object_size (__dest, 0);
  D.22473 = __builtin___memset_chk (__dest, __ch, __len, D.22474);
  return D.22473;
}


major_finish_nursery_collection ()
{
  int num_major_sections.127;
  int old_num_major_sections.128;
  int D.22478;

  num_major_sections.127 = num_major_sections;
  old_num_major_sections.128 = old_num_major_sections;
  D.22478 = num_major_sections.127 - old_num_major_sections.128;
  sgen_register_major_sections_alloced (D.22478);
}


major_start_nursery_collection ()
{
  int num_major_sections.129;

  num_major_sections.129 = num_major_sections;
  old_num_major_sections = num_major_sections.129;
}


major_get_used_size ()
{
  int D.22480;
  int D.22481;
  long int D.22482;
  long int D.22483;
  gint64 D.22484;
  gint64 size;
  struct MSBlockInfo * block;

  size = 0;
  block = all_blocks;
  goto <D.20494>;
  <D.20493>:
  {
    int count;
    void * * iter;

    D.22480 = block->obj_size;
    count = 16368 / D.22480;
    D.22480 = block->obj_size;
    D.22481 = D.22480 * count;
    D.22482 = (long int) D.22481;
    size = D.22482 + size;
    iter = block->free_list;
    goto <D.20491>;
    <D.20490>:
    D.22480 = block->obj_size;
    D.22483 = (long int) D.22480;
    size = size - D.22483;
    iter = *iter;
    <D.20491>:
    if (iter != 0B) goto <D.20490>; else goto <D.20492>;
    <D.20492>:
  }
  block = block->next;
  <D.20494>:
  if (block != 0B) goto <D.20493>; else goto <D.20495>;
  <D.20495>:
  D.22484 = size;
  return D.22484;
}


major_dump_heap (struct FILE * heap_dump_file)
{
  int num_block_obj_sizes.130;
  long unsigned int D.22487;
  long unsigned int D.22488;
  long unsigned int D.22489;
  long unsigned int D.22490;
  int * D.22491;
  int * D.22492;
  int D.22493;
  int D.22494;
  long unsigned int D.22495;
  long unsigned int D.22496;
  int * D.22497;
  int D.22498;
  int D.22499;
  char * D.22502;
  int D.22503;
  sizetype D.22504;
  sizetype D.22505;
  char * D.22506;
  void * D.22507;
  char * D.22510;
  char * D.22512;
  int * D.22513;
  int D.22514;
  int D.22515;
  int * block_obj_sizes.131;
  int * D.22517;
  int D.22518;
  int D.22519;
  int D.22524;
  sizetype D.22525;
  sizetype D.22526;
  char * D.22527;
  void * D.22528;
  char * D.22530;
  int D.22536;
  sizetype D.22537;
  sizetype D.22538;
  char * D.22539;
  struct MSBlockInfo * block;
  int * slots_available;
  int * slots_used;
  int i;

  num_block_obj_sizes.130 = num_block_obj_sizes;
  D.22487 = (long unsigned int) num_block_obj_sizes.130;
  D.22488 = D.22487 * 4;
  slots_available = __builtin_alloca (D.22488);
  num_block_obj_sizes.130 = num_block_obj_sizes;
  D.22487 = (long unsigned int) num_block_obj_sizes.130;
  D.22488 = D.22487 * 4;
  slots_used = __builtin_alloca (D.22488);
  i = 0;
  goto <D.19880>;
  <D.19879>:
  D.22489 = (long unsigned int) i;
  D.22490 = D.22489 * 4;
  D.22491 = slots_available + D.22490;
  D.22489 = (long unsigned int) i;
  D.22490 = D.22489 * 4;
  D.22492 = slots_used + D.22490;
  *D.22492 = 0;
  D.22493 = *D.22492;
  *D.22491 = D.22493;
  i = i + 1;
  <D.19880>:
  num_block_obj_sizes.130 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.130) goto <D.19879>; else goto <D.19881>;
  <D.19881>:
  block = all_blocks;
  goto <D.19888>;
  <D.19887>:
  {
    int index;
    int count;

    D.22494 = block->obj_size;
    index = ms_find_block_obj_size_index (D.22494);
    D.22494 = block->obj_size;
    count = 16368 / D.22494;
    D.22495 = (long unsigned int) index;
    D.22496 = D.22495 * 4;
    D.22497 = slots_available + D.22496;
    D.22495 = (long unsigned int) index;
    D.22496 = D.22495 * 4;
    D.22497 = slots_available + D.22496;
    D.22498 = *D.22497;
    D.22499 = D.22498 + count;
    *D.22497 = D.22499;
    i = 0;
    goto <D.19885>;
    <D.19884>:
    D.22502 = block->block;
    D.22494 = block->obj_size;
    D.22503 = D.22494 * i;
    D.22504 = (sizetype) D.22503;
    D.22505 = D.22504 + 16;
    D.22506 = D.22502 + D.22505;
    D.22507 = MEM[(void * *)D.22506];
    if (D.22507 != 0B) goto <D.22508>; else goto <D.22509>;
    <D.22508>:
    D.22502 = block->block;
    D.22494 = block->obj_size;
    D.22503 = D.22494 * i;
    D.22504 = (sizetype) D.22503;
    D.22505 = D.22504 + 16;
    D.22506 = D.22502 + D.22505;
    D.22510 = MEM[(char * *)D.22506];
    D.22502 = block->block;
    if (D.22510 < D.22502) goto <D.22500>; else goto <D.22511>;
    <D.22511>:
    D.22502 = block->block;
    D.22494 = block->obj_size;
    D.22503 = D.22494 * i;
    D.22504 = (sizetype) D.22503;
    D.22505 = D.22504 + 16;
    D.22506 = D.22502 + D.22505;
    D.22510 = MEM[(char * *)D.22506];
    D.22502 = block->block;
    D.22512 = D.22502 + 16384;
    if (D.22510 >= D.22512) goto <D.22500>; else goto <D.22501>;
    <D.22500>:
    D.22495 = (long unsigned int) index;
    D.22496 = D.22495 * 4;
    D.22513 = slots_used + D.22496;
    D.22514 = *D.22513;
    D.22515 = D.22514 + 1;
    *D.22513 = D.22515;
    <D.22501>:
    <D.22509>:
    i = i + 1;
    <D.19885>:
    if (i < count) goto <D.19884>; else goto <D.19886>;
    <D.19886>:
  }
  block = block->next;
  <D.19888>:
  if (block != 0B) goto <D.19887>; else goto <D.19889>;
  <D.19889>:
  fprintf (heap_dump_file, "<occupancies>\n");
  i = 0;
  goto <D.19891>;
  <D.19890>:
  block_obj_sizes.131 = block_obj_sizes;
  D.22489 = (long unsigned int) i;
  D.22490 = D.22489 * 4;
  D.22517 = block_obj_sizes.131 + D.22490;
  D.22518 = *D.22517;
  D.22489 = (long unsigned int) i;
  D.22490 = D.22489 * 4;
  D.22491 = slots_available + D.22490;
  D.22519 = *D.22491;
  D.22489 = (long unsigned int) i;
  D.22490 = D.22489 * 4;
  D.22492 = slots_used + D.22490;
  D.22493 = *D.22492;
  fprintf (heap_dump_file, "<occupancy size=\"%d\" available=\"%d\" used=\"%d\" />\n", D.22518, D.22519, D.22493);
  i = i + 1;
  <D.19891>:
  num_block_obj_sizes.130 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.130) goto <D.19890>; else goto <D.19892>;
  <D.19892>:
  fprintf (heap_dump_file, "</occupancies>\n");
  block = all_blocks;
  goto <D.19900>;
  <D.19899>:
  {
    int count;
    int i;
    int start;

    D.22494 = block->obj_size;
    count = 16368 / D.22494;
    start = -1;
    fprintf (heap_dump_file, "<section type=\"%s\" size=\"%zu\">\n", "old", 16368);
    i = 0;
    goto <D.19897>;
    <D.19896>:
    if (i < count) goto <D.22523>; else goto <D.22520>;
    <D.22523>:
    D.22502 = block->block;
    D.22494 = block->obj_size;
    D.22524 = D.22494 * i;
    D.22525 = (sizetype) D.22524;
    D.22526 = D.22525 + 16;
    D.22527 = D.22502 + D.22526;
    D.22528 = MEM[(void * *)D.22527];
    if (D.22528 != 0B) goto <D.22529>; else goto <D.22520>;
    <D.22529>:
    D.22502 = block->block;
    D.22494 = block->obj_size;
    D.22524 = D.22494 * i;
    D.22525 = (sizetype) D.22524;
    D.22526 = D.22525 + 16;
    D.22527 = D.22502 + D.22526;
    D.22530 = MEM[(char * *)D.22527];
    D.22502 = block->block;
    if (D.22530 < D.22502) goto <D.22521>; else goto <D.22531>;
    <D.22531>:
    D.22502 = block->block;
    D.22494 = block->obj_size;
    D.22524 = D.22494 * i;
    D.22525 = (sizetype) D.22524;
    D.22526 = D.22525 + 16;
    D.22527 = D.22502 + D.22526;
    D.22530 = MEM[(char * *)D.22527];
    D.22502 = block->block;
    D.22512 = D.22502 + 16384;
    if (D.22530 >= D.22512) goto <D.22521>; else goto <D.22520>;
    <D.22521>:
    if (start < 0) goto <D.22532>; else goto <D.22533>;
    <D.22532>:
    start = i;
    <D.22533>:
    goto <D.22522>;
    <D.22520>:
    if (start >= 0) goto <D.22534>; else goto <D.22535>;
    <D.22534>:
    D.22502 = block->block;
    D.22494 = block->obj_size;
    D.22536 = D.22494 * start;
    D.22537 = (sizetype) D.22536;
    D.22538 = D.22537 + 16;
    D.22539 = D.22502 + D.22538;
    D.22502 = block->block;
    D.22494 = block->obj_size;
    D.22524 = D.22494 * i;
    D.22525 = (sizetype) D.22524;
    D.22526 = D.22525 + 16;
    D.22527 = D.22502 + D.22526;
    D.22502 = block->block;
    sgen_dump_occupied (D.22539, D.22527, D.22502);
    start = -1;
    <D.22535>:
    <D.22522>:
    i = i + 1;
    <D.19897>:
    if (i <= count) goto <D.19896>; else goto <D.19898>;
    <D.19898>:
    fprintf (heap_dump_file, "</section>\n");
  }
  block = block->next;
  <D.19900>:
  if (block != 0B) goto <D.19899>; else goto <D.19901>;
  <D.19901>:
}


major_check_scan_starts ()
{

}


major_sweep ()
{
  ms_sweep ();
}


ms_sweep ()
{
  int num_block_obj_sizes.132;
  long unsigned int D.22541;
  long unsigned int D.22542;
  long unsigned int D.22543;
  long unsigned int D.22544;
  int * D.22545;
  int * D.22546;
  int * D.22547;
  int D.22548;
  int D.22549;
  long unsigned int D.22550;
  long unsigned int D.22551;
  struct MSBlockInfo * * D.22552;
  <unnamed-unsigned:1> D.22553;
  <unnamed-unsigned:1> D.22554;
  int D.22555;
  guint8 * D.22556;
  long unsigned int D.22559;
  int D.22560;
  unsigned int i.133;
  int lazy_sweep.134;
  long unsigned int D.22573;
  long unsigned int D.22574;
  int * D.22575;
  int D.22576;
  int D.22577;
  int * D.22578;
  int D.22579;
  int D.22580;
  int * D.22581;
  int D.22582;
  int D.22583;
  long unsigned int D.22586;
  long unsigned int D.22587;
  _Bool D.22588;
  int D.22589;
  int iftmp.135;
  long unsigned int D.22591;
  int D.22595;
  int iftmp.136;
  int D.22597;
  int D.22598;
  long unsigned int D.22602;
  long unsigned int D.22603;
  struct MSBlockInfo * * D.22604;
  struct MSBlockInfo * D.22605;
  struct MSBlockInfo * D.22607;
  char * D.22608;
  int num_major_sections.137;
  int D.22610;
  struct MSBlockInfo * D.22611;
  float D.22612;
  int D.22613;
  float D.22614;
  float evacuation_threshold.138;
  gboolean * evacuate_block_obj_sizes.139;
  gboolean * D.22621;
  int * block_obj_sizes.140;
  int * D.22623;
  int D.22624;
  int D.22625;
  int D.22626;
  int D.22629;
  long unsigned int D.22630;
  long unsigned int D.22631;
  float D.22632;
  float D.22633;
  float D.22634;
  float concurrent_evacuation_threshold.141;
  float D.22636;
  _Bool D.22637;
  int D.22638;
  int i;
  struct MSBlockInfo * * iter;
  int * slots_available;
  int * slots_used;
  int * num_blocks;
  mword total_evacuate_heap;
  mword total_evacuate_saved;

  num_block_obj_sizes.132 = num_block_obj_sizes;
  D.22541 = (long unsigned int) num_block_obj_sizes.132;
  D.22542 = D.22541 * 4;
  slots_available = __builtin_alloca (D.22542);
  num_block_obj_sizes.132 = num_block_obj_sizes;
  D.22541 = (long unsigned int) num_block_obj_sizes.132;
  D.22542 = D.22541 * 4;
  slots_used = __builtin_alloca (D.22542);
  num_block_obj_sizes.132 = num_block_obj_sizes;
  D.22541 = (long unsigned int) num_block_obj_sizes.132;
  D.22542 = D.22541 * 4;
  num_blocks = __builtin_alloca (D.22542);
  total_evacuate_heap = 0;
  total_evacuate_saved = 0;
  i = 0;
  goto <D.20368>;
  <D.20367>:
  D.22543 = (long unsigned int) i;
  D.22544 = D.22543 * 4;
  D.22545 = slots_available + D.22544;
  D.22543 = (long unsigned int) i;
  D.22544 = D.22543 * 4;
  D.22546 = slots_used + D.22544;
  D.22543 = (long unsigned int) i;
  D.22544 = D.22543 * 4;
  D.22547 = num_blocks + D.22544;
  *D.22547 = 0;
  D.22548 = *D.22547;
  *D.22546 = D.22548;
  D.22549 = *D.22546;
  *D.22545 = D.22549;
  i = i + 1;
  <D.20368>:
  num_block_obj_sizes.132 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.132) goto <D.20367>; else goto <D.20369>;
  <D.20369>:
  i = 0;
  goto <D.20376>;
  <D.20375>:
  {
    struct MSBlockInfo * * free_blocks;
    int j;

    free_blocks = free_block_lists[i];
    j = 0;
    goto <D.20373>;
    <D.20372>:
    D.22550 = (long unsigned int) j;
    D.22551 = D.22550 * 8;
    D.22552 = free_blocks + D.22551;
    *D.22552 = 0B;
    j = j + 1;
    <D.20373>:
    num_block_obj_sizes.132 = num_block_obj_sizes;
    if (j < num_block_obj_sizes.132) goto <D.20372>; else goto <D.20374>;
    <D.20374>:
  }
  i = i + 1;
  <D.20376>:
  if (i <= 3) goto <D.20375>; else goto <D.20377>;
  <D.20377>:
  iter = &all_blocks;
  goto <D.20391>;
  <D.20390>:
  {
    struct MSBlockInfo * block;
    int count;
    gboolean have_live;
    gboolean has_pinned;
    gboolean have_free;
    int obj_size_index;
    int nused;

    block = *iter;
    have_live = 0;
    have_free = 0;
    nused = 0;
    obj_size_index = block->obj_size_index;
    D.22553 = block->has_pinned;
    has_pinned = (gboolean) D.22553;
    D.22554 = block->pinned;
    block->has_pinned = D.22554;
    block->is_to_space = 0;
    block->swept = 0;
    D.22555 = block->obj_size;
    count = 16368 / D.22555;
    D.22556 = block->cardtable_mod_union;
    if (D.22556 != 0B) goto <D.22557>; else goto <D.22558>;
    <D.22557>:
    D.22556 = block->cardtable_mod_union;
    sgen_free_internal_dynamic (D.22556, 32, 28);
    block->cardtable_mod_union = 0B;
    <D.22558>:
    i = 0;
    goto <D.20386>;
    <D.20385>:
    D.22559 = block->mark_words[i];
    D.22560 = bitcount (D.22559);
    nused = D.22560 + nused;
    i = i + 1;
    <D.20386>:
    i.133 = (unsigned int) i;
    if (i.133 <= 31) goto <D.20385>; else goto <D.20387>;
    <D.20387>:
    if (nused != 0) goto <D.22562>; else goto <D.22563>;
    <D.22562>:
    have_live = 1;
    <D.22563>:
    if (nused < count) goto <D.22564>; else goto <D.22565>;
    <D.22564>:
    have_free = 1;
    <D.22565>:
    lazy_sweep.134 = lazy_sweep;
    if (lazy_sweep.134 == 0) goto <D.22567>; else goto <D.22568>;
    <D.22567>:
    sweep_block (block, 1);
    <D.22568>:
    if (have_live != 0) goto <D.22569>; else goto <D.22570>;
    <D.22569>:
    if (has_pinned == 0) goto <D.22571>; else goto <D.22572>;
    <D.22571>:
    D.22573 = (long unsigned int) obj_size_index;
    D.22574 = D.22573 * 4;
    D.22575 = num_blocks + D.22574;
    D.22576 = *D.22575;
    D.22577 = D.22576 + 1;
    *D.22575 = D.22577;
    D.22573 = (long unsigned int) obj_size_index;
    D.22574 = D.22573 * 4;
    D.22578 = slots_used + D.22574;
    D.22573 = (long unsigned int) obj_size_index;
    D.22574 = D.22573 * 4;
    D.22578 = slots_used + D.22574;
    D.22579 = *D.22578;
    D.22580 = D.22579 + nused;
    *D.22578 = D.22580;
    D.22573 = (long unsigned int) obj_size_index;
    D.22574 = D.22573 * 4;
    D.22581 = slots_available + D.22574;
    D.22573 = (long unsigned int) obj_size_index;
    D.22574 = D.22573 * 4;
    D.22581 = slots_available + D.22574;
    D.22582 = *D.22581;
    D.22583 = D.22582 + count;
    *D.22581 = D.22583;
    <D.22572>:
    iter = &block->next;
    if (have_free != 0) goto <D.22584>; else goto <D.22585>;
    <D.22584>:
    {
      struct MSBlockInfo * * free_blocks;
      int index;

      D.22586 = BIT_FIELD_REF <*block, 64, 64>;
      D.22587 = D.22586 & 2147483648;
      D.22588 = D.22587 != 0;
      D.22589 = (int) D.22588;
      D.22586 = BIT_FIELD_REF <*block, 64, 64>;
      D.22591 = D.22586 & 1073741824;
      if (D.22591 != 0) goto <D.22592>; else goto <D.22593>;
      <D.22592>:
      iftmp.135 = 2;
      goto <D.22594>;
      <D.22593>:
      iftmp.135 = 0;
      <D.22594>:
      D.22595 = D.22589 | iftmp.135;
      free_blocks = free_block_lists[D.22595];
      D.22555 = block->obj_size;
      D.22597 = D.22555 + 7;
      D.22598 = D.22597 >> 3;
      if (D.22598 <= 31) goto <D.22599>; else goto <D.22600>;
      <D.22599>:
      D.22555 = block->obj_size;
      D.22597 = D.22555 + 7;
      D.22598 = D.22597 >> 3;
      iftmp.136 = fast_block_obj_size_indexes[D.22598];
      goto <D.22601>;
      <D.22600>:
      D.22555 = block->obj_size;
      iftmp.136 = ms_find_block_obj_size_index (D.22555);
      <D.22601>:
      index = iftmp.136;
      D.22602 = (long unsigned int) index;
      D.22603 = D.22602 * 8;
      D.22604 = free_blocks + D.22603;
      D.22605 = *D.22604;
      block->next_free = D.22605;
      D.22602 = (long unsigned int) index;
      D.22603 = D.22602 * 8;
      D.22604 = free_blocks + D.22603;
      *D.22604 = block;
    }
    <D.22585>:
    update_heap_boundaries_for_block (block);
    goto <D.22606>;
    <D.22570>:
    D.22607 = block->next;
    *iter = D.22607;
    D.22608 = block->block;
    ms_free_block (D.22608);
    sgen_free_internal (block, 16);
    num_major_sections.137 = num_major_sections;
    D.22610 = num_major_sections.137 + -1;
    num_major_sections = D.22610;
    <D.22606>:
  }
  <D.20391>:
  D.22611 = *iter;
  if (D.22611 != 0B) goto <D.20390>; else goto <D.20392>;
  <D.20392>:
  i = 0;
  goto <D.20396>;
  <D.20395>:
  {
    float usage;

    D.22543 = (long unsigned int) i;
    D.22544 = D.22543 * 4;
    D.22546 = slots_used + D.22544;
    D.22549 = *D.22546;
    D.22612 = (float) D.22549;
    D.22543 = (long unsigned int) i;
    D.22544 = D.22543 * 4;
    D.22545 = slots_available + D.22544;
    D.22613 = *D.22545;
    D.22614 = (float) D.22613;
    usage = D.22612 / D.22614;
    D.22543 = (long unsigned int) i;
    D.22544 = D.22543 * 4;
    D.22547 = num_blocks + D.22544;
    D.22548 = *D.22547;
    if (D.22548 > 5) goto <D.22617>; else goto <D.22615>;
    <D.22617>:
    evacuation_threshold.138 = evacuation_threshold;
    if (usage < evacuation_threshold.138) goto <D.22619>; else goto <D.22615>;
    <D.22619>:
    evacuate_block_obj_sizes.139 = evacuate_block_obj_sizes;
    D.22543 = (long unsigned int) i;
    D.22544 = D.22543 * 4;
    D.22621 = evacuate_block_obj_sizes.139 + D.22544;
    *D.22621 = 1;
    goto <D.22616>;
    <D.22615>:
    evacuate_block_obj_sizes.139 = evacuate_block_obj_sizes;
    D.22543 = (long unsigned int) i;
    D.22544 = D.22543 * 4;
    D.22621 = evacuate_block_obj_sizes.139 + D.22544;
    *D.22621 = 0;
    <D.22616>:
    {
      mword total_bytes;

      block_obj_sizes.140 = block_obj_sizes;
      D.22543 = (long unsigned int) i;
      D.22544 = D.22543 * 4;
      D.22623 = block_obj_sizes.140 + D.22544;
      D.22624 = *D.22623;
      D.22543 = (long unsigned int) i;
      D.22544 = D.22543 * 4;
      D.22545 = slots_available + D.22544;
      D.22613 = *D.22545;
      D.22625 = D.22624 * D.22613;
      total_bytes = (mword) D.22625;
      total_evacuate_heap = total_evacuate_heap + total_bytes;
      evacuate_block_obj_sizes.139 = evacuate_block_obj_sizes;
      D.22543 = (long unsigned int) i;
      D.22544 = D.22543 * 4;
      D.22621 = evacuate_block_obj_sizes.139 + D.22544;
      D.22626 = *D.22621;
      if (D.22626 != 0) goto <D.22627>; else goto <D.22628>;
      <D.22627>:
      block_obj_sizes.140 = block_obj_sizes;
      D.22543 = (long unsigned int) i;
      D.22544 = D.22543 * 4;
      D.22623 = block_obj_sizes.140 + D.22544;
      D.22624 = *D.22623;
      D.22543 = (long unsigned int) i;
      D.22544 = D.22543 * 4;
      D.22546 = slots_used + D.22544;
      D.22549 = *D.22546;
      D.22629 = D.22624 * D.22549;
      D.22630 = (long unsigned int) D.22629;
      D.22631 = total_bytes - D.22630;
      total_evacuate_saved = D.22631 + total_evacuate_saved;
      <D.22628>:
    }
  }
  i = i + 1;
  <D.20396>:
  num_block_obj_sizes.132 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.132) goto <D.20395>; else goto <D.20397>;
  <D.20397>:
  D.22632 = (float) total_evacuate_saved;
  D.22633 = (float) total_evacuate_heap;
  D.22634 = D.22632 / D.22633;
  concurrent_evacuation_threshold.141 = concurrent_evacuation_threshold;
  D.22636 = 1.0e+0 - concurrent_evacuation_threshold.141;
  D.22637 = D.22634 > D.22636;
  D.22638 = (int) D.22637;
  want_evacuation = D.22638;
  have_swept = 1;
}


bitcount (mword d)
{
  int D.22641;
  unsigned int D.22643;
  int D.22644;
  int D.22645;
  int count;

  count = 0;
  if (1 != 0) goto <D.22639>; else goto <D.22640>;
  <D.22639>:
  D.22641 = __builtin_popcountl (d);
  count = D.22641 + count;
  goto <D.22642>;
  <D.22640>:
  D.22643 = (unsigned int) d;
  D.22644 = __builtin_popcount (D.22643);
  count = D.22644 + count;
  <D.22642>:
  D.22645 = count;
  return D.22645;
}


update_heap_boundaries_for_block (struct MSBlockInfo * block)
{
  char * D.22647;
  long unsigned int D.22648;
  long unsigned int D.22649;

  D.22647 = block->block;
  D.22648 = (long unsigned int) D.22647;
  D.22647 = block->block;
  D.22648 = (long unsigned int) D.22647;
  D.22649 = D.22648 + 16384;
  sgen_update_heap_boundaries (D.22648, D.22649);
}


ms_free_block (void * block)
{
  void * D.22650;
  int D.22651;
  int D.22652;
  void * empty;

  sgen_memgov_release_space (16384, 1);
  memset (block, 0, 16384);
  <D.19718>:
  empty = empty_blocks;
  MEM[(void * *)block] = empty;
  D.22650 = InterlockedCompareExchangePointer (&empty_blocks, block, empty);
  if (D.22650 != empty) goto <D.19718>; else goto <D.19719>;
  <D.19719>:
  {
    int __old_x;

    <D.19721>:
    __old_x = num_empty_blocks;
    D.22651 = __old_x + 1;
    D.22652 = InterlockedCompareExchange (&num_empty_blocks, D.22651, __old_x);
    if (D.22652 != __old_x) goto <D.19721>; else goto <D.19722>;
    <D.19722>:
  }
}


InterlockedCompareExchangePointer (void * volatile * dest, void * exch, void * comp)
{
  void * D.22653;
  long unsigned int comp.142;
  long unsigned int exch.143;
  long unsigned int D.22656;

  comp.142 = (long unsigned int) comp;
  exch.143 = (long unsigned int) exch;
  D.22656 = __sync_val_compare_and_swap_8 (dest, comp.142, exch.143);
  D.22653 = (void *) D.22656;
  return D.22653;
}


InterlockedCompareExchange (volatile gint32 * dest, gint32 exch, gint32 comp)
{
  gint32 D.22658;
  unsigned int comp.144;
  unsigned int exch.145;
  unsigned int D.22661;

  comp.144 = (unsigned int) comp;
  exch.145 = (unsigned int) exch;
  D.22661 = __sync_val_compare_and_swap_4 (dest, comp.144, exch.145);
  D.22658 = (gint32) D.22661;
  return D.22658;
}


major_init_to_space ()
{

}


major_get_cardtable_mod_union_for_object (char * obj)
{
  long unsigned int obj.146;
  long unsigned int D.22664;
  struct MSBlockHeader * D.22665;
  guint8 * D.22666;
  guint8 * D.22667;
  long int obj.147;
  char * D.22669;
  void * D.22670;
  long int D.22671;
  long int D.22672;
  long int D.22673;
  sizetype D.22674;
  struct MSBlockInfo * block;

  obj.146 = (long unsigned int) obj;
  D.22664 = obj.146 & 18446744073709535232;
  D.22665 = (struct MSBlockHeader *) D.22664;
  block = D.22665->info;
  D.22667 = block->cardtable_mod_union;
  obj.147 = (long int) obj;
  D.22669 = block->block;
  D.22670 = sgen_card_table_align_pointer (D.22669);
  D.22671 = (long int) D.22670;
  D.22672 = obj.147 - D.22671;
  D.22673 = D.22672 >> 9;
  D.22674 = (sizetype) D.22673;
  D.22666 = D.22667 + D.22674;
  return D.22666;
}


update_cardtable_mod_union ()
{
  guint8 * D.22676;
  char * D.22677;
  guint8 * D.22678;
  long unsigned int num_cards.148;
  _Bool D.22680;
  long int D.22681;
  long int D.22682;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.20581>;
  <D.20580>:
  {
    size_t num_cards;

    try
      {
        D.22676 = block->cardtable_mod_union;
        D.22677 = block->block;
        D.22678 = sgen_card_table_update_mod_union (D.22676, D.22677, 16384, &num_cards);
        block->cardtable_mod_union = D.22678;
        num_cards.148 = num_cards;
        D.22680 = num_cards.148 != 32;
        D.22681 = (long int) D.22680;
        D.22682 = __builtin_expect (D.22681, 0);
        if (D.22682 != 0) goto <D.22683>; else goto <D.22684>;
        <D.22683>:
        monoeg_g_log (0B, 4, "Number of cards calculation is wrong");
        <D.20579>:
        goto <D.20579>;
        <D.22684>:
      }
    finally
      {
        num_cards = {CLOBBER};
      }
  }
  block = block->next;
  <D.20581>:
  if (block != 0B) goto <D.20580>; else goto <D.20582>;
  <D.20582>:
}


major_iterate_live_block_ranges (void (*sgen_cardtable_block_callback) (mword, mword) callback)
{
  long unsigned int D.22685;
  long unsigned int D.22686;
  char * D.22689;
  long unsigned int D.22690;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.20512>;
  <D.20511>:
  D.22685 = BIT_FIELD_REF <*block, 64, 64>;
  D.22686 = D.22685 & 1073741824;
  if (D.22686 != 0) goto <D.22687>; else goto <D.22688>;
  <D.22687>:
  D.22689 = block->block;
  D.22690 = (long unsigned int) D.22689;
  callback (D.22690, 16384);
  <D.22688>:
  block = block->next;
  <D.20512>:
  if (block != 0B) goto <D.20511>; else goto <D.20513>;
  <D.20513>:
}


major_scan_card_table (gboolean mod_union, struct SgenGrayQueue * queue)
{
  struct SgenObjectOperations * D.22691;
  int concurrent_mark.149;
  _Bool D.22695;
  long int D.22696;
  long int D.22697;
  long unsigned int D.22700;
  long unsigned int D.22701;
  long unsigned int block_start.150;
  long unsigned int D.22712;
  void * D.22716;
  char * D.22718;
  char * D.22720;
  long int obj.151;
  long int D.22724;
  int D.22725;
  long unsigned int D.22729;
  long int D.22730;
  long unsigned int D.22731;
  long unsigned int D.22732;
  long int base.152;
  long int D.22735;
  long int D.22736;
  long unsigned int D.22737;
  sizetype D.22738;
  guint8 * D.22739;
  sizetype D.22740;
  long int card_data.153;
  long int card_base.154;
  long int D.22749;
  int D.22750;
  sizetype D.22751;
  unsigned char D.22752;
  long int start.155;
  char * D.22761;
  long int D.22762;
  long int D.22763;
  long int D.22764;
  long int D.22765;
  int D.22766;
  sizetype D.22767;
  sizetype D.22768;
  void * D.22770;
  char * D.22772;
  long int obj.156;
  long int D.22777;
  int D.22778;
  long unsigned int D.22782;
  long int D.22783;
  long unsigned int D.22784;
  long unsigned int D.22785;
  struct MSBlockInfo * block;
  void (*ScanObjectFunc) (char *, struct SgenGrayQueue *) scan_func;
  void next_large = <<< error >>>;
  void next_small = <<< error >>>;

  D.22691 = sgen_get_current_object_ops ();
  scan_func = D.22691->scan_object;
  concurrent_mark.149 = concurrent_mark;
  if (concurrent_mark.149 == 0) goto <D.22693>; else goto <D.22694>;
  <D.22693>:
  D.22695 = mod_union != 0;
  D.22696 = (long int) D.22695;
  D.22697 = __builtin_expect (D.22696, 0);
  if (D.22697 != 0) goto <D.22698>; else goto <D.22699>;
  <D.22698>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 2225, "!mod_union");
  <D.22699>:
  <D.22694>:
  block = all_blocks;
  goto <D.20572>;
  <D.20571>:
  {
    int block_obj_size;
    char * block_start;

    D.22700 = BIT_FIELD_REF <*block, 64, 64>;
    D.22701 = D.22700 & 1073741824;
    if (D.22701 == 0) goto <D.22702>; else goto <D.22703>;
    <D.22702>:
    // predicted unlikely by continue predictor.
    goto <D.20538>;
    <D.22703>:
    block_obj_size = block->obj_size;
    block_start = block->block;
    if (block_obj_size > 511) goto <D.22704>; else goto <D.22705>;
    <D.22704>:
    {
      guint8 * cards;
      char * obj;
      char * end;
      char * base;

      if (mod_union != 0) goto <D.22706>; else goto <D.22707>;
      <D.22706>:
      cards = block->cardtable_mod_union;
      if (cards == 0B) goto <D.22708>; else goto <D.22709>;
      <D.22708>:
      // predicted unlikely by continue predictor.
      goto <D.20538>;
      <D.22709>:
      goto <D.22710>;
      <D.22707>:
      block_start.150 = (long unsigned int) block_start;
      cards = sgen_card_table_get_shadow_card_address (block_start.150);
      <D.22710>:
      obj = block_start + 16;
      end = block_start + 16384;
      base = sgen_card_table_align_pointer (obj);
      goto <D.20549>;
      <D.20548>:
      {
        int card_offset;

        D.22700 = BIT_FIELD_REF <*block, 64, 64>;
        D.22712 = D.22700 & 134217728;
        if (D.22712 == 0) goto <D.22713>; else goto <D.22714>;
        <D.22713>:
        sweep_block (block, 0);
        <D.22714>:
        D.22716 = MEM[(void * *)obj];
        if (D.22716 == 0B) goto next_large; else goto <D.22717>;
        <D.22717>:
        D.22718 = MEM[(char * *)obj];
        if (D.22718 >= block_start) goto <D.22719>; else goto <D.22715>;
        <D.22719>:
        D.22718 = MEM[(char * *)obj];
        D.22720 = block_start + 16384;
        if (D.22718 < D.22720) goto next_large; else goto <D.22715>;
        <D.22715>:
        if (mod_union != 0) goto <D.22721>; else goto <D.22722>;
        <D.22721>:
        {
          int w;
          int b;

          {
            int i;

            obj.151 = (long int) obj;
            D.22724 = obj.151 >> 3;
            D.22725 = (int) D.22724;
            i = D.22725 & 2047;
            if (0 != 0) goto <D.22726>; else goto <D.22727>;
            <D.22726>:
            w = i >> 5;
            b = i & 31;
            goto <D.22728>;
            <D.22727>:
            w = i >> 6;
            b = i & 63;
            <D.22728>:
          }
          D.22729 = block->mark_words[w];
          D.22730 = 1 << b;
          D.22731 = (long unsigned int) D.22730;
          D.22732 = D.22729 & D.22731;
          if (D.22732 == 0) goto next_large; else goto <D.22733>;
          <D.22733>:
        }
        <D.22722>:
        obj.151 = (long int) obj;
        base.152 = (long int) base;
        D.22735 = obj.151 - base.152;
        D.22736 = D.22735 >> 9;
        card_offset = (int) D.22736;
        D.22737 = (long unsigned int) block_obj_size;
        D.22738 = (sizetype) card_offset;
        D.22739 = cards + D.22738;
        sgen_cardtable_scan_object (obj, D.22737, D.22739, mod_union, queue);
        next_large:
        D.22740 = (sizetype) block_obj_size;
        obj = obj + D.22740;
      }
      <D.20549>:
      if (obj < end) goto <D.20548>; else goto <D.20550>;
      <D.20550>:
    }
    goto <D.22741>;
    <D.22705>:
    {
      guint8 * card_data;
      guint8 * card_base;
      guint8 * card_data_end;

      if (mod_union != 0) goto <D.22742>; else goto <D.22743>;
      <D.22742>:
      card_base = block->cardtable_mod_union;
      card_data = card_base;
      if (card_data == 0B) goto <D.22744>; else goto <D.22745>;
      <D.22744>:
      // predicted unlikely by continue predictor.
      goto <D.20538>;
      <D.22745>:
      goto <D.22746>;
      <D.22743>:
      block_start.150 = (long unsigned int) block_start;
      card_base = sgen_card_table_get_shadow_card_address (block_start.150);
      card_data = card_base;
      <D.22746>:
      card_data_end = card_data + 32;
      card_data = initial_skip_card (card_data);
      goto <D.20569>;
      <D.20568>:
      {
        int index;
        int idx;
        char * start;
        char * end;
        char * first_obj;
        char * obj;

        card_data.153 = (long int) card_data;
        card_base.154 = (long int) card_base;
        D.22749 = card_data.153 - card_base.154;
        idx = (int) D.22749;
        D.22750 = idx * 512;
        D.22751 = (sizetype) D.22750;
        start = block_start + D.22751;
        end = start + 512;
        D.22752 = *card_data;
        if (D.22752 == 0) goto <D.22753>; else goto <D.22754>;
        <D.22753>:
        // predicted unlikely by continue predictor.
        goto <D.20560>;
        <D.22754>:
        D.22700 = BIT_FIELD_REF <*block, 64, 64>;
        D.22712 = D.22700 & 134217728;
        if (D.22712 == 0) goto <D.22755>; else goto <D.22756>;
        <D.22755>:
        sweep_block (block, 0);
        <D.22756>:
        sgen_card_table_prepare_card_for_scanning (card_data);
        if (idx == 0) goto <D.22757>; else goto <D.22758>;
        <D.22757>:
        index = 0;
        goto <D.22759>;
        <D.22758>:
        start.155 = (long int) start;
        D.22761 = block_start + 16;
        D.22762 = (long int) D.22761;
        D.22763 = start.155 - D.22762;
        D.22764 = (long int) block_obj_size;
        D.22765 = D.22763 / D.22764;
        index = (int) D.22765;
        <D.22759>:
        D.22766 = block_obj_size * index;
        D.22767 = (sizetype) D.22766;
        D.22768 = D.22767 + 16;
        first_obj = block_start + D.22768;
        obj = first_obj;
        goto <D.20566>;
        <D.20565>:
        D.22770 = MEM[(void * *)obj];
        if (D.22770 == 0B) goto next_small; else goto <D.22771>;
        <D.22771>:
        D.22772 = MEM[(char * *)obj];
        if (D.22772 >= block_start) goto <D.22773>; else goto <D.22769>;
        <D.22773>:
        D.22772 = MEM[(char * *)obj];
        D.22720 = block_start + 16384;
        if (D.22772 < D.22720) goto next_small; else goto <D.22769>;
        <D.22769>:
        if (mod_union != 0) goto <D.22774>; else goto <D.22775>;
        <D.22774>:
        {
          int w;
          int b;

          {
            int i;

            obj.156 = (long int) obj;
            D.22777 = obj.156 >> 3;
            D.22778 = (int) D.22777;
            i = D.22778 & 2047;
            if (0 != 0) goto <D.22779>; else goto <D.22780>;
            <D.22779>:
            w = i >> 5;
            b = i & 31;
            goto <D.22781>;
            <D.22780>:
            w = i >> 6;
            b = i & 63;
            <D.22781>:
          }
          D.22782 = block->mark_words[w];
          D.22783 = 1 << b;
          D.22784 = (long unsigned int) D.22783;
          D.22785 = D.22782 & D.22784;
          if (D.22785 == 0) goto next_small; else goto <D.22786>;
          <D.22786>:
        }
        <D.22775>:
        scan_func (obj, queue);
        next_small:
        D.22740 = (sizetype) block_obj_size;
        obj = obj + D.22740;
        <D.20566>:
        if (obj < end) goto <D.20565>; else goto <D.20567>;
        <D.20567>:
      }
      <D.20560>:
      card_data = card_data + 1;
      <D.20569>:
      if (card_data < card_data_end) goto <D.20568>; else goto <D.20570>;
      <D.20570>:
    }
    <D.22741>:
  }
  <D.20538>:
  block = block->next;
  <D.20572>:
  if (block != 0B) goto <D.20571>; else goto <D.20573>;
  <D.20573>:
}


sgen_card_table_get_shadow_card_address (mword address)
{
  guint8 * D.22787;
  guint8 * sgen_shadow_cardtable.157;
  long unsigned int D.22789;
  sizetype D.22790;

  sgen_shadow_cardtable.157 = sgen_shadow_cardtable;
  D.22789 = address >> 9;
  D.22790 = D.22789 & 8388607;
  D.22787 = sgen_shadow_cardtable.157 + D.22790;
  return D.22787;
}


initial_skip_card (guint8 * card_data)
{
  long unsigned int D.22792;
  long unsigned int D.22793;
  mword * D.22794;
  guint8 * D.22798;
  int D.22799;
  sizetype D.22800;
  unsigned int D.22801;
  unsigned int D.22802;
  unsigned int D.22803;
  unsigned int D.22804;
  unsigned int D.22805;
  unsigned int D.22806;
  unsigned int D.22807;
  unsigned int D.22808;
  unsigned int D.22809;
  unsigned int D.22810;
  long unsigned int D.22811;
  long unsigned int D.22812;
  long unsigned int D.22813;
  unsigned int D.22814;
  unsigned int D.22815;
  unsigned int D.22816;
  unsigned int D.22817;
  unsigned int D.22818;
  unsigned int D.22819;
  unsigned int D.22820;
  unsigned int D.22821;
  unsigned int D.22822;
  unsigned int D.22823;
  long unsigned int D.22824;
  long unsigned int D.22825;
  long long int D.22826;
  int D.22827;
  int D.22828;
  int D.22829;
  sizetype D.22830;
  sizetype D.22831;
  mword * cards;
  mword card;
  int i;

  cards = card_data;
  i = 0;
  goto <D.20522>;
  <D.20521>:
  D.22792 = (long unsigned int) i;
  D.22793 = D.22792 * 8;
  D.22794 = cards + D.22793;
  card = *D.22794;
  if (card != 0) goto <D.20520>; else goto <D.22795>;
  <D.22795>:
  i = i + 1;
  <D.20522>:
  if (i <= 3) goto <D.20521>; else goto <D.20520>;
  <D.20520>:
  if (i == 4) goto <D.22796>; else goto <D.22797>;
  <D.22796>:
  D.22798 = card_data + 32;
  return D.22798;
  <D.22797>:
  D.22799 = i * 8;
  D.22800 = (sizetype) D.22799;
  D.22801 = (unsigned int) card;
  D.22802 = D.22801 << 24;
  D.22801 = (unsigned int) card;
  D.22803 = D.22801 >> 8;
  D.22804 = D.22803 & 65280;
  D.22805 = D.22802 | D.22804;
  D.22801 = (unsigned int) card;
  D.22806 = D.22801 << 8;
  D.22807 = D.22806 & 16711680;
  D.22808 = D.22805 | D.22807;
  D.22801 = (unsigned int) card;
  D.22809 = D.22801 >> 24;
  D.22810 = D.22808 | D.22809;
  D.22811 = (long unsigned int) D.22810;
  D.22812 = D.22811 << 32;
  D.22813 = card >> 32;
  D.22814 = (unsigned int) D.22813;
  D.22815 = D.22814 << 24;
  D.22813 = card >> 32;
  D.22814 = (unsigned int) D.22813;
  D.22816 = D.22814 >> 8;
  D.22817 = D.22816 & 65280;
  D.22818 = D.22815 | D.22817;
  D.22813 = card >> 32;
  D.22814 = (unsigned int) D.22813;
  D.22819 = D.22814 << 8;
  D.22820 = D.22819 & 16711680;
  D.22821 = D.22818 | D.22820;
  D.22813 = card >> 32;
  D.22814 = (unsigned int) D.22813;
  D.22822 = D.22814 >> 24;
  D.22823 = D.22821 | D.22822;
  D.22824 = (long unsigned int) D.22823;
  D.22825 = D.22812 | D.22824;
  D.22826 = (long long int) D.22825;
  D.22827 = __builtin_ffsll (D.22826);
  D.22828 = D.22827 + -1;
  D.22829 = D.22828 / 8;
  D.22830 = (sizetype) D.22829;
  D.22831 = D.22800 + D.22830;
  D.22798 = card_data + D.22831;
  return D.22798;
}


sgen_card_table_prepare_card_for_scanning (guint8 * card)
{

}


pin_major_object (char * obj, struct SgenGrayQueue * queue)
{
  int concurrent_mark.158;
  long unsigned int obj.159;
  long unsigned int D.22837;
  struct MSBlockHeader * D.22838;
  long int obj.160;
  long int D.22840;
  int D.22841;
  long unsigned int D.22847;
  long int D.22848;
  long unsigned int D.22849;
  long unsigned int D.22850;
  long unsigned int D.22853;
  long unsigned int D.22854;
  long unsigned int D.22855;
  int iftmp.161;
  struct GrayQueueSection * D.22862;
  int D.22864;
  _Bool D.22865;
  long int D.22866;
  long int D.22867;
  int D.22871;
  int D.22872;
  struct MSBlockInfo * block;

  concurrent_mark.158 = concurrent_mark;
  if (concurrent_mark.158 != 0) goto <D.22834>; else goto <D.22835>;
  <D.22834>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-marksweep.c", 1107);
  <D.22835>:
  obj.159 = (long unsigned int) obj;
  D.22837 = obj.159 & 18446744073709535232;
  D.22838 = (struct MSBlockHeader *) D.22837;
  block = D.22838->info;
  block->has_pinned = 1;
  {
    int __word;
    int __bit;

    {
      int i;

      obj.160 = (long int) obj;
      D.22840 = obj.160 >> 3;
      D.22841 = (int) D.22840;
      i = D.22841 & 2047;
      if (0 != 0) goto <D.22842>; else goto <D.22843>;
      <D.22842>:
      __word = i >> 5;
      __bit = i & 31;
      goto <D.22844>;
      <D.22843>:
      __word = i >> 6;
      __bit = i & 63;
      <D.22844>:
    }
    if (0 != 0) goto <D.22845>; else goto <D.22846>;
    <D.22845>:
    monoeg_g_log (0B, 4, "object %p not allocated", obj);
    <D.19910>:
    goto <D.19910>;
    <D.22846>:
    D.22847 = block->mark_words[__word];
    D.22848 = 1 << __bit;
    D.22849 = (long unsigned int) D.22848;
    D.22850 = D.22847 & D.22849;
    if (D.22850 == 0) goto <D.22851>; else goto <D.22852>;
    <D.22851>:
    D.22847 = block->mark_words[__word];
    D.22848 = 1 << __bit;
    D.22849 = (long unsigned int) D.22848;
    D.22853 = D.22847 | D.22849;
    block->mark_words[__word] = D.22853;
    D.22854 = BIT_FIELD_REF <*block, 64, 64>;
    D.22855 = D.22854 & 1073741824;
    if (D.22855 != 0) goto <D.22856>; else goto <D.22857>;
    <D.22856>:
    D.22862 = queue->first;
    if (D.22862 == 0B) goto <D.22859>; else goto <D.22863>;
    <D.22863>:
    D.22862 = queue->first;
    D.22864 = D.22862->end;
    if (D.22864 == 125) goto <D.22859>; else goto <D.22860>;
    <D.22859>:
    iftmp.161 = 1;
    goto <D.22861>;
    <D.22860>:
    iftmp.161 = 0;
    <D.22861>:
    D.22865 = iftmp.161 != 0;
    D.22866 = (long int) D.22865;
    D.22867 = __builtin_expect (D.22866, 0);
    if (D.22867 != 0) goto <D.22868>; else goto <D.22869>;
    <D.22868>:
    sgen_gray_object_enqueue (queue, obj);
    goto <D.22870>;
    <D.22869>:
    D.22862 = queue->first;
    D.22862 = queue->first;
    D.22864 = D.22862->end;
    D.22871 = D.22864;
    D.22872 = D.22871 + 1;
    D.22862->end = D.22872;
    D.22862->objects[D.22871] = obj;
    <D.22870>:
    __builtin_prefetch (obj);
    <D.22857>:
    <D.22852>:
  }
}


major_pin_objects (struct SgenGrayQueue * queue)
{
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.20475>;
  <D.20474>:
  mark_pinned_objects_in_block (block, queue);
  block = block->next;
  <D.20475>:
  if (block != 0B) goto <D.20474>; else goto <D.20476>;
  <D.20476>:
}


mark_pinned_objects_in_block (struct MSBlockInfo * block, struct SgenGrayQueue * queue)
{
  int D.22873;
  void * * D.22876;
  long unsigned int D.22877;
  long unsigned int D.22878;
  void * * D.22879;
  void * D.22880;
  long int D.22881;
  char * D.22882;
  char * D.22883;
  long int D.22884;
  long int D.22885;
  int D.22886;
  long int D.22887;
  long int D.22888;
  int D.22891;
  int D.22894;
  sizetype D.22895;
  sizetype D.22896;
  char * D.22897;
  long int D.22898;
  long int D.22899;
  int D.22900;
  long unsigned int D.22906;
  long int D.22907;
  long unsigned int D.22908;
  long unsigned int D.22909;
  void * D.22912;
  char * D.22915;
  char * D.22917;
  long unsigned int D.22918;
  long unsigned int D.22919;
  long unsigned int D.22920;
  int iftmp.162;
  struct GrayQueueSection * D.22927;
  int D.22929;
  _Bool D.22930;
  long int D.22931;
  long int D.22932;
  int D.22936;
  int D.22937;
  int i;
  int last_index;

  last_index = -1;
  D.22873 = block->pin_queue_num_entries;
  if (D.22873 == 0) goto <D.22874>; else goto <D.22875>;
  <D.22874>:
  return;
  <D.22875>:
  block->has_pinned = 1;
  i = 0;
  goto <D.20324>;
  <D.20323>:
  {
    int index;

    D.22876 = block->pin_queue_start;
    D.22877 = (long unsigned int) i;
    D.22878 = D.22877 * 8;
    D.22879 = D.22876 + D.22878;
    D.22880 = *D.22879;
    D.22881 = (long int) D.22880;
    D.22882 = block->block;
    D.22883 = D.22882 + 16;
    D.22884 = (long int) D.22883;
    D.22885 = D.22881 - D.22884;
    D.22886 = block->obj_size;
    D.22887 = (long int) D.22886;
    D.22888 = D.22885 / D.22887;
    index = (int) D.22888;
    if (0 != 0) goto <D.22889>; else goto <D.22890>;
    <D.22889>:
    D.22876 = block->pin_queue_start;
    D.22877 = (long unsigned int) i;
    D.22878 = D.22877 * 8;
    D.22879 = D.22876 + D.22878;
    D.22880 = *D.22879;
    D.22886 = block->obj_size;
    D.22891 = 16368 / D.22886;
    monoeg_g_log (0B, 4, "invalid object %p index %d max-index %d", D.22880, index, D.22891);
    <D.20318>:
    goto <D.20318>;
    <D.22890>:
    if (index == last_index) goto <D.22892>; else goto <D.22893>;
    <D.22892>:
    // predicted unlikely by continue predictor.
    goto <D.20319>;
    <D.22893>:
    {
      int __word;
      int __bit;

      {
        int i;

        D.22882 = block->block;
        D.22886 = block->obj_size;
        D.22894 = D.22886 * index;
        D.22895 = (sizetype) D.22894;
        D.22896 = D.22895 + 16;
        D.22897 = D.22882 + D.22896;
        D.22898 = (long int) D.22897;
        D.22899 = D.22898 >> 3;
        D.22900 = (int) D.22899;
        i = D.22900 & 2047;
        if (0 != 0) goto <D.22901>; else goto <D.22902>;
        <D.22901>:
        __word = i >> 5;
        __bit = i & 31;
        goto <D.22903>;
        <D.22902>:
        __word = i >> 6;
        __bit = i & 63;
        <D.22903>:
      }
      D.22906 = block->mark_words[__word];
      D.22907 = 1 << __bit;
      D.22908 = (long unsigned int) D.22907;
      D.22909 = D.22906 & D.22908;
      if (D.22909 == 0) goto <D.22910>; else goto <D.22911>;
      <D.22910>:
      D.22882 = block->block;
      D.22886 = block->obj_size;
      D.22894 = D.22886 * index;
      D.22895 = (sizetype) D.22894;
      D.22896 = D.22895 + 16;
      D.22897 = D.22882 + D.22896;
      D.22912 = MEM[(void * *)D.22897];
      if (D.22912 != 0B) goto <D.22913>; else goto <D.22914>;
      <D.22913>:
      D.22882 = block->block;
      D.22886 = block->obj_size;
      D.22894 = D.22886 * index;
      D.22895 = (sizetype) D.22894;
      D.22896 = D.22895 + 16;
      D.22897 = D.22882 + D.22896;
      D.22915 = MEM[(char * *)D.22897];
      D.22882 = block->block;
      if (D.22915 < D.22882) goto <D.22904>; else goto <D.22916>;
      <D.22916>:
      D.22882 = block->block;
      D.22886 = block->obj_size;
      D.22894 = D.22886 * index;
      D.22895 = (sizetype) D.22894;
      D.22896 = D.22895 + 16;
      D.22897 = D.22882 + D.22896;
      D.22915 = MEM[(char * *)D.22897];
      D.22882 = block->block;
      D.22917 = D.22882 + 16384;
      if (D.22915 >= D.22917) goto <D.22904>; else goto <D.22905>;
      <D.22904>:
      D.22906 = block->mark_words[__word];
      D.22907 = 1 << __bit;
      D.22908 = (long unsigned int) D.22907;
      D.22918 = D.22906 | D.22908;
      block->mark_words[__word] = D.22918;
      D.22919 = BIT_FIELD_REF <*block, 64, 64>;
      D.22920 = D.22919 & 1073741824;
      if (D.22920 != 0) goto <D.22921>; else goto <D.22922>;
      <D.22921>:
      D.22927 = queue->first;
      if (D.22927 == 0B) goto <D.22924>; else goto <D.22928>;
      <D.22928>:
      D.22927 = queue->first;
      D.22929 = D.22927->end;
      if (D.22929 == 125) goto <D.22924>; else goto <D.22925>;
      <D.22924>:
      iftmp.162 = 1;
      goto <D.22926>;
      <D.22925>:
      iftmp.162 = 0;
      <D.22926>:
      D.22930 = iftmp.162 != 0;
      D.22931 = (long int) D.22930;
      D.22932 = __builtin_expect (D.22931, 0);
      if (D.22932 != 0) goto <D.22933>; else goto <D.22934>;
      <D.22933>:
      D.22882 = block->block;
      D.22886 = block->obj_size;
      D.22894 = D.22886 * index;
      D.22895 = (sizetype) D.22894;
      D.22896 = D.22895 + 16;
      D.22897 = D.22882 + D.22896;
      sgen_gray_object_enqueue (queue, D.22897);
      goto <D.22935>;
      <D.22934>:
      D.22927 = queue->first;
      D.22927 = queue->first;
      D.22929 = D.22927->end;
      D.22936 = D.22929;
      D.22937 = D.22936 + 1;
      D.22927->end = D.22937;
      D.22882 = block->block;
      D.22886 = block->obj_size;
      D.22894 = D.22886 * index;
      D.22895 = (sizetype) D.22894;
      D.22896 = D.22895 + 16;
      D.22897 = D.22882 + D.22896;
      D.22927->objects[D.22936] = D.22897;
      <D.22935>:
      D.22882 = block->block;
      D.22886 = block->obj_size;
      D.22894 = D.22886 * index;
      D.22895 = (sizetype) D.22894;
      D.22896 = D.22895 + 16;
      D.22897 = D.22882 + D.22896;
      __builtin_prefetch (D.22897);
      <D.22922>:
      <D.22905>:
      <D.22914>:
      <D.22911>:
    }
    last_index = index;
  }
  <D.20319>:
  i = i + 1;
  <D.20324>:
  D.22873 = block->pin_queue_num_entries;
  if (D.22873 > i) goto <D.20323>; else goto <D.20325>;
  <D.20325>:
}


major_find_pin_queue_start_ends (struct SgenGrayQueue * queue)
{
  char * D.22939;
  char * D.22940;
  char * D.22941;
  int * D.22942;
  void * * D.22943;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.20468>;
  <D.20467>:
  D.22939 = block->block;
  D.22940 = D.22939 + 16;
  D.22939 = block->block;
  D.22941 = D.22939 + 16384;
  D.22942 = &block->pin_queue_num_entries;
  D.22943 = sgen_find_optimized_pin_queue_area (D.22940, D.22941, D.22942);
  block->pin_queue_start = D.22943;
  block = block->next;
  <D.20468>:
  if (block != 0B) goto <D.20467>; else goto <D.20469>;
  <D.20469>:
}


major_free_non_pinned_object (char * obj, size_t size)
{
  free_object (obj, size, 0);
}


free_object (char * obj, size_t size, gboolean pinned)
{
  long unsigned int obj.163;
  long unsigned int D.22945;
  struct MSBlockHeader * D.22946;
  long unsigned int D.22947;
  long unsigned int D.22948;
  <unnamed-unsigned:1> D.22953;
  int D.22954;
  long int obj.164;
  long int D.22958;
  int D.22959;
  void * * D.22965;
  _Bool D.22968;
  int D.22969;
  int iftmp.165;
  long unsigned int D.22971;
  int D.22975;
  int iftmp.166;
  long unsigned int D.22977;
  long unsigned int D.22978;
  int D.22982;
  long unsigned int D.22985;
  long unsigned int D.22986;
  struct MSBlockInfo * * D.22987;
  struct MSBlockInfo * D.22988;
  struct MSBlockInfo * block;
  int word;
  int bit;

  obj.163 = (long unsigned int) obj;
  D.22945 = obj.163 & 18446744073709535232;
  D.22946 = (struct MSBlockHeader *) D.22945;
  block = D.22946->info;
  D.22947 = BIT_FIELD_REF <*block, 64, 64>;
  D.22948 = D.22947 & 134217728;
  if (D.22948 == 0) goto <D.22949>; else goto <D.22950>;
  <D.22949>:
  sweep_block (block, 0);
  <D.22950>:
  if (0 != 0) goto <D.22951>; else goto <D.22952>;
  <D.22951>:
  D.22953 = block->pinned;
  D.22954 = (int) D.22953;
  monoeg_g_log (0B, 4, "free-object pinning mixup object %p pinned %d block %p pinned %d", obj, pinned, block, D.22954);
  <D.19777>:
  goto <D.19777>;
  <D.22952>:
  if (0 != 0) goto <D.22955>; else goto <D.22956>;
  <D.22955>:
  monoeg_g_log (0B, 4, "object %p is already free", obj);
  <D.19778>:
  goto <D.19778>;
  <D.22956>:
  {
    int i;

    obj.164 = (long int) obj;
    D.22958 = obj.164 >> 3;
    D.22959 = (int) D.22958;
    i = D.22959 & 2047;
    if (0 != 0) goto <D.22960>; else goto <D.22961>;
    <D.22960>:
    word = i >> 5;
    bit = i & 31;
    goto <D.22962>;
    <D.22961>:
    word = i >> 6;
    bit = i & 63;
    <D.22962>:
  }
  if (0 != 0) goto <D.22963>; else goto <D.22964>;
  <D.22963>:
  monoeg_g_log (0B, 4, "object %p has mark bit set");
  <D.19780>:
  goto <D.19780>;
  <D.22964>:
  D.22965 = block->free_list;
  if (D.22965 == 0B) goto <D.22966>; else goto <D.22967>;
  <D.22966>:
  {
    struct MSBlockInfo * * free_blocks;
    int size_index;

    D.22968 = pinned != 0;
    D.22969 = (int) D.22968;
    D.22947 = BIT_FIELD_REF <*block, 64, 64>;
    D.22971 = D.22947 & 1073741824;
    if (D.22971 != 0) goto <D.22972>; else goto <D.22973>;
    <D.22972>:
    iftmp.165 = 2;
    goto <D.22974>;
    <D.22973>:
    iftmp.165 = 0;
    <D.22974>:
    D.22975 = D.22969 | iftmp.165;
    free_blocks = free_block_lists[D.22975];
    D.22977 = size + 7;
    D.22978 = D.22977 >> 3;
    if (D.22978 <= 31) goto <D.22979>; else goto <D.22980>;
    <D.22979>:
    D.22977 = size + 7;
    D.22978 = D.22977 >> 3;
    iftmp.166 = fast_block_obj_size_indexes[D.22978];
    goto <D.22981>;
    <D.22980>:
    D.22982 = (int) size;
    iftmp.166 = ms_find_block_obj_size_index (D.22982);
    <D.22981>:
    size_index = iftmp.166;
    if (0 != 0) goto <D.22983>; else goto <D.22984>;
    <D.22983>:
    monoeg_g_log (0B, 4, "block %p doesn\'t have a free-list of object but belongs to a free-list of blocks");
    <D.19783>:
    goto <D.19783>;
    <D.22984>:
    D.22985 = (long unsigned int) size_index;
    D.22986 = D.22985 * 8;
    D.22987 = free_blocks + D.22986;
    D.22988 = *D.22987;
    block->next_free = D.22988;
    D.22985 = (long unsigned int) size_index;
    D.22986 = D.22985 * 8;
    D.22987 = free_blocks + D.22986;
    *D.22987 = block;
  }
  <D.22967>:
  memset (obj, 0, size);
  D.22965 = block->free_list;
  MEM[(void * *)obj] = D.22965;
  block->free_list = obj;
}


major_iterate_objects (gboolean non_pinned, gboolean pinned, void (*IterateObjectCallbackFunc) (char *, size_t, void *) callback, void * data)
{
  int D.22989;
  long unsigned int D.22990;
  long unsigned int D.22991;
  int lazy_sweep.167;
  char * D.23003;
  int D.23004;
  sizetype D.23005;
  sizetype D.23006;
  void * D.23009;
  char * D.23012;
  char * D.23014;
  long unsigned int D.23015;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.19841>;
  <D.19840>:
  {
    int count;
    int i;

    D.22989 = block->obj_size;
    count = 16368 / D.22989;
    D.22990 = BIT_FIELD_REF <*block, 64, 64>;
    D.22991 = D.22990 & 2147483648;
    if (D.22991 != 0) goto <D.22992>; else goto <D.22993>;
    <D.22992>:
    if (pinned == 0) goto <D.22994>; else goto <D.22995>;
    <D.22994>:
    // predicted unlikely by continue predictor.
    goto <D.19835>;
    <D.22995>:
    <D.22993>:
    D.22990 = BIT_FIELD_REF <*block, 64, 64>;
    D.22991 = D.22990 & 2147483648;
    if (D.22991 == 0) goto <D.22996>; else goto <D.22997>;
    <D.22996>:
    if (non_pinned == 0) goto <D.22998>; else goto <D.22999>;
    <D.22998>:
    // predicted unlikely by continue predictor.
    goto <D.19835>;
    <D.22999>:
    <D.22997>:
    lazy_sweep.167 = lazy_sweep;
    if (lazy_sweep.167 != 0) goto <D.23001>; else goto <D.23002>;
    <D.23001>:
    sweep_block (block, 0);
    <D.23002>:
    i = 0;
    goto <D.19838>;
    <D.19837>:
    {
      void * * obj;

      D.23003 = block->block;
      D.22989 = block->obj_size;
      D.23004 = D.22989 * i;
      D.23005 = (sizetype) D.23004;
      D.23006 = D.23005 + 16;
      obj = D.23003 + D.23006;
      D.23009 = *obj;
      if (D.23009 != 0B) goto <D.23010>; else goto <D.23011>;
      <D.23010>:
      D.23012 = MEM[(char * *)obj];
      D.23003 = block->block;
      if (D.23012 < D.23003) goto <D.23007>; else goto <D.23013>;
      <D.23013>:
      D.23012 = MEM[(char * *)obj];
      D.23003 = block->block;
      D.23014 = D.23003 + 16384;
      if (D.23012 >= D.23014) goto <D.23007>; else goto <D.23008>;
      <D.23007>:
      D.22989 = block->obj_size;
      D.23015 = (long unsigned int) D.22989;
      callback (obj, D.23015, data);
      <D.23008>:
      <D.23011>:
    }
    i = i + 1;
    <D.19838>:
    if (i < count) goto <D.19837>; else goto <D.19839>;
    <D.19839>:
  }
  <D.19835>:
  block = block->next;
  <D.19841>:
  if (block != 0B) goto <D.19840>; else goto <D.19842>;
  <D.19842>:
}


free_pinned_object (char * obj, size_t size)
{
  free_object (obj, size, 1);
}


major_alloc_object (struct MonoVTable * vtable, int size, gboolean has_references)
{
  void * D.23016;

  D.23016 = alloc_obj (vtable, size, 0, has_references);
  return D.23016;
}


alloc_obj (struct MonoVTable * vtable, int size, gboolean pinned, gboolean has_references)
{
  int iftmp.168;
  int D.23019;
  int D.23020;
  _Bool D.23024;
  int D.23025;
  int iftmp.169;
  int D.23030;
  long unsigned int D.23031;
  long unsigned int D.23032;
  struct MSBlockInfo * * D.23033;
  struct MSBlockInfo * D.23034;
  int D.23037;
  _Bool D.23038;
  long int D.23039;
  long int D.23040;
  void * D.23043;
  int size_index;
  struct MSBlockInfo * * free_blocks;
  void * obj;

  D.23019 = size + 7;
  D.23020 = D.23019 >> 3;
  if (D.23020 <= 31) goto <D.23021>; else goto <D.23022>;
  <D.23021>:
  D.23019 = size + 7;
  D.23020 = D.23019 >> 3;
  iftmp.168 = fast_block_obj_size_indexes[D.23020];
  goto <D.23023>;
  <D.23022>:
  iftmp.168 = ms_find_block_obj_size_index (size);
  <D.23023>:
  size_index = iftmp.168;
  D.23024 = pinned != 0;
  D.23025 = (int) D.23024;
  if (has_references != 0) goto <D.23027>; else goto <D.23028>;
  <D.23027>:
  iftmp.169 = 2;
  goto <D.23029>;
  <D.23028>:
  iftmp.169 = 0;
  <D.23029>:
  D.23030 = D.23025 | iftmp.169;
  free_blocks = free_block_lists[D.23030];
  D.23031 = (long unsigned int) size_index;
  D.23032 = D.23031 * 8;
  D.23033 = free_blocks + D.23032;
  D.23034 = *D.23033;
  if (D.23034 == 0B) goto <D.23035>; else goto <D.23036>;
  <D.23035>:
  D.23037 = ms_alloc_block (size_index, pinned, has_references);
  D.23038 = D.23037 == 0;
  D.23039 = (long int) D.23038;
  D.23040 = __builtin_expect (D.23039, 0);
  if (D.23040 != 0) goto <D.23041>; else goto <D.23042>;
  <D.23041>:
  D.23043 = 0B;
  return D.23043;
  <D.23042>:
  <D.23036>:
  obj = unlink_slot_from_free_list_uncontested (free_blocks, size_index);
  MEM[(struct MonoVTable * *)obj] = vtable;
  D.23043 = obj;
  return D.23043;
}


ms_alloc_block (int size_index, gboolean pinned, gboolean has_references)
{
  int * block_obj_sizes.170;
  long unsigned int D.23046;
  long unsigned int D.23047;
  int * D.23048;
  _Bool D.23049;
  int D.23050;
  int iftmp.171;
  int D.23055;
  int D.23056;
  gboolean D.23059;
  unsigned char D.23062;
  <unnamed-unsigned:1> D.23063;
  unsigned char D.23064;
  <unnamed-unsigned:1> D.23065;
  int D.23066;
  _Bool D.23067;
  void * D.23068;
  char * D.23069;
  sizetype D.23070;
  int D.23071;
  long unsigned int D.23072;
  struct MSBlockInfo * * D.23073;
  struct MSBlockInfo * D.23074;
  struct MSBlockInfo * all_blocks.172;
  int num_major_sections.173;
  int D.23077;
  int size;
  int count;
  struct MSBlockInfo * info;
  struct MSBlockHeader * header;
  struct MSBlockInfo * * free_blocks;
  char * obj_start;
  int i;

  block_obj_sizes.170 = block_obj_sizes;
  D.23046 = (long unsigned int) size_index;
  D.23047 = D.23046 * 4;
  D.23048 = block_obj_sizes.170 + D.23047;
  size = *D.23048;
  count = 16368 / size;
  D.23049 = pinned != 0;
  D.23050 = (int) D.23049;
  if (has_references != 0) goto <D.23052>; else goto <D.23053>;
  <D.23052>:
  iftmp.171 = 2;
  goto <D.23054>;
  <D.23053>:
  iftmp.171 = 0;
  <D.23054>:
  D.23055 = D.23050 | iftmp.171;
  free_blocks = free_block_lists[D.23055];
  D.23056 = sgen_memgov_try_alloc_space (16384, 1);
  if (D.23056 == 0) goto <D.23057>; else goto <D.23058>;
  <D.23057>:
  D.23059 = 0;
  return D.23059;
  <D.23058>:
  info = sgen_alloc_internal (16);
  if (0 != 0) goto <D.23060>; else goto <D.23061>;
  <D.23060>:
  monoeg_g_log (0B, 4, "block with %d objects, it must hold at least 2", count);
  <D.19735>:
  goto <D.19735>;
  <D.23061>:
  info->obj_size = size;
  info->obj_size_index = size_index;
  D.23062 = (unsigned char) pinned;
  D.23063 = (<unnamed-unsigned:1>) D.23062;
  info->pinned = D.23063;
  D.23064 = (unsigned char) has_references;
  D.23065 = (<unnamed-unsigned:1>) D.23064;
  info->has_references = D.23065;
  D.23062 = (unsigned char) pinned;
  D.23063 = (<unnamed-unsigned:1>) D.23062;
  info->has_pinned = D.23063;
  D.23066 = sgen_get_current_collection_generation ();
  D.23067 = D.23066 == 1;
  info->is_to_space = D.23067;
  info->swept = 1;
  D.23068 = ms_get_empty_block ();
  info->block = D.23068;
  header = info->block;
  header->info = info;
  info->cardtable_mod_union = 0B;
  update_heap_boundaries_for_block (info);
  D.23069 = info->block;
  obj_start = D.23069 + 16;
  info->free_list = obj_start;
  i = 0;
  goto <D.19738>;
  <D.19737>:
  {
    char * next_obj_start;

    D.23070 = (sizetype) size;
    next_obj_start = obj_start + D.23070;
    MEM[(void * *)obj_start] = next_obj_start;
    obj_start = next_obj_start;
  }
  i = i + 1;
  <D.19738>:
  D.23071 = count + -1;
  if (D.23071 > i) goto <D.19737>; else goto <D.19739>;
  <D.19739>:
  MEM[(void * *)obj_start] = 0B;
  D.23046 = (long unsigned int) size_index;
  D.23072 = D.23046 * 8;
  D.23073 = free_blocks + D.23072;
  D.23074 = *D.23073;
  info->next_free = D.23074;
  D.23046 = (long unsigned int) size_index;
  D.23072 = D.23046 * 8;
  D.23073 = free_blocks + D.23072;
  *D.23073 = info;
  all_blocks.172 = all_blocks;
  info->next = all_blocks.172;
  all_blocks = info;
  num_major_sections.173 = num_major_sections;
  D.23077 = num_major_sections.173 + 1;
  num_major_sections = D.23077;
  D.23059 = 1;
  return D.23059;
}


ms_get_empty_block ()
{
  void * empty_blocks.174;
  int D.23082;
  long unsigned int D.23083;
  const char * iftmp.175;
  void * D.23089;
  int D.23090;
  int D.23091;
  long long int D.23092;
  long long int stat_major_blocks_alloced.176;
  long long int D.23094;
  void * D.23096;
  int D.23097;
  int D.23098;
  long unsigned int block.177;
  long unsigned int D.23100;
  _Bool D.23101;
  long int D.23102;
  long int D.23103;
  void * D.23106;
  char * p;
  int i;
  void * block;
  void * empty;
  void * next;
  void retry = <<< error >>>;

  retry:
  empty_blocks.174 = empty_blocks;
  if (empty_blocks.174 == 0B) goto <D.23080>; else goto <D.23081>;
  <D.23080>:
  {
    int alloc_num;

    alloc_num = 32;
    <D.19700>:
    D.23082 = alloc_num * 16384;
    D.23083 = (long unsigned int) D.23082;
    if (alloc_num == 1) goto <D.23085>; else goto <D.23086>;
    <D.23085>:
    iftmp.175 = "major heap section";
    goto <D.23087>;
    <D.23086>:
    iftmp.175 = 0B;
    <D.23087>:
    p = sgen_alloc_os_memory_aligned (D.23083, 16384, 3, iftmp.175);
    if (p != 0B) goto <D.19699>; else goto <D.23088>;
    <D.23088>:
    alloc_num = alloc_num >> 1;
    goto <D.19700>;
    <D.19699>:
    i = 0;
    goto <D.19704>;
    <D.19703>:
    block = p;
    <D.19701>:
    empty = empty_blocks;
    MEM[(void * *)block] = empty;
    D.23089 = InterlockedCompareExchangePointer (&empty_blocks, block, empty);
    if (D.23089 != empty) goto <D.19701>; else goto <D.19702>;
    <D.19702>:
    p = p + 16384;
    i = i + 1;
    <D.19704>:
    if (i < alloc_num) goto <D.19703>; else goto <D.19705>;
    <D.19705>:
    {
      int __old_x;

      <D.19707>:
      __old_x = num_empty_blocks;
      D.23090 = __old_x + alloc_num;
      D.23091 = InterlockedCompareExchange (&num_empty_blocks, D.23090, __old_x);
      if (D.23091 != __old_x) goto <D.19707>; else goto <D.19708>;
      <D.19708>:
    }
    D.23092 = (long long int) alloc_num;
    stat_major_blocks_alloced.176 = stat_major_blocks_alloced;
    D.23094 = D.23092 + stat_major_blocks_alloced.176;
    stat_major_blocks_alloced = D.23094;
  }
  <D.23081>:
  <D.19709>:
  empty = empty_blocks;
  if (empty == 0B) goto retry; else goto <D.23095>;
  <D.23095>:
  block = empty;
  next = MEM[(void * *)block];
  D.23096 = InterlockedCompareExchangePointer (&empty_blocks, next, empty);
  if (D.23096 != empty) goto <D.19709>; else goto <D.19710>;
  <D.19710>:
  {
    int __old_x;

    <D.19712>:
    __old_x = num_empty_blocks;
    D.23097 = __old_x + -1;
    D.23098 = InterlockedCompareExchange (&num_empty_blocks, D.23097, __old_x);
    if (D.23098 != __old_x) goto <D.19712>; else goto <D.19713>;
    <D.19713>:
  }
  MEM[(void * *)block] = 0B;
  block.177 = (long unsigned int) block;
  D.23100 = block.177 & 16383;
  D.23101 = D.23100 != 0;
  D.23102 = (long int) D.23101;
  D.23103 = __builtin_expect (D.23102, 0);
  if (D.23103 != 0) goto <D.23104>; else goto <D.23105>;
  <D.23104>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 421, "!((mword)block & (MS_BLOCK_SIZE - 1))");
  <D.23105>:
  D.23106 = block;
  return D.23106;
}


unlink_slot_from_free_list_uncontested (struct MSBlockInfo * * free_blocks, int size_index)
{
  long unsigned int D.23108;
  long unsigned int D.23109;
  struct MSBlockInfo * * D.23110;
  long unsigned int D.23113;
  long unsigned int D.23114;
  _Bool D.23115;
  long int D.23116;
  long int D.23117;
  long long int stat_major_blocks_lazy_swept.178;
  long long int D.23121;
  void * D.23124;
  void * * D.23125;
  struct MSBlockInfo * D.23128;
  void * D.23129;
  struct MSBlockInfo * block;
  void * obj;

  D.23108 = (long unsigned int) size_index;
  D.23109 = D.23108 * 8;
  D.23110 = free_blocks + D.23109;
  block = *D.23110;
  if (0 != 0) goto <D.23111>; else goto <D.23112>;
  <D.23111>:
  monoeg_g_log (0B, 4, "no free block to unlink from free_blocks %p size_index %d", free_blocks, size_index);
  <D.19753>:
  goto <D.19753>;
  <D.23112>:
  D.23113 = BIT_FIELD_REF <*block, 64, 64>;
  D.23114 = D.23113 & 134217728;
  D.23115 = D.23114 == 0;
  D.23116 = (long int) D.23115;
  D.23117 = __builtin_expect (D.23116, 0);
  if (D.23117 != 0) goto <D.23118>; else goto <D.23119>;
  <D.23118>:
  stat_major_blocks_lazy_swept.178 = stat_major_blocks_lazy_swept;
  D.23121 = stat_major_blocks_lazy_swept.178 + 1;
  stat_major_blocks_lazy_swept = D.23121;
  sweep_block (block, 0);
  <D.23119>:
  obj = block->free_list;
  if (0 != 0) goto <D.23122>; else goto <D.23123>;
  <D.23122>:
  monoeg_g_log (0B, 4, "block %p in free list had no available object to alloc from", block);
  <D.19754>:
  goto <D.19754>;
  <D.23123>:
  D.23124 = MEM[(void * *)obj];
  block->free_list = D.23124;
  D.23125 = block->free_list;
  if (D.23125 == 0B) goto <D.23126>; else goto <D.23127>;
  <D.23126>:
  D.23108 = (long unsigned int) size_index;
  D.23109 = D.23108 * 8;
  D.23110 = free_blocks + D.23109;
  D.23128 = block->next_free;
  *D.23110 = D.23128;
  block->next_free = 0B;
  <D.23127>:
  D.23129 = obj;
  return D.23129;
}


major_alloc_degraded (struct MonoVTable * vtable, size_t size)
{
  int D.23131;
  void * D.23132;
  long unsigned int D.23133;
  int D.23134;
  _Bool D.23135;
  long int D.23136;
  long int D.23137;
  int num_major_sections.179;
  _Bool D.23141;
  long int D.23142;
  long int D.23143;
  int D.23146;
  void * D.23147;
  void * obj;
  int old_num_sections;

  old_num_sections = num_major_sections;
  D.23131 = (int) size;
  D.23132 = vtable->gc_descr;
  D.23133 = (long unsigned int) D.23132;
  D.23134 = sgen_gc_descr_has_references (D.23133);
  obj = alloc_obj (vtable, D.23131, 0, D.23134);
  D.23135 = obj != 0B;
  D.23136 = (long int) D.23135;
  D.23137 = __builtin_expect (D.23136, 1);
  if (D.23137 != 0) goto <D.23138>; else goto <D.23139>;
  <D.23138>:
  num_major_sections.179 = num_major_sections;
  D.23141 = num_major_sections.179 < old_num_sections;
  D.23142 = (long int) D.23141;
  D.23143 = __builtin_expect (D.23142, 0);
  if (D.23143 != 0) goto <D.23144>; else goto <D.23145>;
  <D.23144>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 842, "num_major_sections >= old_num_sections");
  <D.23145>:
  num_major_sections.179 = num_major_sections;
  D.23146 = num_major_sections.179 - old_num_sections;
  sgen_register_major_sections_alloced (D.23146);
  <D.23139>:
  D.23147 = obj;
  return D.23147;
}


major_alloc_small_pinned_obj (struct MonoVTable * vtable, size_t size, gboolean has_references)
{
  int D.23149;
  void * D.23152;
  void * res;

  D.23149 = (int) size;
  res = alloc_obj (vtable, D.23149, 1, has_references);
  if (res == 0B) goto <D.23150>; else goto <D.23151>;
  <D.23150>:
  sgen_perform_collection (0, 1, "pinned alloc failure", 1);
  D.23149 = (int) size;
  res = alloc_obj (vtable, D.23149, 1, has_references);
  <D.23151>:
  D.23152 = res;
  return D.23152;
}


major_is_object_live (char * obj)
{
  int D.23154;
  gboolean D.23157;
  unsigned int D.23158;
  unsigned int D.23159;
  long unsigned int D.23160;
  long unsigned int obj.180;
  long unsigned int D.23164;
  struct MSBlockHeader * D.23165;
  long int obj.181;
  long int D.23169;
  int D.23170;
  long unsigned int D.23174;
  long int D.23175;
  long unsigned int D.23176;
  long unsigned int D.23177;
  _Bool D.23178;
  struct MSBlockInfo * block;
  int word;
  int bit;
  mword objsize;

  D.23154 = sgen_ptr_in_nursery (obj);
  if (D.23154 != 0) goto <D.23155>; else goto <D.23156>;
  <D.23155>:
  D.23157 = 0;
  return D.23157;
  <D.23156>:
  D.23158 = sgen_safe_object_get_size (obj);
  D.23159 = D.23158 + 7;
  D.23160 = (long unsigned int) D.23159;
  objsize = D.23160 & 4294967288;
  if (objsize > 8000) goto <D.23161>; else goto <D.23162>;
  <D.23161>:
  D.23157 = 0;
  return D.23157;
  <D.23162>:
  obj.180 = (long unsigned int) obj;
  D.23164 = obj.180 & 18446744073709535232;
  D.23165 = (struct MSBlockHeader *) D.23164;
  block = D.23165->info;
  if (0 != 0) goto <D.23166>; else goto <D.23167>;
  <D.23166>:
  monoeg_g_log (0B, 4, "block %p is pinned, BTW why is this bad?");
  <D.19811>:
  goto <D.19811>;
  <D.23167>:
  {
    int i;

    obj.181 = (long int) obj;
    D.23169 = obj.181 >> 3;
    D.23170 = (int) D.23169;
    i = D.23170 & 2047;
    if (0 != 0) goto <D.23171>; else goto <D.23172>;
    <D.23171>:
    word = i >> 5;
    bit = i & 31;
    goto <D.23173>;
    <D.23172>:
    word = i >> 6;
    bit = i & 63;
    <D.23173>:
  }
  D.23174 = block->mark_words[word];
  D.23175 = 1 << bit;
  D.23176 = (long unsigned int) D.23175;
  D.23177 = D.23174 & D.23176;
  D.23178 = D.23177 != 0;
  D.23157 = (gboolean) D.23178;
  return D.23157;
}


major_alloc_heap (mword nursery_size, mword nursery_align, int the_nursery_bits)
{
  void * D.23183;
  char * start;

  if (nursery_align != 0) goto <D.23180>; else goto <D.23181>;
  <D.23180>:
  start = sgen_alloc_os_memory_aligned (nursery_size, nursery_align, 3, "nursery");
  goto <D.23182>;
  <D.23181>:
  start = sgen_alloc_os_memory (nursery_size, 3, "nursery");
  <D.23182>:
  D.23183 = start;
  return D.23183;
}


major_get_and_reset_num_major_objects_marked ()
{
  long long int D.23185;

  D.23185 = 0;
  return D.23185;
}


ms_calculate_block_obj_sizes (double factor, int * arr)
{
  double D.23187;
  double D.23188;
  int D.23189;
  int D.23190;
  long unsigned int D.23195;
  long unsigned int D.23196;
  int * D.23197;
  int D.23198;
  double target_size;
  int num_sizes;
  int last_size;

  target_size = 1.6e+1;
  num_sizes = 0;
  last_size = 0;
  <D.20430>:
  {
    int target_count;
    int size;

    D.23187 = 1.6368e+4 / target_size;
    D.23188 = ceil (D.23187);
    target_count = (int) D.23188;
    D.23189 = 16368 / target_count;
    D.23190 = D.23189 & -8;
    size = MIN_EXPR <D.23190, 8000>;
    if (size != last_size) goto <D.23191>; else goto <D.23192>;
    <D.23191>:
    if (arr != 0B) goto <D.23193>; else goto <D.23194>;
    <D.23193>:
    D.23195 = (long unsigned int) num_sizes;
    D.23196 = D.23195 * 4;
    D.23197 = arr + D.23196;
    *D.23197 = size;
    <D.23194>:
    num_sizes = num_sizes + 1;
    last_size = size;
    <D.23192>:
    target_size = target_size * factor;
  }
  if (last_size <= 7999) goto <D.20430>; else goto <D.20431>;
  <D.20431>:
  D.23198 = num_sizes;
  return D.23198;
}


alloc_free_block_lists (struct MSBlockInfo * * * lists)
{
  long unsigned int D.23200;
  long unsigned int D.23201;
  struct MSBlockInfo * * * D.23202;
  int num_block_obj_sizes.182;
  long unsigned int D.23204;
  long unsigned int D.23205;
  void * D.23206;
  int i;

  i = 0;
  goto <D.20592>;
  <D.20591>:
  D.23200 = (long unsigned int) i;
  D.23201 = D.23200 * 8;
  D.23202 = lists + D.23201;
  num_block_obj_sizes.182 = num_block_obj_sizes;
  D.23204 = (long unsigned int) num_block_obj_sizes.182;
  D.23205 = D.23204 * 8;
  D.23206 = sgen_alloc_internal_dynamic (D.23205, 15, 1);
  *D.23202 = D.23206;
  i = i + 1;
  <D.20592>:
  if (i <= 3) goto <D.20591>; else goto <D.20593>;
  <D.20593>:
}


ms_find_block_obj_size_index (int size)
{
  int * block_obj_sizes.183;
  long unsigned int D.23210;
  long unsigned int D.23211;
  int * D.23212;
  int D.23213;
  int D.23216;
  int num_block_obj_sizes.184;
  int i;

  if (0 != 0) goto <D.23207>; else goto <D.23208>;
  <D.23207>:
  monoeg_g_log (0B, 4, "size %d is bigger than max small object size %d", size, 8000);
  <D.19675>:
  goto <D.19675>;
  <D.23208>:
  i = 0;
  goto <D.19677>;
  <D.19676>:
  block_obj_sizes.183 = block_obj_sizes;
  D.23210 = (long unsigned int) i;
  D.23211 = D.23210 * 4;
  D.23212 = block_obj_sizes.183 + D.23211;
  D.23213 = *D.23212;
  if (D.23213 >= size) goto <D.23214>; else goto <D.23215>;
  <D.23214>:
  D.23216 = i;
  return D.23216;
  <D.23215>:
  i = i + 1;
  <D.19677>:
  num_block_obj_sizes.184 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.184) goto <D.19676>; else goto <D.19678>;
  <D.19678>:
  monoeg_g_log (0B, 4, "no object of size %d\n", size);
  <D.19679>:
  goto <D.19679>;
}


__attribute__((visibility ("hidden")))
sgen_marksweep_conc_init (struct SgenMajorCollector * collector)
{
  sgen_marksweep_init_internal (collector, 1);
}


